aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-12-23 18:07:37 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-12-25 14:44:04 +0900
commita9f096183170810ac6ce32b20d7810d11a51b5f5 (patch)
treedbb004a3f8cd5a9269f42bf9ecff5b0f40787aa5 /parse.y
parentb641b7e640b90292e8091348ca05def0a16904a8 (diff)
downloadruby-a9f096183170810ac6ce32b20d7810d11a51b5f5.tar.gz
[Feature #19370] Prohibit nesting anonymous parameter forwarding
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y6
1 files changed, 6 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 75b7151e60..f8e21dc9a3 100644
--- a/parse.y
+++ b/parse.y
@@ -15009,6 +15009,8 @@ add_forwarding_args(struct parser_params *p)
static void
forwarding_arg_check(struct parser_params *p, ID arg, ID all, const char *var)
{
+ bool conflict = false;
+
struct vtable *vars, *args;
vars = p->lvtbl->vars;
@@ -15017,6 +15019,7 @@ forwarding_arg_check(struct parser_params *p, ID arg, ID all, const char *var)
while (vars && !DVARS_TERMINAL_P(vars->prev)) {
vars = vars->prev;
args = args->prev;
+ conflict |= (vtable_included(args, arg) && !(all && vtable_included(args, all)));
}
bool found = false;
@@ -15032,6 +15035,9 @@ forwarding_arg_check(struct parser_params *p, ID arg, ID all, const char *var)
if (!found) {
compile_error(p, "no anonymous %s parameter", var);
}
+ else if (conflict) {
+ compile_error(p, "anonymous %s parameter is also used within block", var);
+ }
}
#ifndef RIPPER