Skip to content

Commit

Permalink
parse.y: brace after literal arg
Browse files Browse the repository at this point in the history
* parse.y (symbol, dsym, parser_set_number_literal, parser_yylex):
  set state to END too not only ENDARG and after a literal, so
  that a left brace after it should be a primary block bound to
  the literal, which causes syntax error.
  [ruby-core:81037] [Bug #13547]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58641 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed May 9, 2017
1 parent 046c943 commit 9987109
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
10 changes: 6 additions & 4 deletions parse.y
Original file line number Diff line number Diff line change
Expand Up @@ -4049,7 +4049,7 @@ string_dvar : tGVAR

symbol : tSYMBEG sym
{
SET_LEX_STATE(EXPR_ENDARG);
SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
/*%%%*/
$$ = $2;
/*%
Expand All @@ -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);
/*%
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions test/ruby/test_syntax.rb
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,16 @@ def obj.m; yield; end
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;"}"
Expand Down

0 comments on commit 9987109

Please sign in to comment.