From 0050316c977347cb45501badef9c22d9545ff108 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Fri, 7 Apr 2023 10:52:54 +0200 Subject: [PATCH] #2832 --- NETGenerator/NETGenerator.cs | 2 +- TestSuite/generics68.pas | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 TestSuite/generics68.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 762bb8c39..c970d7cae 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -7612,7 +7612,7 @@ namespace PascalABCCompiler.NETGenerator { if (value.obj.type.is_generic_parameter) il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.type).tp); - else if (value.obj.conversion_type != null && value.obj.conversion_type.is_generic_parameter) + else if (value.obj.conversion_type != null && value.obj.conversion_type.is_generic_parameter && !value.obj.type.IsInterface) il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.conversion_type).tp); il.EmitCall(OpCodes.Callvirt, mi, null); } diff --git a/TestSuite/generics68.pas b/TestSuite/generics68.pas new file mode 100644 index 000000000..137729a96 --- /dev/null +++ b/TestSuite/generics68.pas @@ -0,0 +1,21 @@ +var i: integer; +type + I1 = interface + procedure p1; + end; + + // Обязательно класс, не запись + t2 = class(I1) + public procedure p1; + begin + i := 1; + end; + end; + +// Обязательно I1(o), (o as I1) работает без проблем +procedure p0(o: T) := I1(o).p1; + +begin + p0(new t2); + assert(i = 1); +end. \ No newline at end of file