mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* parse.y (stmt_or_begin): changed the error message for BEGIN not
at toplevel. [ruby-dev:44963] [Bug #5738] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34016 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cc006d368c
commit
900b4a6db6
3 changed files with 39 additions and 9 deletions
|
@ -1,3 +1,8 @@
|
|||
Mon Dec 12 22:35:39 2011 Shugo Maeda <shugo@ruby-lang.org>
|
||||
|
||||
* parse.y (stmt_or_begin): changed the error message for BEGIN not
|
||||
at toplevel. [ruby-dev:44963] [Bug #5738]
|
||||
|
||||
Mon Dec 12 17:29:01 2011 NARUSE, Yui <naruse@ruby-lang.org>
|
||||
|
||||
* README: Fixed SupportedPlatforms URL in the README.
|
||||
|
|
34
parse.y
34
parse.y
|
@ -686,7 +686,7 @@ static void token_info_pop(struct parser_params*, const char *token);
|
|||
%type <node> words qwords word_list qword_list word
|
||||
%type <node> literal numeric dsym cpath
|
||||
%type <node> top_compstmt top_stmts top_stmt
|
||||
%type <node> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
|
||||
%type <node> bodystmt compstmt stmts stmt_or_begin stmt expr arg primary command command_call method_call
|
||||
%type <node> expr_value arg_value primary_value
|
||||
%type <node> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
|
||||
%type <node> args call_args opt_call_args
|
||||
|
@ -855,9 +855,6 @@ top_stmts : none
|
|||
top_stmt : stmt
|
||||
| keyword_BEGIN
|
||||
{
|
||||
if (in_def || in_single) {
|
||||
yyerror("BEGIN in method");
|
||||
}
|
||||
/*%%%*/
|
||||
/* local_push(0); */
|
||||
/*%
|
||||
|
@ -930,7 +927,7 @@ stmts : none
|
|||
dispatch0(void_stmt));
|
||||
%*/
|
||||
}
|
||||
| stmt
|
||||
| stmt_or_begin
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = newline_node($1);
|
||||
|
@ -938,7 +935,7 @@ stmts : none
|
|||
$$ = dispatch2(stmts_add, dispatch0(stmts_new), $1);
|
||||
%*/
|
||||
}
|
||||
| stmts terms stmt
|
||||
| stmts terms stmt_or_begin
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = block_append($1, newline_node($3));
|
||||
|
@ -952,6 +949,31 @@ stmts : none
|
|||
}
|
||||
;
|
||||
|
||||
stmt_or_begin : stmt
|
||||
{
|
||||
$$ = $1;
|
||||
}
|
||||
| keyword_BEGIN
|
||||
{
|
||||
yyerror("BEGIN is permitted only at toplevel");
|
||||
/*%%%*/
|
||||
/* local_push(0); */
|
||||
/*%
|
||||
%*/
|
||||
}
|
||||
'{' top_compstmt '}'
|
||||
{
|
||||
/*%%%*/
|
||||
ruby_eval_tree_begin = block_append(ruby_eval_tree_begin,
|
||||
$4);
|
||||
/* NEW_PREEXE($4)); */
|
||||
/* local_pop(); */
|
||||
$$ = NEW_BEGIN(0);
|
||||
/*%
|
||||
$$ = dispatch1(BEGIN, $4);
|
||||
%*/
|
||||
}
|
||||
|
||||
stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
|
||||
{
|
||||
/*%%%*/
|
||||
|
|
|
@ -33,19 +33,22 @@ class TestBeginEndBlock < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_begininmethod
|
||||
assert_raise(SyntaxError) do
|
||||
e = assert_raise(SyntaxError) do
|
||||
eval("def foo; BEGIN {}; end")
|
||||
end
|
||||
assert_match(/BEGIN is permitted only at toplevel/, e.message)
|
||||
|
||||
assert_raise(SyntaxError) do
|
||||
e = assert_raise(SyntaxError) do
|
||||
eval('eval("def foo; BEGIN {}; end")')
|
||||
end
|
||||
assert_match(/BEGIN is permitted only at toplevel/, e.message)
|
||||
end
|
||||
|
||||
def test_begininclass
|
||||
assert_raise(SyntaxError) do
|
||||
e = assert_raise(SyntaxError) do
|
||||
eval("class TestBeginEndBlock; BEGIN {}; end")
|
||||
end
|
||||
assert_match(/BEGIN is permitted only at toplevel/, e.message)
|
||||
end
|
||||
|
||||
def test_endblockwarn
|
||||
|
|
Loading…
Reference in a new issue