bug fix #2364
This commit is contained in:
parent
99b6e90612
commit
16d1f078f4
|
|
@ -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
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