This commit is contained in:
Ivan Bondarev 2020-12-20 18:15:34 +01:00
parent 99b6e90612
commit 16d1f078f4
2 changed files with 22 additions and 3 deletions

View file

@ -5275,10 +5275,12 @@ namespace PascalABCCompiler.NETGenerator
il.Emit(OpCodes.Ldarga, pos); il.Emit(OpCodes.Ldarga, pos);
} }
bool must_push_addr;
//перевод ссылки на параметр //перевод ссылки на параметр
public override void visit(SemanticTree.ICommonParameterReferenceNode value) public override void visit(SemanticTree.ICommonParameterReferenceNode value)
{ {
bool must_push_addr = false;//должен ли упаковываться, но это если после идет точка must_push_addr = false;//должен ли упаковываться, но это если после идет точка
if (is_dot_expr)//если после идет точка if (is_dot_expr)//если после идет точка
{ {
if (value.type.is_value_type || value.type.is_generic_parameter) if (value.type.is_value_type || value.type.is_generic_parameter)
@ -5355,7 +5357,7 @@ namespace PascalABCCompiler.NETGenerator
else else
{ {
il.Emit(OpCodes.Ldfld, fb); il.Emit(OpCodes.Ldfld, fb);
if (is_addr == false && must_push_addr == false) if (!is_addr && !must_push_addr)
{ {
TypeInfo ti = helper.GetTypeReference(value.parameter.type); TypeInfo ti = helper.GetTypeReference(value.parameter.type);
NETGeneratorTools.PushParameterDereference(il, ti.tp); NETGeneratorTools.PushParameterDereference(il, ti.tp);
@ -7200,7 +7202,8 @@ namespace PascalABCCompiler.NETGenerator
value.obj.visit(this); value.obj.visit(this);
if ((value.obj.type.is_value_type) && !value.method.comperehensive_type.is_value_type) if ((value.obj.type.is_value_type) && !value.method.comperehensive_type.is_value_type)
{ {
il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.type).tp); if (!(value.obj is ICommonParameterReferenceNode && must_push_addr))
il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.type).tp);
} }
else if (value.obj.type.is_generic_parameter && !(value.obj is IAddressedExpressionNode)) else if (value.obj.type.is_generic_parameter && !(value.obj is IAddressedExpressionNode))
{ {

16
TestSuite/generics41.pas Normal file
View file

@ -0,0 +1,16 @@
function p1<T>(a, b: T): integer;
where T: System.IComparable<T>;
begin
Result := a.CompareTo(b);
end;
function p2<T>(a, b: T): integer;
where T: record, System.IComparable<T>;
begin
Result := a.CompareTo(b);
end;
begin
assert(p1(2,1) = 1);
assert(p2(2,1) = 1);
end.