bug fix #2364
This commit is contained in:
parent
99b6e90612
commit
16d1f078f4
|
|
@ -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
16
TestSuite/generics41.pas
Normal 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.
|
||||
Loading…
Reference in a new issue