ruby-changes:43814
From: nobu <ko1@a...>
Date: Sat, 13 Aug 2016 10:52:27 +0900 (JST)
Subject: [ruby-changes:43814] nobu:r55887 (trunk): parse.y: rescue modifier in rhs of op asgn
nobu 2016-08-13 10:52:22 +0900 (Sat, 13 Aug 2016) New Revision: 55887 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=55887 Log: parse.y: rescue modifier in rhs of op asgn * parse.y (stmt, arg): rescue modifier in command op assignment should be limited to rhs only. [ruby-core:75621] [Bug #12402] Modified files: trunk/ChangeLog trunk/parse.y trunk/test/ruby/test_parse.rb Index: test/ruby/test_parse.rb =================================================================== --- test/ruby/test_parse.rb (revision 55886) +++ test/ruby/test_parse.rb (revision 55887) @@ -876,12 +876,84 @@ x = __ENCODING__ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_parse.rb#L876 def test_rescue_in_command_assignment bug = '[ruby-core:75621] [Bug #12402]' - v = bug - v = raise(v) rescue "ok" - assert_equal("ok", v) - v = bug - v = raise v rescue "ok" - assert_equal("ok", v) + all_assertions(bug) do |a| + a.for("lhs = arg") do + v = bug + v = raise(bug) rescue "ok" + assert_equal("ok", v) + end + a.for("lhs op_asgn arg") do + v = 0 + v += raise(bug) rescue 1 + assert_equal(1, v) + end + a.for("lhs[] op_asgn arg") do + v = [0] + v[0] += raise(bug) rescue 1 + assert_equal([1], v) + end + a.for("lhs.m op_asgn arg") do + k = Struct.new(:m) + v = k.new(0) + v.m += raise(bug) rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs::m op_asgn arg") do + k = Struct.new(:m) + v = k.new(0) + v::m += raise(bug) rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs.C op_asgn arg") do + k = Struct.new(:C) + v = k.new(0) + v.C += raise(bug) rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs::C op_asgn arg") do + v = Class.new + v::C ||= raise(bug) rescue 1 + assert_equal(1, v::C) + end + a.for("lhs = command") do + v = bug + v = raise bug rescue "ok" + assert_equal("ok", v) + end + a.for("lhs op_asgn command") do + v = 0 + v += raise bug rescue 1 + assert_equal(1, v) + end + a.for("lhs[] op_asgn command") do + v = [0] + v[0] += raise bug rescue 1 + assert_equal([1], v) + end + a.for("lhs.m op_asgn command") do + k = Struct.new(:m) + v = k.new(0) + v.m += raise bug rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs::m op_asgn command") do + k = Struct.new(:m) + v = k.new(0) + v::m += raise bug rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs.C op_asgn command") do + k = Struct.new(:C) + v = k.new(0) + v.C += raise bug rescue 1 + assert_equal(k.new(1), v) + end + a.for("lhs::C op_asgn command") do + v = Class.new + v::C ||= raise bug rescue 1 + assert_equal(1, v::C) + end + end end =begin Index: parse.y =================================================================== --- parse.y (revision 55886) +++ parse.y (revision 55887) @@ -1284,12 +1284,12 @@ stmt : keyword_alias fitem {SET_LEX_STA https://github.com/ruby/ruby/blob/trunk/parse.y#L1284 $$ = dispatch2(massign, $1, $3); %*/ } - | var_lhs tOP_ASGN command_call + | var_lhs tOP_ASGN command_rhs { value_expr($3); $$ = new_op_assign($1, $2, $3); } - | primary_value '[' opt_call_args rbracket tOP_ASGN command_call + | primary_value '[' opt_call_args rbracket tOP_ASGN command_rhs { /*%%%*/ NODE *args; @@ -1310,27 +1310,27 @@ stmt : keyword_alias fitem {SET_LEX_STA https://github.com/ruby/ruby/blob/trunk/parse.y#L1310 $$ = dispatch3(opassign, $$, $5, $6); %*/ } - | primary_value call_op tIDENTIFIER tOP_ASGN command_call + | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs { value_expr($5); $$ = new_attr_op_assign($1, $2, $3, $4, $5); } - | primary_value call_op tCONSTANT tOP_ASGN command_call + | primary_value call_op tCONSTANT tOP_ASGN command_rhs { value_expr($5); $$ = new_attr_op_assign($1, $2, $3, $4, $5); } - | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs { $$ = const_path_field($1, $3); $$ = new_const_op_assign($$, $4, $5); } - | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs { value_expr($5); $$ = new_attr_op_assign($1, idCOLON2, $3, $4, $5); } - | backref tOP_ASGN command_call + | backref tOP_ASGN command_rhs { $1 = var_field($1); $$ = backref_assign_error($1, node_assign($1, $3)); @@ -2002,7 +2002,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2002 { $$ = new_op_assign($1, $2, $3); } - | primary_value '[' opt_call_args rbracket tOP_ASGN arg + | primary_value '[' opt_call_args rbracket tOP_ASGN arg_rhs { /*%%%*/ NODE *args; @@ -2028,32 +2028,32 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2028 $$ = dispatch3(opassign, $1, $5, $6); %*/ } - | primary_value call_op tIDENTIFIER tOP_ASGN arg + | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs { value_expr($5); $$ = new_attr_op_assign($1, $2, $3, $4, $5); } - | primary_value call_op tCONSTANT tOP_ASGN arg + | primary_value call_op tCONSTANT tOP_ASGN arg_rhs { value_expr($5); $$ = new_attr_op_assign($1, $2, $3, $4, $5); } - | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs { value_expr($5); $$ = new_attr_op_assign($1, idCOLON2, $3, $4, $5); } - | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs { $$ = const_path_field($1, $3); $$ = new_const_op_assign($$, $4, $5); } - | tCOLON3 tCONSTANT tOP_ASGN arg + | tCOLON3 tCONSTANT tOP_ASGN arg_rhs { $$ = top_const_field($2); $$ = new_const_op_assign($$, $3, $4); } - | backref tOP_ASGN arg + | backref tOP_ASGN arg_rhs { $1 = var_field($1); $$ = backref_assign_error($1, new_op_assign($1, $2, $3)); Index: ChangeLog =================================================================== --- ChangeLog (revision 55886) +++ ChangeLog (revision 55887) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sat Aug 13 10:52:19 2016 Nobuyoshi Nakada <nobu@r...> + + * parse.y (stmt, arg): rescue modifier in command op assignment + should be limited to rhs only. [ruby-core:75621] [Bug #12402] + Sat Aug 13 07:51:40 2016 Masaki Suketa <masaki.suketa@n...> * ext/win32ole/win32ole.c (ole_val2variant): fix integer conversion in -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/