diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index c819a9d76..6c2bdd6e8 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -10668,16 +10668,35 @@ namespace PascalABCCompiler.NETGenerator is_dot_expr = tmp_is_dot_expr; is_addr = tmp_is_addr; il.Emit(OpCodes.Brfalse, FalseLabel); - value.ret_if_true.visit(this); + if (value.ret_if_true is INullConstantNode && value.ret_if_true.type.is_nullable_type) + { + Type tp = helper.GetTypeReference(value.ret_if_true.type).tp; + LocalBuilder lb = il.DeclareLocal(tp); + il.Emit(OpCodes.Ldloca, lb); + il.Emit(OpCodes.Initobj, tp); + il.Emit(OpCodes.Ldloc, lb); + } + else + value.ret_if_true.visit(this); var ti = helper.GetTypeReference(value.ret_if_true.type); if (ti != null) EmitBox(value.ret_if_true, ti.tp); il.Emit(OpCodes.Br, EndLabel); il.MarkLabel(FalseLabel); - value.ret_if_false.visit(this); + if (value.ret_if_false is INullConstantNode && value.ret_if_false.type.is_nullable_type) + { + Type tp = helper.GetTypeReference(value.ret_if_false.type).tp; + LocalBuilder lb = il.DeclareLocal(tp); + il.Emit(OpCodes.Ldloca, lb); + il.Emit(OpCodes.Initobj, tp); + il.Emit(OpCodes.Ldloc, lb); + } + else + value.ret_if_false.visit(this); ti = helper.GetTypeReference(value.ret_if_false.type); if (ti != null) EmitBox(value.ret_if_false, ti.tp); + il.MarkLabel(EndLabel); } diff --git a/TestSuite/nullable10.pas b/TestSuite/nullable10.pas new file mode 100644 index 000000000..808201446 --- /dev/null +++ b/TestSuite/nullable10.pas @@ -0,0 +1,6 @@ +begin + var t := ( true ? 1 : nil, 2); + var t2 := ( true ? nil : 1, 2); + assert(t.Item1 = 1); + assert(t2.Item1 = nil); +end. \ No newline at end of file