From b5ba1dcdf0d0db9dc1cdbbc9710e9cab4a6f3bab Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 1 Nov 2014 06:45:17 +0000 Subject: [PATCH] parse.y: invalid instance/class variable names * parse.y (parse_atmark): mere atmark and two atmarks without succeeding identifiers are invalid as instance/class variable names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48220 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ parse.y | 8 ++++++-- test/ruby/test_parse.rb | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d5ad77724..ed63c3cb55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Nov 1 15:45:15 2014 Nobuyoshi Nakada + + * parse.y (parse_atmark): mere atmark and two atmarks without + succeeding identifiers are invalid as instance/class variable + names. + Sat Nov 1 06:31:41 2014 Masaki Suketa * ext/win32ole/win32ole_variant.c: use typed data. diff --git a/parse.y b/parse.y index 6d04f4175e..d707a1bd04 100644 --- a/parse.y +++ b/parse.y @@ -7575,9 +7575,13 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state) tokadd('@'); c = nextc(); } - if (c != -1 && (ISDIGIT(c) || !parser_is_identchar())) { + if (c == -1 || ISSPACE(c)) { + compile_error(PARSER_ARG "unexpected @"); + return 0; + } + else if (ISDIGIT(c) || !parser_is_identchar()) { pushback(c); - if (tokidx == 1) { + if (result == tIVAR) { compile_error(PARSER_ARG "`@%c' is not allowed as an instance variable name", c); } else { diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 89b5ef1993..70b38a2a7e 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -650,10 +650,12 @@ x = __ENCODING__ def test_invalid_instance_variable assert_raise(SyntaxError) { eval('@#') } + assert_raise(SyntaxError) { eval('@') } end def test_invalid_class_variable assert_raise(SyntaxError) { eval('@@1') } + assert_raise(SyntaxError) { eval('@@') } end def test_invalid_char