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);
il.Emit(OpCodes.Call, mi_right);
EmitOperator(value);
is_dot_expr = tmp_dot;
if (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
Result := 2;
end;

View file

@ -1482,6 +1482,8 @@ namespace PascalABCCompiler.TreeConverter
}
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 d2 = tn2.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface;
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))
{
@ -1504,7 +1506,7 @@ namespace PascalABCCompiler.TreeConverter
}
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);
}
}