This commit is contained in:
parent
788040d067
commit
bc726bbfc0
|
|
@ -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
6
TestSuite/nullable10.pas
Normal 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.
|
||||||
Loading…
Reference in a new issue