This commit is contained in:
Ivan Bondarev 2024-03-29 19:32:38 +01:00
parent cbaff8cfd0
commit c6929c5d55
2 changed files with 27 additions and 1 deletions

View file

@ -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);
}

26
TestSuite/generics76.pas Normal file
View file

@ -0,0 +1,26 @@
var i := 0;
type
i1 = interface
property prop1: integer read;
end;
c1<T> = 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<r1>(new r1('abc'));
assert(i = 3);
end.