From c6929c5d55cd59381b59ecc25cff3b932056cac1 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Fri, 29 Mar 2024 19:32:38 +0100 Subject: [PATCH] fix #3059 --- NETGenerator/NETGenerator.cs | 2 +- TestSuite/generics76.pas | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 TestSuite/generics76.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index ad29d3272..94158b49f 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -7715,7 +7715,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 && (!value.obj.type.IsInterface || value.obj.conversion_type.ImplementingInterfaces.Count > 0)) + else if (value.obj.conversion_type != null && value.obj.conversion_type.is_generic_parameter && (!value.obj.type.IsInterface || value.obj.conversion_type.ImplementingInterfaces.Contains(value.obj.type))) il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.conversion_type).tp); il.EmitCall(OpCodes.Callvirt, mi, null); } diff --git a/TestSuite/generics76.pas b/TestSuite/generics76.pas new file mode 100644 index 000000000..6584f8203 --- /dev/null +++ b/TestSuite/generics76.pas @@ -0,0 +1,26 @@ +var i := 0; +type + i1 = interface + property prop1: integer read; + end; + c1 = class + // Обязательно любое ограничение where + where T: System.ICloneable; + + constructor(o: T); + begin + i := i1(o).prop1; // Выводит мусор + end; + + end; + r1 = record(i1, System.ICloneable) + s: string; + constructor(s: string) := self.s := s; + property prop1: integer read s.Length; // Обязательно использовать какие-то данные из self + function Clone: object := self; + end; + +begin + new c1(new r1('abc')); + assert(i = 3); +end. \ No newline at end of file