bug fix #2158
This commit is contained in:
parent
3b7bf665ef
commit
aefc784d26
|
|
@ -9601,7 +9601,13 @@ namespace PascalABCCompiler.NETGenerator
|
|||
}
|
||||
}
|
||||
PushObjectCommand(ifc);
|
||||
il.Emit(OpCodes.Ldftn, mi);
|
||||
if (mi.IsVirtual || mi.IsAbstract)
|
||||
{
|
||||
il.Emit(OpCodes.Dup);
|
||||
il.Emit(OpCodes.Ldvirtftn, mi);
|
||||
}
|
||||
else
|
||||
il.Emit(OpCodes.Ldftn, mi);
|
||||
il.Emit(OpCodes.Newobj, cnstr);
|
||||
return;
|
||||
}
|
||||
|
|
@ -9614,8 +9620,6 @@ namespace PascalABCCompiler.NETGenerator
|
|||
}
|
||||
|
||||
is_dot_expr = false;
|
||||
bool need_fee = false;
|
||||
bool is_comp_gen = false;
|
||||
EmitArguments(parameters, real_parameters);
|
||||
if (value.new_obj_awaited())
|
||||
{
|
||||
|
|
@ -9689,7 +9693,13 @@ namespace PascalABCCompiler.NETGenerator
|
|||
}
|
||||
}
|
||||
PushObjectCommand(ifc);
|
||||
il.Emit(OpCodes.Ldftn, mi);
|
||||
if (mi.IsVirtual || mi.IsAbstract)
|
||||
{
|
||||
il.Emit(OpCodes.Dup);
|
||||
il.Emit(OpCodes.Ldvirtftn, mi);
|
||||
}
|
||||
else
|
||||
il.Emit(OpCodes.Ldftn, mi);
|
||||
il.Emit(OpCodes.Newobj, value.constructor.constructor_info);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
40
TestSuite/delegates13.pas
Normal file
40
TestSuite/delegates13.pas
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
var i: integer;
|
||||
|
||||
type
|
||||
t0 = abstract class
|
||||
procedure p0; abstract;
|
||||
procedure p2; virtual;
|
||||
begin
|
||||
|
||||
end;
|
||||
procedure p3;
|
||||
begin
|
||||
i := 3;
|
||||
end;
|
||||
end;
|
||||
|
||||
t1 = class(t0)
|
||||
procedure p0; override;
|
||||
begin
|
||||
i := 1;
|
||||
end;
|
||||
procedure p2; override;
|
||||
begin
|
||||
i := 2;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure p1(p: Action0);
|
||||
begin
|
||||
p();
|
||||
end;
|
||||
|
||||
begin
|
||||
var a := new t1 as t0;
|
||||
p1(a.p0);
|
||||
assert(i = 1);
|
||||
p1(a.p2);
|
||||
assert(i = 2);
|
||||
p1(a.p3);
|
||||
assert(i = 3);
|
||||
end.
|
||||
Loading…
Reference in a new issue