summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-09-19 19:40:44 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-09-19 19:40:44 +0900
commit2698f13a1f0cc07ef97b7f20502c420b51e9c57d (patch)
treec7da91f8362d9ff4e1a99ae8969da6cbd568cdb0
parent6180f1fede487bf5dfdd00cbae2ee7f2b4613a7e (diff)
Fixed reserved numbered parameter warning
-rw-r--r--parse.y10
-rw-r--r--test/ruby/test_syntax.rb1
2 files changed, 8 insertions, 3 deletions
diff --git a/parse.y b/parse.y
index c4fad9311f..03db19f2cf 100644
--- a/parse.y
+++ b/parse.y
@@ -170,9 +170,13 @@ struct local_vars {
enum {
ORDINAL_PARAM = -1,
NO_PARAM = 0,
- NUMPARAM_MAX = 100,
+ NUMPARAM_MAX = 9,
};
+#define NUMPARAM_ID_P(id) (is_local_id(id) && NUMPARAM_ID_TO_IDX(id) <= NUMPARAM_MAX)
+#define NUMPARAM_ID_TO_IDX(id) (unsigned int)(((id) >> ID_SCOPE_SHIFT) - tNUMPARAM_0)
+#define NUMPARAM_IDX_TO_ID(idx) TOKEN2LOCALID((tNUMPARAM_0 + (idx)))
+
#define DVARS_INHERIT ((void*)1)
#define DVARS_TOPSCOPE NULL
#define DVARS_TERMINAL_P(tbl) ((tbl) == DVARS_INHERIT || (tbl) == DVARS_TOPSCOPE)
@@ -11705,9 +11709,9 @@ arg_var(struct parser_params *p, ID id)
static void
local_var(struct parser_params *p, ID id)
{
- if (id >= idNUMPARAM_0 && id <= idNUMPARAM_9) {
+ if (NUMPARAM_ID_P(id)) {
rb_warn1("`_%d' is used as numbered parameter",
- WARN_I((int)(id - idNUMPARAM_0)));
+ WARN_I(NUMPARAM_ID_TO_IDX(id)));
}
vtable_add(p->lvtbl->vars, id);
if (p->lvtbl->used) {
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index ec6fc25ae4..6209bb3a23 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -1459,6 +1459,7 @@ eom
assert_syntax_error('proc {@1_}', /unexpected/)
assert_syntax_error('proc {@9999999999999999}', /too large/)
assert_syntax_error('@1', /outside block/)
+ assert_warn(/`_2' is used as numbered parameter/) {eval('_2=1')}
end
def test_value_expr_in_condition