summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-10-09 10:28:16 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-12-09 20:50:41 +0900
commitfb9e92e82818cf2c703b7f1e8d0ad20515fa0824 (patch)
tree18a5d292f93cfb8e53547025588886fabc36cc07
parentf7a0f11c3650f7553dd1792e06e52643354c8316 (diff)
downloadmruby-fb9e92e82818cf2c703b7f1e8d0ad20515fa0824.tar.gz
mruby-fb9e92e82818cf2c703b7f1e8d0ad20515fa0824.zip
Warnings for numbered parameters in nested blocks.
-rw-r--r--mrbgems/mruby-compiler/core/parse.y17
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;