This commit is contained in:
Бондарев Иван 2020-05-03 13:36:12 +02:00
parent 81ae37d609
commit e7213b9c8d
3 changed files with 49 additions and 0 deletions

View file

@ -5275,6 +5275,11 @@ namespace PascalABCCompiler.NETGenerator
if (!(value.type.is_generic_parameter && value.type.base_type != null && value.type.base_type.is_class && value.type.base_type.base_type != null))
must_push_addr = true;
}
else if (value.conversion_type != null && (value.conversion_type.is_generic_parameter))
{
if (!(value.conversion_type.is_generic_parameter && value.conversion_type.base_type != null && value.conversion_type.base_type.is_class && value.conversion_type.base_type.base_type != null))
must_push_addr = true;
}
}
ParamInfo pi = helper.GetParameter(value.parameter);
if (pi.kind == ParamKind.pkNone)
@ -7090,6 +7095,8 @@ 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)
il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.conversion_type).tp);
il.EmitCall(OpCodes.Callvirt, mi, null);
}
@ -7219,6 +7226,8 @@ 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)
il.Emit(OpCodes.Constrained, helper.GetTypeReference(value.obj.conversion_type).tp);
il.EmitCall(OpCodes.Callvirt, mi, null);
}
EmitFreePinnedVariables();

22
TestSuite/generics35.pas Normal file
View file

@ -0,0 +1,22 @@
var i: integer;
type
I1 = interface
procedure p1;
end;
r1 = record(I1)
public procedure p1;
begin
i := 1;
end;
end;
procedure p1<T>(a: T); where T: I1;
begin
I1(a).p1;
end;
begin
p1(new r1);
assert(i = 1);
end.

18
TestSuite/generics36.pas Normal file
View file

@ -0,0 +1,18 @@
var i: integer;
type
r1 = record(System.ICloneable)
public function Clone: object;
begin
i := 1;
end;
end;
procedure p1<T>(a: T); where T: System.ICloneable;
begin
System.ICloneable(a).Clone;
end;
begin
p1(new r1);
assert(i = 1);
end.