From f014935bacaae4431df744f76cbd03b9ac039849 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, 17 Feb 2019 14:19:07 +0100 Subject: [PATCH] fix #1638 --- .../YieldVisitors/MarkMethodHasYieldVisitor.cs | 6 +++--- .../YieldVisitors/ProcessYieldsCapturedVars.cs | 2 +- TestSuite/yieldparams.pas | 11 +++++++++++ bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 TestSuite/yieldparams.pas diff --git a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs index 2743d7e0f..2b9dd28bb 100644 --- a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs @@ -169,10 +169,10 @@ namespace SyntaxVisitors if (pars != null) foreach (var ps in pars.params_list) { - if (ps.param_kind != parametr_kind.none) + if (ps.param_kind != parametr_kind.none && ps.param_kind != parametr_kind.params_parametr) throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_VAR_CONST_PARAMS_MODIFIERS", pars.source_context); - if (ps.inital_value != null) - throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_DEFAULT_PARAMETERS", pars.source_context); + /*if (ps.inital_value != null) + throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_DEFAULT_PARAMETERS", pars.source_context);*/ } HasYields = true; diff --git a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index e3b6b36bd..c5841d203 100644 --- a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -135,7 +135,7 @@ namespace SyntaxVisitors if (pars != null) foreach (var ps in pars.params_list) { - if (ps.param_kind != parametr_kind.none) + if (ps.param_kind != parametr_kind.none && ps.param_kind != parametr_kind.params_parametr) throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_VAR_CONST_PARAMS_MODIFIERS", pars.source_context); if (ps.inital_value != null) throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_DEFAULT_PARAMETERS", pars.source_context); diff --git a/TestSuite/yieldparams.pas b/TestSuite/yieldparams.pas new file mode 100644 index 000000000..eb3404c50 --- /dev/null +++ b/TestSuite/yieldparams.pas @@ -0,0 +1,11 @@ +function Get(params x: array of integer): sequence of integer; +begin + yield x[0]; + yield x[1]; +end; + +begin +var a := Get(1,2).ToArray; +assert(a[0] = 1); +assert(a[1] = 2); +end. \ No newline at end of file diff --git a/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat b/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat index 9453a465d..29bc6eb75 100644 --- a/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat +++ b/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat @@ -4,7 +4,7 @@ YIELD_FUNC_MUST_RETURN_SEQUENCE=Функции с yield должны непосредственно возвращать тип sequence of T или IEnumerable YIELD_FUNC_CANNOT_RETURN_SEQUENCE_OF_ANONYMOUS_DELEGATES=Функции с yield не могут возвращать последовательность анонимных делегатов ONLY_FUNCTIONS_CAN_CONTAIN_YIELDS=Только функции могут содержать yield -FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_VAR_CONST_PARAMS_MODIFIERS=В параметрах функции с yield не должно быть модификаторов 'var', 'const' или 'params' +FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_VAR_CONST_PARAMS_MODIFIERS=В параметрах функции с yield не должно быть модификаторов 'var' или 'const' FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_DEFAULT_PARAMETERS=Функция с yield не должна иметь параметров по умолчанию FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_RESULT=Функция с yield не может содержать переменную Result FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_LOCK=Функции с yield не могут содержать оператор lock