From 323db9e66d37181cd887bb7988802cf17b98230c 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: Sun, 31 Mar 2019 18:18:44 +0200 Subject: [PATCH] fix #1663 --- TestSuite/errors/err0315.pas | 8 ++++++++ TestSuite/errors/err0316.pas | 8 ++++++++ .../TreeConversion/syntax_tree_visitor.cs | 16 +++++++++++----- 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 TestSuite/errors/err0315.pas create mode 100644 TestSuite/errors/err0316.pas diff --git a/TestSuite/errors/err0315.pas b/TestSuite/errors/err0315.pas new file mode 100644 index 000000000..4bb29e31c --- /dev/null +++ b/TestSuite/errors/err0315.pas @@ -0,0 +1,8 @@ +type + TClass = class + end; + +procedure operator+=(a, b, c, d: TClass); extensionmethod := exit; + +begin +end. \ No newline at end of file diff --git a/TestSuite/errors/err0316.pas b/TestSuite/errors/err0316.pas new file mode 100644 index 000000000..29ed8a01c --- /dev/null +++ b/TestSuite/errors/err0316.pas @@ -0,0 +1,8 @@ +type + TClass = class + end; + +function operator+(a, b, c, d: T): T; extensionmethod := default(T); + +begin +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 77988350e..217a3af6b 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -13341,6 +13341,7 @@ namespace PascalABCCompiler.TreeConverter context.top_function.scope.AddSymbol(compiler_string_consts.self_word, new SymbolInfo(cp)); } } + if (_procedure_header is SyntaxTree.constructor) { common_method_node cmnode = context.top_function as common_method_node; @@ -13729,9 +13730,10 @@ namespace PascalABCCompiler.TreeConverter } first_param = false; common_method_node cnode = context.top_function as common_method_node; + parameter_list pars = context.top_function.parameters; if (cnode != null && cnode.IsOperator) { - parameter_list pars = context.top_function.parameters; + if (cnode.name != compiler_string_consts.implicit_operator_name && cnode.name != compiler_string_consts.explicit_operator_name) { bool all_types_mismatch = true; @@ -13753,14 +13755,18 @@ namespace PascalABCCompiler.TreeConverter { AddError(convertion_data_and_alghoritms.get_location(pars[pars.Count - 1]), "PARAMS_IN_OPERATOR"); } - int pcount = name_reflector.get_params_count(cnode.name); + + } + if (context.top_function.IsOperator) + { + int pcount = name_reflector.get_params_count(context.top_function.name); if (pcount != pars.Count) { - if (cnode.name != compiler_string_consts.minus_name && cnode.name != compiler_string_consts.plus_name) - AddError(cnode.loc, "OPERATOR_{0}_PARAMETERS_COUNT_MUST_EQUAL_{1}", cnode.name, pcount); + if (context.top_function.name != compiler_string_consts.minus_name && context.top_function.name != compiler_string_consts.plus_name) + AddError(context.top_function.loc, "OPERATOR_{0}_PARAMETERS_COUNT_MUST_EQUAL_{1}", context.top_function.name, pcount); else if (pars.Count != 1 && pars.Count != 2) - AddError(cnode.loc, "OPERATOR_{0}_PARAMETERS_COUNT_MUST_EQUAL_{1}", cnode.name, pcount); + AddError(context.top_function.loc, "OPERATOR_{0}_PARAMETERS_COUNT_MUST_EQUAL_{1}", context.top_function.name, pcount); } } }