diff --git a/src/lpython/parser/parser.yy b/src/lpython/parser/parser.yy index 5d1d1e206a..8405459377 100644 --- a/src/lpython/parser/parser.yy +++ b/src/lpython/parser/parser.yy @@ -216,7 +216,9 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg) %type function_def %type parameter_list_opt %type parameter -%type parameter_list_starargs +%type parameter_list +%type parameter_list_no_posonly +%type parameter_list_starargs %type defparameter_list %type decorators %type decorators_opt @@ -577,62 +579,43 @@ defparameter_list | parameter { LIST_NEW($$); LIST_ADD($$, $1); } | defparameter_list "," TK_TYPE_COMMENT parameter { $$ = $1; LIST_ADD($$, $4); ADD_TYPE_COMMENT($1, $3, @$); } + | defparameter_list "," TK_TYPE_COMMENT { + $$ = $1; ADD_TYPE_COMMENT($1, $3, @$); } + ; + +parameter_list + : defparameter_list "," "/" comma_opt { + $$ = PARAMETER_LIST_01($1, nullptr); } + | defparameter_list "," "/" "," parameter_list_no_posonly { + $$ = PARAMETER_LIST_01($1, $5); } + | parameter_list_no_posonly { $$ = PARAMETER_LIST_02($1); } + ; + +parameter_list_no_posonly + : defparameter_list comma_opt { $$ = PARAMETER_LIST_03($1, nullptr); } + | defparameter_list "," parameter_list_starargs { + $$ = PARAMETER_LIST_03($1, $3); } + | parameter_list_starargs { $$ = PARAMETER_LIST_04($1); } ; parameter_list_starargs - : "*" parameter { $$ = STAR_ARGS_01($2, @$); } - | "*" parameter "," defparameter_list { $$ = STAR_ARGS_02($2, $4, @$); } - | "*" parameter "," defparameter_list "," "**" parameter { - $$ = STAR_ARGS_03($2, $4, $7, @$); } - | "*" parameter "," "**" parameter { $$ = STAR_ARGS_04($2, $5, @$); } - | "**" parameter { $$ = STAR_ARGS_05($2, @$); } - - | defparameter_list "," "*" parameter { $$ = STAR_ARGS_06($1, $4, @$); } - | defparameter_list "," "*" parameter "," defparameter_list { - $$ = STAR_ARGS_07($1, $4, $6, @$); } - | defparameter_list "," "*" parameter "," defparameter_list "," "**" parameter { - $$ = STAR_ARGS_08($1, $4, $6, $9, @$); } - | defparameter_list "," "*" parameter "," "**" parameter { - $$ = STAR_ARGS_09($1, $4, $7, @$); } - | defparameter_list "," "**" parameter { $$ = STAR_ARGS_10($1, $4, @$); } - - | defparameter_list "," "/" { $$ = STAR_ARGS_11($1, @$); } - | defparameter_list "," "/" "," "*" parameter { - $$ = STAR_ARGS_12($1, $6, @$); } - | defparameter_list "," "/" "," "*" parameter "," defparameter_list { - $$ = STAR_ARGS_13($1, $6, $8, @$); } - | defparameter_list "," "/" "," "*" parameter "," defparameter_list - "," "**" parameter { $$ = STAR_ARGS_14($1, $6, $8, $11, @$); } - | defparameter_list "," "/" "," "**" parameter { - $$ = STAR_ARGS_15($1, $6, @$); } - | defparameter_list "," "/" "," "*" parameter "," "**" parameter { - $$ = STAR_ARGS_16($1, $6, $9, @$); } - | defparameter_list "," "/" "," defparameter_list "," "*" parameter { - $$ = STAR_ARGS_17($1, $5, $8, @$); } - | defparameter_list "," "/" "," defparameter_list "," "**" parameter { - $$ = STAR_ARGS_18($1, $5, $8, @$); } - | defparameter_list "," "/" "," defparameter_list "," "*" parameter - "," "**" parameter { $$ = STAR_ARGS_19($1, $5, $8, $11, @$); } - | defparameter_list "," "/" "," defparameter_list "," "*" parameter - "," defparameter_list "," "**" parameter { - $$ = STAR_ARGS_20($1, $5, $8, $10, $13, @$); } - | defparameter_list "," "/" "," "*" "," defparameter_list { - $$ = STAR_ARGS_21($1, $7, @$); } - | defparameter_list "," "/" "," defparameter_list "," - "*" "," defparameter_list { $$ = STAR_ARGS_22($1, $5, $9, @$); } - | defparameter_list "," "*" "," defparameter_list { - $$ = STAR_ARGS_23($1, $5, @$); } - | "*" "," defparameter_list { $$ = STAR_ARGS_24($3, @$); } + : "*" "," defparameter_list comma_opt { $$ = PARAMETER_LIST_05($3); } + | "*" "," "**" parameter comma_opt { $$ = PARAMETER_LIST_06($4); } + | "*" "," defparameter_list "," "**" parameter comma_opt { + $$ = PARAMETER_LIST_07($3, $6); } + | "*" parameter comma_opt { $$ = PARAMETER_LIST_08($2); } + | "*" parameter "," defparameter_list comma_opt { + $$ = PARAMETER_LIST_09($2, $4); } + | "*" parameter "," "**" parameter comma_opt { + $$ = PARAMETER_LIST_10($2, $5); } + | "*" parameter "," defparameter_list "," "**" parameter comma_opt { + $$ = PARAMETER_LIST_11($2, $4, $7); } + | "**" parameter comma_opt { $$ = PARAMETER_LIST_06($2); } ; parameter_list_opt - : defparameter_list comma_opt { $$ = FUNC_ARG_LIST_01($1, @$); } - | defparameter_list "," TK_TYPE_COMMENT { ADD_TYPE_COMMENT($1, $3, @$); - $$ = FUNC_ARG_LIST_01($1, @$); } - | parameter_list_starargs { $$ = $1; } - | %empty { $$ = FUNC_ARG_LIST_02(@$); } - | defparameter_list "," "/" "," defparameter_list { - $$ = FUNC_ARG_LIST_03($1, $5, @$); } + : parameter_list { $$ = FUNC_ARGS_01(p.m_a, @$, $1); } + | %empty { $$ = PARAMETER_LIST_12(@$); } ; comma_opt @@ -869,7 +852,7 @@ lambda_id_list lambda_expression : KW_LAMBDA ":" expr %prec LAMBDA { - $$ = LAMBDA_01(FUNC_ARG_LIST_02(@$), $3, @$); } + $$ = LAMBDA_01(PARAMETER_LIST_12(@$), $3, @$); } | KW_LAMBDA lambda_id_list ":" expr %prec LAMBDA { $$ = LAMBDA_01(FUNC_ARG_LIST_01($2, @$), $4, @$); } ; diff --git a/src/lpython/parser/parser_stype.h b/src/lpython/parser/parser_stype.h index 0559afdd1b..28312aeed1 100644 --- a/src/lpython/parser/parser_stype.h +++ b/src/lpython/parser/parser_stype.h @@ -25,6 +25,24 @@ struct Arg { LPython::AST::expr_t *defaults; }; +struct Var_Kw { + Vec vararg; + Vec kwonlyargs; + Vec kwarg; +}; + +struct Args_ { + Vec args; + bool var_kw_val; + Var_Kw *var_kw; +}; + +struct Fn_Arg { + Vec posonlyargs; + bool args_val; + Args_ *args; +}; + union YYSTYPE { int64_t n; double f; @@ -42,6 +60,10 @@ union YYSTYPE { Args *args; Vec vec_args; + Fn_Arg *fn_arg; + Args_ *args_; + Var_Kw *var_kw; + Key_Val *key_val; Vec vec_key_val; diff --git a/src/lpython/parser/semantics.h b/src/lpython/parser/semantics.h index abcda449ac..10f457d307 100644 --- a/src/lpython/parser/semantics.h +++ b/src/lpython/parser/semantics.h @@ -23,6 +23,9 @@ using LFortran::Vec; using LFortran::Key_Val; using LFortran::Args; using LFortran::Arg; +using LFortran::Fn_Arg; +using LFortran::Args_; +using LFortran::Var_Kw; static inline char* name2char(const ast_t *n) { return down_cast2(n)->m_id; @@ -376,9 +379,13 @@ Arg** ARG2LIST(Allocator &al, Arg *x) { return v; } -#define FUNC_ARGS_(x, kw) \ +#define FUNC_ARGS1_(x) \ Vec _m_##x; \ _m_##x.reserve(al, 4); \ + r->arguments.m_##x = _m_##x.p; \ + r->arguments.n_##x = _m_##x.n; + +#define FUNC_ARGS_(x, kw) \ if(n_##x > 0) { \ for(size_t i = 0; i < n_##x; i++) { \ _m_##x.push_back(al, m_##x[i]->_arg); \ @@ -388,44 +395,91 @@ Arg** ARG2LIST(Allocator &al, Arg *x) { kw_defaults.push_back(al, m_##x[i]->defaults); \ } \ } \ + r->arguments.m_##x = _m_##x.p; \ + r->arguments.n_##x = _m_##x.n; \ } +static inline Args *FUNC_ARGS_01(Allocator &al, Location &l, Fn_Arg *parameters) { + Args *r = al.allocate(); + Vec defaults; + defaults.reserve(al, 4); + Vec kw_defaults; + kw_defaults.reserve(al, 4); + + FUNC_ARGS1_(posonlyargs); + FUNC_ARGS1_(args); + FUNC_ARGS1_(vararg); + FUNC_ARGS1_(kwonlyargs); + FUNC_ARGS1_(kwarg); + + r->arguments.loc = l; + if(parameters != nullptr) { + Arg** m_posonlyargs = parameters->posonlyargs.p; + size_t n_posonlyargs = parameters->posonlyargs.n; + FUNC_ARGS_(posonlyargs, false); + } + if(parameters != nullptr && parameters->args_val) { + Arg** m_args = parameters->args->args.p; + size_t n_args = parameters->args->args.n; + FUNC_ARGS_(args, false); + + if(parameters->args->var_kw_val) { + Arg** m_vararg = parameters->args->var_kw->vararg.p; + size_t n_vararg = parameters->args->var_kw->vararg.n; + FUNC_ARGS_(vararg, false); + + Arg** m_kwonlyargs = parameters->args->var_kw->kwonlyargs.p; + size_t n_kwonlyargs = parameters->args->var_kw->kwonlyargs.n; + FUNC_ARGS_(kwonlyargs, true); + + Arg** m_kwarg = parameters->args->var_kw->kwarg.p; + size_t n_kwarg = parameters->args->var_kw->kwarg.n; + FUNC_ARGS_(kwarg, true); + } + } + r->arguments.m_kw_defaults = kw_defaults.p; + r->arguments.n_kw_defaults = kw_defaults.n; + r->arguments.m_defaults = defaults.p; + r->arguments.n_defaults = defaults.n; + return r; +} + static inline Args *FUNC_ARGS(Allocator &al, Location &l, Arg** m_posonlyargs, size_t n_posonlyargs, Arg** m_args, size_t n_args, Arg** m_vararg, size_t n_vararg, Arg** m_kwonlyargs, size_t n_kwonlyargs, Arg** m_kwarg, size_t n_kwarg) { + // TODO: Use parameter_list for LAMBDA instead of lambda_id_list, + // after which this function can be removed. Args *r = al.allocate(); Vec defaults; defaults.reserve(al, 4); Vec kw_defaults; kw_defaults.reserve(al, 4); + FUNC_ARGS1_(posonlyargs); + FUNC_ARGS1_(args); + FUNC_ARGS1_(vararg); + FUNC_ARGS1_(kwonlyargs); + FUNC_ARGS1_(kwarg); + + r->arguments.loc = l; FUNC_ARGS_(posonlyargs, false); FUNC_ARGS_(args, false); FUNC_ARGS_(vararg, false); FUNC_ARGS_(kwonlyargs, true); FUNC_ARGS_(kwarg, true); - - r->arguments.loc = l; - r->arguments.m_posonlyargs = _m_posonlyargs.p; - r->arguments.n_posonlyargs = _m_posonlyargs.n; - r->arguments.m_args = _m_args.p; - r->arguments.n_args = _m_args.n; - r->arguments.m_vararg = _m_vararg.p; - r->arguments.n_vararg = _m_vararg.n; - r->arguments.m_kwonlyargs = _m_kwonlyargs.p; - r->arguments.n_kwonlyargs = _m_kwonlyargs.n; r->arguments.m_kw_defaults = kw_defaults.p; r->arguments.n_kw_defaults = kw_defaults.n; - r->arguments.m_kwarg = _m_kwarg.p; - r->arguments.n_kwarg = _m_kwarg.n; r->arguments.m_defaults = defaults.p; r->arguments.n_defaults = defaults.n; return r; } +#define FUNC_ARG_LIST_01(args, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ + args.p, args.n, nullptr, 0, nullptr, 0, nullptr,0) + #define ARGS_01(arg, l) FUNC_ARG(p.m_a, l, \ name2char((ast_t *)arg), nullptr, nullptr) #define ARGS_02(arg, annotation, l) FUNC_ARG(p.m_a, l, \ @@ -443,83 +497,69 @@ static inline void ADD_TYPE_COMMENT_(LFortran::Parser &p, Location l, #define ADD_TYPE_COMMENT(x, type_comment, l) \ ADD_TYPE_COMMENT_(p, l, x, type_comment) -#define STAR_ARGS_01(vararg, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - nullptr, 0, ARG2LIST(p.m_a, vararg), 1, nullptr, 0, nullptr, 0) -#define STAR_ARGS_02(vararg, kwonlyargs, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_03(vararg, kwonlyargs, kwarg, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_04(vararg, kwarg, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_05(kwarg, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - nullptr, 0, nullptr, 0, nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) - -#define STAR_ARGS_06(args, vararg, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - args.p, args.n, ARG2LIST(p.m_a, vararg), 1, nullptr, 0, nullptr, 0) -#define STAR_ARGS_07(args, vararg, kwonlyargs, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_08(args, vararg, kwonlyargs, kwarg, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_09(args, vararg, kwarg, l) FUNC_ARGS(p.m_a, l, \ - nullptr, 0, args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_10(args, kwarg, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - args.p, args.n, nullptr, 0, nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) - -#define STAR_ARGS_11(posonlyargs, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, nullptr, 0, \ - nullptr, 0, nullptr, 0) -#define STAR_ARGS_12(posonlyargs, vararg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, nullptr, 0) -#define STAR_ARGS_13(posonlyargs, vararg, kwonlyargs, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_14(posonlyargs, vararg, kwonlyargs, kwarg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_15(posonlyargs, kwarg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, nullptr, 0, nullptr, 0, \ - ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_16(posonlyargs, vararg, kwarg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_17(posonlyargs, args, vararg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, nullptr, 0) -#define STAR_ARGS_18(posonlyargs, args, kwarg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, args.p, args.n, nullptr, 0, nullptr, 0, \ - ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_19(posonlyargs, args, vararg, kwarg, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - nullptr, 0, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_20(posonlyargs, args, vararg, kwonlyargs, kwarg, l) \ - FUNC_ARGS(p.m_a, l, posonlyargs.p, posonlyargs.n, \ - args.p, args.n, ARG2LIST(p.m_a, vararg), 1, \ - kwonlyargs.p, kwonlyargs.n, ARG2LIST(p.m_a, kwarg), 1) -#define STAR_ARGS_21(posonlyargs, kwonlyargs, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, nullptr, 0, nullptr, 0, \ - kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_22(posonlyargs, args, kwonlyargs, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, args.p, args.n, nullptr, 0, \ - kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_23(args, kwonlyargs, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - args.p, args.n, nullptr, 0, kwonlyargs.p, kwonlyargs.n, nullptr, 0) -#define STAR_ARGS_24(kwonlyargs, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - nullptr, 0, nullptr, 0, kwonlyargs.p, kwonlyargs.n, nullptr, 0) +static inline Fn_Arg *FN_ARG(Allocator &al, Arg** m_posonlyargs, + size_t n_posonlyargs, Args_ *args) { + Fn_Arg *r = al.allocate(); + r->posonlyargs.p = m_posonlyargs; + r->posonlyargs.n = n_posonlyargs; + if(args) { + r->args_val = true; + } else { + r->args_val = false; + } + r->args = args; + return r; +} -#define FUNC_ARG_LIST_01(args, l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - args.p, args.n, nullptr, 0, nullptr, 0, nullptr, 0) -#define FUNC_ARG_LIST_02(l) FUNC_ARGS(p.m_a, l, nullptr, 0, \ - nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0) -#define FUNC_ARG_LIST_03(posonlyargs, args, l) FUNC_ARGS(p.m_a, l, \ - posonlyargs.p, posonlyargs.n, args.p, args.n, nullptr, 0, \ +static inline Args_ *ARGS(Allocator &al, Arg** m_args, + size_t n_args, Var_Kw *var_kw) { + Args_ *r = al.allocate(); + r->args.p = m_args; + r->args.n = n_args; + if(var_kw) { + r->var_kw_val = true; + } else { + r->var_kw_val = false; + } + r->var_kw = var_kw; + return r; +} + +static inline Var_Kw *VAR_KW(Allocator &al, + Arg** m_kwarg, size_t n_kwarg, + Arg** m_kwonlyargs, size_t n_kwonlyargs, + Arg** m_vararg, size_t n_vararg) { + Var_Kw *r = al.allocate(); + r->kwarg.p = m_kwarg; + r->kwarg.n = n_kwarg; + r->kwonlyargs.p = m_kwonlyargs; + r->kwonlyargs.n = n_kwonlyargs; + r->vararg.p = m_vararg; + r->vararg.n = n_vararg; + return r; +} + +#define PARAMETER_LIST_01(posonlyargs, args) \ + FN_ARG(p.m_a, posonlyargs.p, posonlyargs.n, args) +#define PARAMETER_LIST_02(args) FN_ARG(p.m_a, nullptr, 0, args) +#define PARAMETER_LIST_03(args, var_kw) ARGS(p.m_a, args.p, args.n, var_kw) +#define PARAMETER_LIST_04(var_kw) ARGS(p.m_a, nullptr, 0, var_kw) +#define PARAMETER_LIST_05(kwonlyargs) VAR_KW(p.m_a, nullptr, 0, \ + kwonlyargs.p, kwonlyargs.n, nullptr, 0) +#define PARAMETER_LIST_06(kwarg) VAR_KW(p.m_a, ARG2LIST(p.m_a, kwarg), 1, \ nullptr, 0, nullptr, 0) +#define PARAMETER_LIST_07(kwonlyargs, kwarg) VAR_KW(p.m_a, \ + ARG2LIST(p.m_a, kwarg), 1, kwonlyargs.p, kwonlyargs.n, nullptr, 0) +#define PARAMETER_LIST_08(vararg) VAR_KW(p.m_a, nullptr, 0, \ + nullptr, 0, ARG2LIST(p.m_a, vararg), 1) +#define PARAMETER_LIST_09(vararg, kwonlyargs) VAR_KW(p.m_a, nullptr, 0, \ + kwonlyargs.p, kwonlyargs.n, ARG2LIST(p.m_a, vararg), 1) +#define PARAMETER_LIST_10(vararg, kwarg) VAR_KW(p.m_a, \ + ARG2LIST(p.m_a, kwarg), 1, nullptr, 0, ARG2LIST(p.m_a, vararg), 1) +#define PARAMETER_LIST_11(vararg, kwonlyargs, kwarg) VAR_KW(p.m_a, \ + ARG2LIST(p.m_a, kwarg), 1, kwonlyargs.p, kwonlyargs.n, \ + ARG2LIST(p.m_a, vararg), 1) +#define PARAMETER_LIST_12(l) FUNC_ARGS_01(p.m_a, l, nullptr) #define FUNCTION_01(decorator, id, args, stmts, l) \ make_FunctionDef_t(p.m_a, l, name2char(id), args->arguments, \ diff --git a/tests/parser/function_def2.py b/tests/parser/function_def2.py index f501438cbe..1e2007400e 100644 --- a/tests/parser/function_def2.py +++ b/tests/parser/function_def2.py @@ -73,6 +73,30 @@ def test_24(a, /, b, c, *d, **e): def test_25(a, /, b, c, *d, e, **f): pass +def test_26(*, a): + pass + +def test_27(*, a, **b): + pass + +def test_28(a, *, b): + pass + +def test_29(a, *, b, **c): + pass + +def test_30(a, /, *, b): + pass + +def test_31(a, /, b, *, c): + pass + +def test_32(a, /, *, c, **d): + pass + +def test_33(a, /, b, *, c, **d): + pass + # Function Calls test() test(x, y) diff --git a/tests/reference/ast_new-function_def2-52c4587.json b/tests/reference/ast_new-function_def2-52c4587.json index 47a2e0451b..d7acd11962 100644 --- a/tests/reference/ast_new-function_def2-52c4587.json +++ b/tests/reference/ast_new-function_def2-52c4587.json @@ -2,11 +2,11 @@ "basename": "ast_new-function_def2-52c4587", "cmd": "lpython --show-ast --new-parser --no-color {infile} -o {outfile}", "infile": "tests/parser/function_def2.py", - "infile_hash": "43cba32abd52688215d611887f1182775b8396bffe42623d0647e3b3", + "infile_hash": "e364a83df399e2a4f74d2b57fb0846a04803c5378750fb0c38ff2ba7", "outfile": null, "outfile_hash": null, "stdout": "ast_new-function_def2-52c4587.stdout", - "stdout_hash": "164e31e99257dab8d61e6f354909922a21ab635dea66bc4e9a1bb81c", + "stdout_hash": "874f51742f065edc73fda15183027472622153c57634b8b2481a22c8", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/ast_new-function_def2-52c4587.stdout b/tests/reference/ast_new-function_def2-52c4587.stdout index 0e3c165265..eeb89601ac 100644 --- a/tests/reference/ast_new-function_def2-52c4587.stdout +++ b/tests/reference/ast_new-function_def2-52c4587.stdout @@ -1 +1 @@ -(Module [(FunctionDef test_01 ([] [] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_02 ([] [] [(x (Name i32 Load) ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_03 ([] [] [(x () ())] [(y () ()) (z () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_04 ([] [] [(x () ())] [(y () ()) (z () ())] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_05 ([] [] [(x () ())] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_06 ([] [] [] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_07 ([] [(x (Name i32 Load) ()) (y () ())] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_08 ([] [(x () ())] [(y () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_09 ([] [(x () ())] [(y () ())] [(z () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_10 ([] [(x () ())] [(y () ())] [(z () ())] [] [(args (Name i32 Load) ())] []) [(Pass)] [] () ()) (FunctionDef test_11 ([] [(x () ())] [(y () ())] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_12 ([] [(x () ())] [] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_13 ([] [(x (Name i32 Load) ()) (y (Name i32 Load) ())] [] [] [] [] [(ConstantInt 1 ()) (ConstantInt 1 ())]) [(Pass)] [] () ()) (FunctionDef test_14 ([] [(x () ())] [(y () ())] [(z () ())] [] [(args (Name i32 Load) ())] []) [(Pass)] [] (Name i32 Load) ()) (FunctionDef test_15 ([(a () ())] [] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_16 ([(a () ())] [(b () ()) (c () ())] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_17 ([(a () ())] [] [(b () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_18 ([(a (Name i32 Load) ())] [] [(b (Name i64 Load) ())] [(c (Name i32 Load) ()) (d (Name i32 Load) ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_19 ([(a () ())] [] [(b () ())] [(c () ())] [] [(d () ())] []) [(Pass)] [] () ()) (FunctionDef test_20 ([(a () ())] [] [] [] [] [(b () ())] []) [(Pass)] [] () ()) (FunctionDef test_21 ([(a () ())] [] [(b () ())] [] [] [(c () ())] []) [(Pass)] [] () ()) (FunctionDef test_22 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_23 ([(a () ())] [(b () ()) (c () ())] [] [] [] [(d () ())] []) [(Pass)] [] () ()) (FunctionDef test_24 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [] [] [(e () ())] []) [(Pass)] [] () ()) (FunctionDef test_25 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [(e () ())] [] [(f () ())] []) [(Pass)] [] () ()) (Expr (Call (Name test Load) [] [])) (Expr (Call (Name test Load) [(Name x Load) (Name y Load)] [])) (Expr (Call (Name test Load) [(Name x Load)] [(y (ConstantInt 1 ())) (z (ConstantStr "123" ()))])) (Expr (Call (Name test Load) [(ConstantInt 100 ())] [(() (Name x Load))])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load)] [(() (Name y Load))])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load) (Name y Load)] [])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load) (Starred (Name y Load) Load)] [])) (Expr (Call (Name test Load) [] [(() (Name x Load)) (() (Name y Load))])) (Expr (Call (Attribute (Name lp Load) test Load) [] [])) (Expr (Call (Attribute (Name lp Load) test Load) [(Name x Load) (Name y Load)] [])) (Expr (Call (Attribute (Name lp Load) test Load) [(Name x Load)] [(y (ConstantInt 1 ())) (z (ConstantStr "123" ()))])) (Expr (Subscript (Call (Name test Load) [] []) (ConstantStr "version" ()) Load)) (Expr (Subscript (Call (Name test Load) [(Name x Load) (Name y Load)] []) (ConstantStr "version" ()) Load)) (Expr (Subscript (Call (Name test Load) [(Name x Load) (Starred (Name y Load) Load)] []) (Slice () (UnaryOp USub (ConstantInt 1 ())) ()) Load)) (Expr (Subscript (Subscript (Call (Name test Load) [] []) (ConstantInt 1 ()) Load) (ConstantInt 1 ()) Load)) (Expr (Call (Subscript (Name x Load) (ConstantStr "numpystr" ()) Load) [] [])) (Expr (Call (Subscript (Name x Load) (ConstantStr "int" ()) Load) [] [])) (Expr (Call (Subscript (Name x Load) (Name func Load) Load) [(Starred (Name args Load) Load)] [(() (Name kwargs Load))])) (Expr (Call (Subscript (Name test Load) (ConstantInt 0 ()) Load) [(Starred (Subscript (Name test Load) (Slice (ConstantInt 1 ()) () ()) Load) Load)] [])) (Expr (Call (BinOp (Name obj Load) Mult (Attribute (Attribute (Name self Load) _arr Load) ndim Load)) [(Starred (Attribute (Attribute (Name self Load) _arr Load) shape Load) Load)] []))] []) +(Module [(FunctionDef test_01 ([] [] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_02 ([] [] [(x (Name i32 Load) ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_03 ([] [] [(x () ())] [(y () ()) (z () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_04 ([] [] [(x () ())] [(y () ()) (z () ())] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_05 ([] [] [(x () ())] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_06 ([] [] [] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_07 ([] [(x (Name i32 Load) ()) (y () ())] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_08 ([] [(x () ())] [(y () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_09 ([] [(x () ())] [(y () ())] [(z () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_10 ([] [(x () ())] [(y () ())] [(z () ())] [] [(args (Name i32 Load) ())] []) [(Pass)] [] () ()) (FunctionDef test_11 ([] [(x () ())] [(y () ())] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_12 ([] [(x () ())] [] [] [] [(args () ())] []) [(Pass)] [] () ()) (FunctionDef test_13 ([] [(x (Name i32 Load) ()) (y (Name i32 Load) ())] [] [] [] [] [(ConstantInt 1 ()) (ConstantInt 1 ())]) [(Pass)] [] () ()) (FunctionDef test_14 ([] [(x () ())] [(y () ())] [(z () ())] [] [(args (Name i32 Load) ())] []) [(Pass)] [] (Name i32 Load) ()) (FunctionDef test_15 ([(a () ())] [] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_16 ([(a () ())] [(b () ()) (c () ())] [] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_17 ([(a () ())] [] [(b () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_18 ([(a (Name i32 Load) ())] [] [(b (Name i64 Load) ())] [(c (Name i32 Load) ()) (d (Name i32 Load) ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_19 ([(a () ())] [] [(b () ())] [(c () ())] [] [(d () ())] []) [(Pass)] [] () ()) (FunctionDef test_20 ([(a () ())] [] [] [] [] [(b () ())] []) [(Pass)] [] () ()) (FunctionDef test_21 ([(a () ())] [] [(b () ())] [] [] [(c () ())] []) [(Pass)] [] () ()) (FunctionDef test_22 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [] [] [] []) [(Pass)] [] () ()) (FunctionDef test_23 ([(a () ())] [(b () ()) (c () ())] [] [] [] [(d () ())] []) [(Pass)] [] () ()) (FunctionDef test_24 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [] [] [(e () ())] []) [(Pass)] [] () ()) (FunctionDef test_25 ([(a () ())] [(b () ()) (c () ())] [(d () ())] [(e () ())] [] [(f () ())] []) [(Pass)] [] () ()) (FunctionDef test_26 ([] [] [] [(a () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_27 ([] [] [] [(a () ())] [] [(b () ())] []) [(Pass)] [] () ()) (FunctionDef test_28 ([] [(a () ())] [] [(b () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_29 ([] [(a () ())] [] [(b () ())] [] [(c () ())] []) [(Pass)] [] () ()) (FunctionDef test_30 ([(a () ())] [] [] [(b () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_31 ([(a () ())] [(b () ())] [] [(c () ())] [] [] []) [(Pass)] [] () ()) (FunctionDef test_32 ([(a () ())] [] [] [(c () ())] [] [(d () ())] []) [(Pass)] [] () ()) (FunctionDef test_33 ([(a () ())] [(b () ())] [] [(c () ())] [] [(d () ())] []) [(Pass)] [] () ()) (Expr (Call (Name test Load) [] [])) (Expr (Call (Name test Load) [(Name x Load) (Name y Load)] [])) (Expr (Call (Name test Load) [(Name x Load)] [(y (ConstantInt 1 ())) (z (ConstantStr "123" ()))])) (Expr (Call (Name test Load) [(ConstantInt 100 ())] [(() (Name x Load))])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load)] [(() (Name y Load))])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load) (Name y Load)] [])) (Expr (Call (Name test Load) [(Starred (Name x Load) Load) (Starred (Name y Load) Load)] [])) (Expr (Call (Name test Load) [] [(() (Name x Load)) (() (Name y Load))])) (Expr (Call (Attribute (Name lp Load) test Load) [] [])) (Expr (Call (Attribute (Name lp Load) test Load) [(Name x Load) (Name y Load)] [])) (Expr (Call (Attribute (Name lp Load) test Load) [(Name x Load)] [(y (ConstantInt 1 ())) (z (ConstantStr "123" ()))])) (Expr (Subscript (Call (Name test Load) [] []) (ConstantStr "version" ()) Load)) (Expr (Subscript (Call (Name test Load) [(Name x Load) (Name y Load)] []) (ConstantStr "version" ()) Load)) (Expr (Subscript (Call (Name test Load) [(Name x Load) (Starred (Name y Load) Load)] []) (Slice () (UnaryOp USub (ConstantInt 1 ())) ()) Load)) (Expr (Subscript (Subscript (Call (Name test Load) [] []) (ConstantInt 1 ()) Load) (ConstantInt 1 ()) Load)) (Expr (Call (Subscript (Name x Load) (ConstantStr "numpystr" ()) Load) [] [])) (Expr (Call (Subscript (Name x Load) (ConstantStr "int" ()) Load) [] [])) (Expr (Call (Subscript (Name x Load) (Name func Load) Load) [(Starred (Name args Load) Load)] [(() (Name kwargs Load))])) (Expr (Call (Subscript (Name test Load) (ConstantInt 0 ()) Load) [(Starred (Subscript (Name test Load) (Slice (ConstantInt 1 ()) () ()) Load) Load)] [])) (Expr (Call (BinOp (Name obj Load) Mult (Attribute (Attribute (Name self Load) _arr Load) ndim Load)) [(Starred (Attribute (Attribute (Name self Load) _arr Load) shape Load) Load)] []))] [])