diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 763016827..6f835bee5 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -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; } diff --git a/TestSuite/delegates13.pas b/TestSuite/delegates13.pas new file mode 100644 index 000000000..4b0fe38d3 --- /dev/null +++ b/TestSuite/delegates13.pas @@ -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. \ No newline at end of file