This commit is contained in:
Ivan Bondarev 2021-10-17 11:16:37 +02:00
parent 788040d067
commit bc726bbfc0
2 changed files with 27 additions and 2 deletions

View file

@ -10668,16 +10668,35 @@ namespace PascalABCCompiler.NETGenerator
is_dot_expr = tmp_is_dot_expr; is_dot_expr = tmp_is_dot_expr;
is_addr = tmp_is_addr; is_addr = tmp_is_addr;
il.Emit(OpCodes.Brfalse, FalseLabel); 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); var ti = helper.GetTypeReference(value.ret_if_true.type);
if (ti != null) if (ti != null)
EmitBox(value.ret_if_true, ti.tp); EmitBox(value.ret_if_true, ti.tp);
il.Emit(OpCodes.Br, EndLabel); il.Emit(OpCodes.Br, EndLabel);
il.MarkLabel(FalseLabel); 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); ti = helper.GetTypeReference(value.ret_if_false.type);
if (ti != null) if (ti != null)
EmitBox(value.ret_if_false, ti.tp); EmitBox(value.ret_if_false, ti.tp);
il.MarkLabel(EndLabel); il.MarkLabel(EndLabel);
} }

6
TestSuite/nullable10.pas Normal file
View file

@ -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.