diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 738f7c1e7..af7ab4ae5 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -2674,10 +2674,6 @@ primary : literal | heredoc | var_ref | backref - | tNUMPARAM - { - $$ = new_nvar(p, $1); - } | tFID { $$ = new_fcall(p, $1, 0); @@ -3491,6 +3487,11 @@ symbol : basic_symbol } $$ = new_dsym(p, new_dstr(p, n)); } + | tSYMBEG tNUMPARAM + { + mrb_sym sym = intern_numparam($2); + $$ = new_sym(p, sym); + } ; basic_symbol : tSYMBEG sym @@ -3576,6 +3577,10 @@ var_ref : variable { $$ = var_reference(p, $1); } + | tNUMPARAM + { + $$ = new_nvar(p, $1); + } | keyword_nil { $$ = new_nil(p); @@ -6435,7 +6440,7 @@ parser_yylex(parser_state *p) break; case '_': - if (p->lstate != EXPR_FNAME && toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) { + if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) { int n = tok(p)[1] - '0'; int nvar; diff --git a/test/t/syntax.rb b/test/t/syntax.rb index 538c97418..362eac7c0 100644 --- a/test/t/syntax.rb +++ b/test/t/syntax.rb @@ -718,6 +718,16 @@ assert('_0 is not numbered parameter') do assert_equal(:l, ->{_0}.call) end +assert('numbered parameters in symbol name (https://github.com/mruby/mruby/issues/5295)') do + assert_equal([:_1], Array.new(1) {:_1}) +end + +assert('numbered parameters as singleton') do + o = Object.new + lambda { def _1.a(b) = "a#{b}" }.call(o) + assert_equal('ab', o.a('b')) +end + assert('argument forwarding') do c = Class.new { def a0(*a,&b)