fix #3059
This commit is contained in:
parent
cbaff8cfd0
commit
c6929c5d55
|
|
@ -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
26
TestSuite/generics76.pas
Normal 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.
|
||||
Loading…
Reference in a new issue