From 2bf21fb8aae9f1177faca0e49bebe294d7694958 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 10 Jan 2021 11:46:11 +0100 Subject: [PATCH] #2395 --- NETGenerator/NETGenerator.cs | 8 ++++++-- TestSuite/generics44.pas | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 TestSuite/generics44.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 4e968b665..834a361da 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -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) diff --git a/TestSuite/generics44.pas b/TestSuite/generics44.pas new file mode 100644 index 000000000..7e4f2e941 --- /dev/null +++ b/TestSuite/generics44.pas @@ -0,0 +1,20 @@ +type + // Не обязательно auto класс, я добавил только ради конструктора + t0 = auto class + f: byte; + end; + +procedure p1(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. \ No newline at end of file