From f69a84b1d1896078cfea44bdb3c554ef0cfac90d 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: Thu, 9 Aug 2018 11:38:44 +0200 Subject: [PATCH] bug fix #1025 --- TestSuite/params11.pas | 45 +++++++++++++++++++ .../convertion_data_and_alghoritms.cs | 16 +++---- 2 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 TestSuite/params11.pas diff --git a/TestSuite/params11.pas b/TestSuite/params11.pas new file mode 100644 index 000000000..6f54ddf4d --- /dev/null +++ b/TestSuite/params11.pas @@ -0,0 +1,45 @@ +var i: integer; + +procedure p(b: integer; params a:array of integer); +begin + i := b; + if a.Length > 0 then + i := a[0]; +end; + +procedure p4(b: integer; b2: integer; params a:array of integer); +begin + i := b; + if a.Length > 0 then + i := a[0]; +end; + +procedure p2(self: object; b: integer; params a:array of integer); extensionmethod; +begin + i := b; + if a.Length > 0 then + i := a[0]; +end; + +procedure p3(self: object; params a:array of integer); extensionmethod; +begin + i := 4; +end; + +begin + p(2); + assert(i = 2); + p(2,1,3); + assert(i = 1); + var o := new object; + o.p2(2); + assert(i = 2); + o.p2(2,1,3); + assert(i = 1); + o.p3; + assert(i = 4); + p4(2,2); + assert(i = 2); + p4(2,1,3); + assert(i = 3); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 2a8e81e74..be3a9dc41 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -1613,9 +1613,9 @@ namespace PascalABCCompiler.TreeConverter //TODO: Можно сделать параметры по умолчанию для откомпилированных функций. if ((exprs.Count < fn.parameters.Count) && (fn.node_kind == SemanticTree.node_kind.common)) { - if (exprs.Count == 0 && fn.parameters != null && fn.parameters.Count == 1 && fn.parameters[0].is_params || - exprs.Count == 1 && fn.parameters != null && fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null && - fn.parameters.Count == 2 && fn.parameters[1].is_params) + if (!(fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null) && fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count-1].is_params || + fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null && fn.parameters != null + && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params) { statements_expression_node sre = new statements_expression_node(ptcal.snl, ptcal.var_ref, ptcal.var_ref.location); //exprs.remove_range(fn.parameters.Count - 1, exprs.Count - fn.parameters.Count); @@ -1633,9 +1633,9 @@ namespace PascalABCCompiler.TreeConverter } else if ((exprs.Count < fn.parameters.Count) && (fn.node_kind == SemanticTree.node_kind.compiled)) { - if (exprs.Count == 0 && fn.parameters != null && fn.parameters.Count == 1 && fn.parameters[0].is_params || - exprs.Count == 1 && fn.parameters != null && fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null && - fn.parameters.Count == 2 && fn.parameters[1].is_params) + if (!(fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null) && fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params || + fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null + && fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params) { statements_expression_node sre = new statements_expression_node(ptcal.snl, ptcal.var_ref, ptcal.var_ref.location); exprs.AddElement(sre); @@ -1809,9 +1809,9 @@ namespace PascalABCCompiler.TreeConverter } } } - else if ((parameters.Count == 0 && fn.parameters.Count == 1) && fn.parameters[0].is_params && !set_of_possible_functions.Contains(fn)) + //else if ((parameters.Count == 0 && fn.parameters.Count == 1) && fn.parameters[0].is_params && !set_of_possible_functions.Contains(fn)) // SSM 6.08.18 - так просто исправить не получается - видимо, сопоставление параметров работает неверно - //else if ((parameters.Count == fn.parameters.Count - 1) && fn.parameters[fn.parameters.Count-1].is_params && !set_of_possible_functions.Contains(fn)) + else if ((parameters.Count == fn.parameters.Count - 1) && fn.parameters[fn.parameters.Count-1].is_params && !set_of_possible_functions.Contains(fn)) set_of_possible_functions.AddElement(fn); else if (fn.num_of_default_parameters != 0 && parameters.Count >= fn.parameters.Count - fn.num_of_default_parameters) {