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