This commit is contained in:
Ivan Bondarev 2021-01-10 11:46:11 +01:00
parent 07df31f762
commit 2bf21fb8aa
2 changed files with 26 additions and 2 deletions

View file

@ -5560,7 +5560,7 @@ namespace PascalABCCompiler.NETGenerator
//is_dot_expr = false;
is_field_reference = true;
value.obj.visit(this);
is_field_reference = false;
is_addr = temp_is_addr;
FldInfo fi_info = helper.GetField(value.field);
#if DEBUG
@ -5576,7 +5576,10 @@ namespace PascalABCCompiler.NETGenerator
{
if (fi_info.field_type.IsValueType || fi_info.field_type.IsGenericParameter)
{
il.Emit(OpCodes.Ldflda, fi);
if (is_field_reference && value.type.is_generic_parameter && value.type.base_type != null && value.type.base_type.is_class && value.type.base_type.base_type != null)
il.Emit(OpCodes.Ldfld, fi);
else
il.Emit(OpCodes.Ldflda, fi);
}
else
il.Emit(OpCodes.Ldfld, fi);
@ -5591,6 +5594,7 @@ namespace PascalABCCompiler.NETGenerator
{
is_dot_expr = false;
}
is_field_reference = false;
}
public override void visit(SemanticTree.INamespaceVariableReferenceNode value)

20
TestSuite/generics44.pas Normal file
View file

@ -0,0 +1,20 @@
type
// Не обязательно auto класс, я добавил только ради конструктора
t0 = auto class
f: byte;
end;
procedure p1<T>(o: T); where T: t0;
begin
assert(o.f = 123);
var p := procedure->
begin
var o2 := o;
end;
end;
begin
p1(new t0(123));
end.