From 456c05855ef1c5815e2b0a3cd7a281d87181ce5a Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 14 Feb 2021 11:10:22 +0100 Subject: [PATCH] #2445 --- NETGenerator/NETGenerator.cs | 18 +++++++++++++++++- TestSuite/nil3.pas | 14 ++++++++++++++ TestSuite/nil4.pas | 14 ++++++++++++++ TestSuite/nil5.pas | 14 ++++++++++++++ TestSuite/nil6.pas | 14 ++++++++++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 TestSuite/nil3.pas create mode 100644 TestSuite/nil4.pas create mode 100644 TestSuite/nil5.pas create mode 100644 TestSuite/nil6.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 348d9763c..2bd0c4224 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -8932,7 +8932,7 @@ namespace PascalABCCompiler.NETGenerator il.Emit(OpCodes.Ldc_I4_0); il.Emit(OpCodes.Ceq); } - + return; } else if (real_parameters[1].type.is_nullable_type && real_parameters[0] is INullConstantNode) @@ -8984,6 +8984,22 @@ namespace PascalABCCompiler.NETGenerator } return; } + else if (real_parameters[0].type.is_generic_parameter && real_parameters[1] is INullConstantNode) + { + real_parameters[0].visit(this); + il.Emit(OpCodes.Box, helper.GetTypeReference(real_parameters[0].type).tp); + il.Emit(OpCodes.Ldnull); + EmitOperator(value); + return; + } + else if (real_parameters[1].type.is_generic_parameter && real_parameters[0] is INullConstantNode) + { + il.Emit(OpCodes.Ldnull); + real_parameters[1].visit(this); + il.Emit(OpCodes.Box, helper.GetTypeReference(real_parameters[1].type).tp); + EmitOperator(value); + return; + } } real_parameters[0].visit(this); if (real_parameters.Length > 1) diff --git a/TestSuite/nil3.pas b/TestSuite/nil3.pas new file mode 100644 index 000000000..c77f52fe1 --- /dev/null +++ b/TestSuite/nil3.pas @@ -0,0 +1,14 @@ +var i: integer; +procedure p1; +begin + var o: T; + if o = nil then + i := 1; + if o <> nil then + i := 2; +end; + +begin + p1&; + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/nil4.pas b/TestSuite/nil4.pas new file mode 100644 index 000000000..c262739ea --- /dev/null +++ b/TestSuite/nil4.pas @@ -0,0 +1,14 @@ +var i: integer; +procedure p1; +begin + var o: T; + if o = nil then + i := 1; + if o <> nil then + i := 2; +end; + +begin + p1&; + assert(i = 2); +end. \ No newline at end of file diff --git a/TestSuite/nil5.pas b/TestSuite/nil5.pas new file mode 100644 index 000000000..624db8f95 --- /dev/null +++ b/TestSuite/nil5.pas @@ -0,0 +1,14 @@ +var i: integer; +procedure p1; where T:class; +begin + var o: T; + if o = nil then + i := 1; + if o <> nil then + i := 2; +end; + +begin + p1&; + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/nil6.pas b/TestSuite/nil6.pas new file mode 100644 index 000000000..e560124b4 --- /dev/null +++ b/TestSuite/nil6.pas @@ -0,0 +1,14 @@ +var i: integer; +procedure p1; +begin + var o: T; + if nil = o then + i := 1; + if nil <> o then + i := 2; +end; + +begin + p1&; + assert(i = 1); +end. \ No newline at end of file