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);
}
bool must_push_addr;
//перевод ссылки на параметр
public override void visit(SemanticTree.ICommonParameterReferenceNode value)
{
bool must_push_addr = false;//должен ли упаковываться, но это если после идет точка
must_push_addr = false;//должен ли упаковываться, но это если после идет точка
if (is_dot_expr)//если после идет точка
{
if (value.type.is_value_type || value.type.is_generic_parameter)
@ -5355,7 +5357,7 @@ namespace PascalABCCompiler.NETGenerator
else
{
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);
NETGeneratorTools.PushParameterDereference(il, ti.tp);
@ -7200,7 +7202,8 @@ namespace PascalABCCompiler.NETGenerator
value.obj.visit(this);
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))
{

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.