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)
|
if (value.obj.type.is_generic_parameter)
|
||||||
il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.type).tp);
|
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.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.conversion_type).tp);
|
||||||
il.EmitCall(OpCodes.Callvirt, mi, null);
|
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