From dc9320cd90a56fde5eebec48f4a19d3b7f34c102 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 21 Nov 2021 14:10:06 +0100 Subject: [PATCH] #2562 --- Localization/DefaultLang.resources | Bin 99039 -> 99210 bytes NETGenerator/NETGenerator.cs | 11 +++++++++-- TestSuite/nullable11.pas | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 TestSuite/nullable11.pas diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index 00c23fbf543dab7674561b70eb616ab6edd14b51..ae06df629c24d91c8f5a1a7b31aef3f895e0519c 100644 GIT binary patch delta 195 zcmccL%GTA+HsJx&vZjrX8t13FMtFwAI|aEqddEBa`-OP=g}TOj`o+6>`Z@aeM8-S$ z_&a;sp7{9w-RnQk-#vQp_Qg|$)QZd!9fhQ#)WmFs7YfPwc_o>7rKt*!6dt~Q_v)!a zT4r8iPEMu5+ow<7z5o32(~CFnHYYCVJmwS{>>3~J>gx!!#TjTvh^vo}XRxbZuq%@J rpZ+MkdiUo2i`V}@z5Af>3IfuEBe2pqHKplimrm1hC<8|%0aCIA2c diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 6ff3f3a2b..41567c291 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -8979,6 +8979,7 @@ namespace PascalABCCompiler.NETGenerator real_parameters[0].visit(this); is_dot_expr = tmp; + MethodInfo mi = null; if (real_parameters[0].type is IGenericTypeInstance) mi = TypeBuilder.GetMethod(ti.tp, typeof(Nullable<>).GetMethod("get_HasValue")); @@ -9032,10 +9033,14 @@ namespace PascalABCCompiler.NETGenerator Label lb_true = il.DefineLabel(); Label lb_end = il.DefineLabel(); Label lb_common = il.DefineLabel(); + LocalBuilder lb_left = il.DeclareLocal(ti_left.tp); + LocalBuilder lb_right = il.DeclareLocal(ti_right.tp); if (!(real_parameters[0] is IDefaultOperatorNode) && !(real_parameters[1] is IDefaultOperatorNode)) { is_dot_expr = true; real_parameters[0].visit(this); + il.Emit(OpCodes.Stloc, lb_left); + il.Emit(OpCodes.Ldloca, lb_left); if (real_parameters[0].type is IGenericTypeInstance) mi_left = TypeBuilder.GetMethod(ti_left.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { })); else @@ -9046,6 +9051,8 @@ namespace PascalABCCompiler.NETGenerator il.Emit(OpCodes.Ldloc, tmp_lb); is_dot_expr = true; real_parameters[1].visit(this); + il.Emit(OpCodes.Stloc, lb_right); + il.Emit(OpCodes.Ldloca, lb_right); if (real_parameters[1].type is IGenericTypeInstance) mi_right = TypeBuilder.GetMethod(ti_right.tp, typeof(Nullable<>).GetMethod("get_HasValue", new Type[] { })); else @@ -9125,13 +9132,13 @@ namespace PascalABCCompiler.NETGenerator if (!(real_parameters[0] is IDefaultOperatorNode)) { is_dot_expr = true; - real_parameters[0].visit(this); + il.Emit(OpCodes.Ldloca, lb_left); il.Emit(OpCodes.Call, mi_left); } if (!(real_parameters[1] is IDefaultOperatorNode)) { is_dot_expr = true; - real_parameters[1].visit(this); + il.Emit(OpCodes.Ldloca, lb_right); il.Emit(OpCodes.Call, mi_right); } MethodInfo eq_mi = null; diff --git a/TestSuite/nullable11.pas b/TestSuite/nullable11.pas new file mode 100644 index 000000000..6105f0935 --- /dev/null +++ b/TestSuite/nullable11.pas @@ -0,0 +1,10 @@ +var i: integer; +function f1: boolean?; +begin + Inc(i); + Result := false; +end; +begin + assert(f1 <> true); + assert(i = 1); +end.