From 932600b1c60c72bac713fd50188efd7a2a1a3ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Wed, 3 Oct 2018 12:39:08 +0200 Subject: [PATCH] bug fix #1211 --- NETGenerator/NETGenerator.cs | 1 + TestSuite/delegates11.pas | 19 +++++++++++++++++++ TestSuite/errors/err0284.pas | 9 +++++++++ TestSuite/errors/err0285.pas | 9 +++++++++ TestSuite/nullable2.pas | 2 +- .../convertion_data_and_alghoritms.cs | 6 ++++-- 6 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 TestSuite/delegates11.pas create mode 100644 TestSuite/errors/err0284.pas create mode 100644 TestSuite/errors/err0285.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index dd591078b..0d19fb5ae 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -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; diff --git a/TestSuite/delegates11.pas b/TestSuite/delegates11.pas new file mode 100644 index 000000000..87eca4c38 --- /dev/null +++ b/TestSuite/delegates11.pas @@ -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. \ No newline at end of file diff --git a/TestSuite/errors/err0284.pas b/TestSuite/errors/err0284.pas new file mode 100644 index 000000000..bf8e3af8b --- /dev/null +++ b/TestSuite/errors/err0284.pas @@ -0,0 +1,9 @@ +type + I1 = interface + function f1: Action0; + end; + t1 = class(I1) + public function f1: procedure := nil; + end; + +begin end. \ No newline at end of file diff --git a/TestSuite/errors/err0285.pas b/TestSuite/errors/err0285.pas new file mode 100644 index 000000000..cded8c56a --- /dev/null +++ b/TestSuite/errors/err0285.pas @@ -0,0 +1,9 @@ +type + base = class + function f1: Action0; abstract; + end; + t1 = class(base) + public function f1: procedure; override := nil; + end; + +begin end. \ No newline at end of file diff --git a/TestSuite/nullable2.pas b/TestSuite/nullable2.pas index d4268ce3f..9c0afdacf 100644 --- a/TestSuite/nullable2.pas +++ b/TestSuite/nullable2.pas @@ -1,4 +1,4 @@ -function f: integer?; +function f: System.Nullable; begin Result := 2; end; diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 8fadf3a43..39f8784a9 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -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); } }