diff options
-rw-r--r-- | parse.y | 10 | ||||
-rw-r--r-- | test/ruby/test_syntax.rb | 10 |
2 files changed, 16 insertions, 4 deletions
@@ -4049,7 +4049,7 @@ string_dvar : tGVAR symbol : tSYMBEG sym { - SET_LEX_STATE(EXPR_ENDARG); + SET_LEX_STATE(EXPR_END|EXPR_ENDARG); /*%%%*/ $$ = $2; /*% @@ -4066,7 +4066,7 @@ sym : fname dsym : tSYMBEG xstring_contents tSTRING_END { - SET_LEX_STATE(EXPR_ENDARG); + SET_LEX_STATE(EXPR_END|EXPR_ENDARG); /*%%%*/ $$ = dsym_node($2); /*% @@ -6526,7 +6526,7 @@ parser_set_number_literal(struct parser_params *parser, VALUE v, int type, int s type = tIMAGINARY; } set_yylval_literal(v); - SET_LEX_STATE(EXPR_ENDARG); + SET_LEX_STATE(EXPR_END|EXPR_ENDARG); return type; } @@ -7884,9 +7884,11 @@ parser_yylex(struct parser_params *parser) } } if (token == tSTRING_END || token == tREGEXP_END || token == tLABEL_END) { + const enum lex_state_e next_state = + token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_END|EXPR_ENDARG; rb_gc_force_recycle((VALUE)lex_strterm); lex_strterm = 0; - SET_LEX_STATE(token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_ENDARG); + SET_LEX_STATE(next_state); } } return token; diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 00ba5192a1..d1ac396eab 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -952,6 +952,16 @@ eom assert_equal(:ok, result) end + def test_brace_after_literal_argument + bug = '[ruby-core:81037] [Bug #13547]' + error = /unexpected '{'/ + assert_syntax_error('m "x" {}', error) + assert_syntax_error('m 1 {}', error, bug) + assert_syntax_error('m 1.0 {}', error, bug) + assert_syntax_error('m :m {}', error, bug) + assert_syntax_error('m :"#{m}" {}', error, bug) + end + def test_return_toplevel feature4840 = '[ruby-core:36785] [Feature #4840]' code = "#{<<~"begin;"}\n#{<<~"end;"}" |