This commit is contained in:
Бондарев Иван 2018-10-03 12:39:08 +02:00
parent b765e1ad63
commit 932600b1c6
6 changed files with 43 additions and 3 deletions

View file

@ -8537,6 +8537,7 @@ namespace PascalABCCompiler.NETGenerator
real_parameters[1].visit(this); real_parameters[1].visit(this);
il.Emit(OpCodes.Call, mi_right); il.Emit(OpCodes.Call, mi_right);
EmitOperator(value); EmitOperator(value);
is_dot_expr = tmp_dot;
if (tmp_dot) if (tmp_dot)
{ {
is_dot_expr = tmp_dot; is_dot_expr = tmp_dot;

19
TestSuite/delegates11.pas Normal file
View file

@ -0,0 +1,19 @@
var i: integer;
procedure p;
begin
i := 1;
end;
type
I1 = interface
function f1: Action0;
end;
t1 = class(I1)
public function f1: Action0 := p;
end;
begin
var t := new t1;
t.f1()();
assert(i = 1);
end.

View file

@ -0,0 +1,9 @@
type
I1 = interface
function f1: Action0;
end;
t1 = class(I1)
public function f1: procedure := nil;
end;
begin end.

View file

@ -0,0 +1,9 @@
type
base = class
function f1: Action0; abstract;
end;
t1 = class(base)
public function f1: procedure; override := nil;
end;
begin end.

View file

@ -1,4 +1,4 @@
function f: integer?; function f: System.Nullable<integer>;
begin begin
Result := 2; Result := 2;
end; end;

View file

@ -1482,6 +1482,8 @@ namespace PascalABCCompiler.TreeConverter
} }
if (tn1.get_internal_interface(internal_interface_kind.delegate_interface) != null) if (tn1.get_internal_interface(internal_interface_kind.delegate_interface) != null)
{ {
if (strong)
return tn1 == tn2;
delegate_internal_interface d1 = tn1.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface; delegate_internal_interface d1 = tn1.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface;
delegate_internal_interface d2 = tn2.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface; delegate_internal_interface d2 = tn2.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface;
if (d2 != null) if (d2 != null)
@ -1496,7 +1498,7 @@ namespace PascalABCCompiler.TreeConverter
} }
//Этот метод сверяет не только параметры, но и возвращаемое значение //Этот метод сверяет не только параметры, но и возвращаемое значение
public static bool function_eq_params_and_result(function_node left, function_node right, bool weak=false) public static bool function_eq_params_and_result(function_node left, function_node right, bool weak = false)
{ {
if (!function_eq_params(left, right, weak)) if (!function_eq_params(left, right, weak))
{ {
@ -1504,7 +1506,7 @@ namespace PascalABCCompiler.TreeConverter
} }
else else
{ {
return eq_type_nodes(left.return_value_type,right.return_value_type); return eq_type_nodes(left.return_value_type, right.return_value_type, weak);
} }
} }