diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-10-09 10:28:16 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-12-09 20:50:41 +0900 |
| commit | fb9e92e82818cf2c703b7f1e8d0ad20515fa0824 (patch) | |
| tree | 18a5d292f93cfb8e53547025588886fabc36cc07 | |
| parent | f7a0f11c3650f7553dd1792e06e52643354c8316 (diff) | |
| download | mruby-fb9e92e82818cf2c703b7f1e8d0ad20515fa0824.tar.gz mruby-fb9e92e82818cf2c703b7f1e8d0ad20515fa0824.zip | |
Warnings for numbered parameters in nested blocks.
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 8ebf7dd81..cf5f5230f 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -326,7 +326,7 @@ nvars_nest(parser_state *p) static void nvars_block(parser_state *p) { - p->nvars = cons(p->nvars, nint(-1)); + p->nvars = cons(p->nvars, nint(-2)); } static void @@ -673,7 +673,7 @@ new_cvar(parser_state *p, mrb_sym sym) static node* new_nvar(parser_state *p, int num) { - if (!p->nvars || intn(p->nvars->cdr) < 0) { + if (!p->nvars || intn(p->nvars->cdr) < -1) { yyerror(p, "numbered parameter outside block"); } else { int nvars = intn(p->nvars->cdr); @@ -5954,6 +5954,19 @@ parser_yylex(parser_state *p) case '_': if (toklen(p) == 2 && ISDIGIT(tok(p)[1])) { int n = tok(p)[1] - '0'; + node *nvars = p->nvars->car; + + while (nvars) { + if (intn(nvars->cdr) > 0) { + yywarning(p, "numbered parameter in nested block"); + break; + } + nvars->cdr = nint(-1); + nvars = nvars->car; + } + if (intn(p->nvars->cdr) < 0) { + yywarning(p, "numbered parameter in nested block"); + } if (n == 0) { yyerror(p, "_0 is not available"); return 0; |
