aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-28 04:08:51 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-06-28 04:08:51 +0000
commit87afbe4685bf5d39d94e312b78515d50b9364f4d (patch)
tree9033545cb4ac99047307f53f2dc5183218bba55b
parent5b8ce2298ae990473a0356eb6bd5a949001aa70c (diff)
downloadruby-87afbe4685bf5d39d94e312b78515d50b9364f4d.tar.gz
parse.y: flush numeric token
* parse.y (parser_number_literal_suffix, parse_numeric): flush numeric token so following unexpected token part is marked. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y6
-rw-r--r--test/ruby/test_parse.rb6
2 files changed, 12 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 833eda062c..cb494cc937 100644
--- a/parse.y
+++ b/parse.y
@@ -4886,10 +4886,12 @@ ripper_yylval_id(ID x)
#endif
#ifndef RIPPER
+#define numeric_literl_flush(p) (parser->tokp = (p))
#define dispatch_scan_event(t) ((void)0)
#define dispatch_delayed_token(t) ((void)0)
#define has_delayed_token() (0)
#else
+#define numeric_literl_flush(p) ((void)0)
#define yylval_rval (*(RB_TYPE_P(yylval.val, T_NODE) ? &yylval.node->nd_rval : &yylval.val))
@@ -6516,6 +6518,7 @@ parser_number_literal_suffix(struct parser_params *parser, int mask)
}
if (!ISASCII(c) || ISALPHA(c) || c == '_') {
lex_p = lastp;
+ numeric_literl_flush(lex_p);
return 0;
}
pushback(c);
@@ -6529,6 +6532,7 @@ parser_number_literal_suffix(struct parser_params *parser, int mask)
}
break;
}
+ numeric_literl_flush(lex_p);
return result;
}
@@ -7357,6 +7361,7 @@ parse_numeric(struct parser_params *parser, int c)
if (nondigit) {
char tmp[30];
trailing_uc:
+ numeric_literl_flush(lex_p - 1);
snprintf(tmp, sizeof(tmp), "trailing `%c' in number", nondigit);
yyerror(tmp);
}
@@ -7378,6 +7383,7 @@ parse_numeric(struct parser_params *parser, int c)
}
v = DBL2NUM(d);
}
+ numeric_literl_flush(lex_p);
return set_number_literal(v, type, suffix);
}
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index d2fc5f0721..d869fbd7ab 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1007,6 +1007,12 @@ x = __ENCODING__
end
end
+ def test_unexpected_token_after_numeric
+ assert_raise_with_message(SyntaxError, /^ \^~~\z/) do
+ eval('0000xyz')
+ end
+ end
+
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}