From 16d1f078f408838dd98863807d7cb8eee3316a57 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 20 Dec 2020 18:15:34 +0100 Subject: [PATCH] bug fix #2364 --- NETGenerator/NETGenerator.cs | 9 ++++++--- TestSuite/generics41.pas | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 TestSuite/generics41.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 3bd2d50fa..ef4d85c67 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -5275,10 +5275,12 @@ namespace PascalABCCompiler.NETGenerator il.Emit(OpCodes.Ldarga, pos); } + bool must_push_addr; + //перевод ссылки на параметр public override void visit(SemanticTree.ICommonParameterReferenceNode value) { - bool must_push_addr = false;//должен ли упаковываться, но это если после идет точка + must_push_addr = false;//должен ли упаковываться, но это если после идет точка if (is_dot_expr)//если после идет точка { if (value.type.is_value_type || value.type.is_generic_parameter) @@ -5355,7 +5357,7 @@ namespace PascalABCCompiler.NETGenerator else { il.Emit(OpCodes.Ldfld, fb); - if (is_addr == false && must_push_addr == false) + if (!is_addr && !must_push_addr) { TypeInfo ti = helper.GetTypeReference(value.parameter.type); NETGeneratorTools.PushParameterDereference(il, ti.tp); @@ -7200,7 +7202,8 @@ namespace PascalABCCompiler.NETGenerator value.obj.visit(this); if ((value.obj.type.is_value_type) && !value.method.comperehensive_type.is_value_type) { - il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.type).tp); + if (!(value.obj is ICommonParameterReferenceNode && must_push_addr)) + il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.type).tp); } else if (value.obj.type.is_generic_parameter && !(value.obj is IAddressedExpressionNode)) { diff --git a/TestSuite/generics41.pas b/TestSuite/generics41.pas new file mode 100644 index 000000000..7208fcd62 --- /dev/null +++ b/TestSuite/generics41.pas @@ -0,0 +1,16 @@ +function p1(a, b: T): integer; + where T: System.IComparable; +begin + Result := a.CompareTo(b); +end; + +function p2(a, b: T): integer; + where T: record, System.IComparable; +begin + Result := a.CompareTo(b); +end; + +begin + assert(p1(2,1) = 1); + assert(p2(2,1) = 1); +end. \ No newline at end of file