assert_equal %q{[1, 2, 4, 5, 6, 7, 8]}, %q{$a = []; begin; ; $a << 1 [1,2].each{; $a << 2 break; $a << 3 }; $a << 4 begin; $a << 5 ensure; $a << 6 end; $a << 7 ; $a << 8 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 6, 7, 8]}, %q{$a = []; begin; ; $a << 1 begin; $a << 2 [1,2].each do; $a << 3 break; $a << 4 end; $a << 5 ensure; $a << 6 end; $a << 7 ; $a << 8 ; rescue Exception; $a << 99; end; $a} assert_equal %q{ok}, %q{ ["a"].inject("ng"){|x,y| break :ok } } assert_equal %q{ok}, %q{ unless ''.respond_to? :lines class String def lines self end end end ('a').lines.map{|e| break :ok } } assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1 ["a"].inject("ng"){|x,y|; $a << 2 break :ok; $a << 3 }; $a << 4 ; $a << 5 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1 ('a'..'b').map{|e|; $a << 2 break :ok; $a << 3 }; $a << 4 ; $a << 5 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 7, 8]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 break; $a << 4 ensure; $a << 5 end; $a << 6 end; $a << 7 ; $a << 8 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 6, 9, 10]}, %q{$a = []; begin; ; $a << 1 i=0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 begin; $a << 5 ensure; $a << 6 break; $a << 7 end; $a << 8 end; $a << 9 ; $a << 10 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1 i=0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 begin; $a << 5 raise; $a << 6 ensure; $a << 7 break; $a << 8 end; $a << 9 end; $a << 10 ; $a << 11 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1 i=0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 begin; $a << 5 raise; $a << 6 rescue; $a << 7 break; $a << 8 end; $a << 9 end; $a << 10 ; $a << 11 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 raise StandardError; $a << 4 ensure; $a << 5 break; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 raise StandardError; $a << 4 rescue; $a << 5 break; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 6, 8, 10, 11]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 begin; $a << 4 break; $a << 5 ensure; $a << 6 end; $a << 7 ensure; $a << 8 end; $a << 9 end; $a << 10 ; $a << 11 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15]}, %q{$a = []; begin; ; $a << 1 i = 0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 j = 0; $a << 5 while j<3; $a << 6 j+=1; $a << 7 begin; $a << 8 raise; $a << 9 rescue; $a << 10 break; $a << 11 end; $a << 12 end; $a << 13 end; $a << 14 ; $a << 15 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 16, 17]}, %q{$a = []; begin; ; $a << 1 i = 0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 j = 0; $a << 5 while j<3; $a << 6 j+=1; $a << 7 1.times{; $a << 8 begin; $a << 9 raise; $a << 10 rescue; $a << 11 break; $a << 12 end; $a << 13 }; $a << 14 end; $a << 15 end; $a << 16 ; $a << 17 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15]}, %q{$a = []; begin; ; $a << 1 i = 0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 j = 0; $a << 5 while j<3; $a << 6 j+=1; $a << 7 begin; $a << 8 raise; $a << 9 ensure; $a << 10 break; $a << 11 end; $a << 12 end; $a << 13 end; $a << 14 ; $a << 15 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 3, 4, 5, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 6, 7, 8, 9, 11, 14, 15, 16, 17]}, %q{$a = []; begin; ; $a << 1 i = 0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 j = 0; $a << 5 while j<3; $a << 6 j+=1; $a << 7 1.times{; $a << 8 begin; $a << 9 raise; $a << 10 ensure; $a << 11 break; $a << 12 end; $a << 13 }; $a << 14 end; $a << 15 end; $a << 16 ; $a << 17 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1 while true; $a << 2 begin; $a << 3 break; $a << 4 ensure; $a << 5 break; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 99]}, %q{ $a = []; begin; ; $a << 1 while true; $a << 2 begin; $a << 3 break; $a << 4 ensure; $a << 5 raise; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 6, 8, 9, 10, 11]}, %q{$a = []; begin; ; $a << 1 begin; $a << 2 [1,2].each do; $a << 3 begin; $a << 4 break; $a << 5 ensure; $a << 6 end; $a << 7 end; $a << 8 ensure; $a << 9 end; $a << 10 ; $a << 11 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 4, 99]}, %q{$a = []; begin; ; $a << 1 begin; $a << 2 raise StandardError; $a << 3 ensure; $a << 4 end; $a << 5 ; $a << 6 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4]}, %q{$a = []; begin; ; $a << 1 begin; $a << 2 ensure; $a << 3 end ; $a << 4 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 5, 99]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 break; $a << 4 ensure; $a << 5 raise StandardError; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{3}, %q{ def m a, b a + b end m(1, while true break 2 end ) } assert_equal %q{4}, %q{ def m a, b a + b end m(1, (i=0; while i<2 i+=1 class C next 2 end end; 3) ) } assert_equal %q{34}, %q{ def m a, b a+b end m(1, 1.times{break 3}) + m(10, (1.times{next 3}; 20)) } assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1 3.times{; $a << 2 class C; $a << 3 break; $a << 4 end; $a << 5 }; $a << 6 ; $a << 7 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1 3.times{; $a << 2 class A; $a << 3 class B; $a << 4 break; $a << 5 end; $a << 6 end; $a << 7 }; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 2, 3, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1 3.times{; $a << 2 class C; $a << 3 next; $a << 4 end; $a << 5 }; $a << 6 ; $a << 7 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1 3.times{; $a << 2 class C; $a << 3 class D; $a << 4 next; $a << 5 end; $a << 6 end; $a << 7 }; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1 while true; $a << 2 class C; $a << 3 break; $a << 4 end; $a << 5 end; $a << 6 ; $a << 7 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1 while true; $a << 2 class C; $a << 3 class D; $a << 4 break; $a << 5 end; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1 i=0; $a << 2 while i<3; $a << 3 i+=1; $a << 4 class C; $a << 5 next 10; $a << 6 end; $a << 7 end; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{1}, %q{ 1.times{ while true class C begin break ensure break end end end } } assert_equal %q{[1, 2, 3, 5, 2, 3, 5, 7, 8]}, %q{$a = []; begin; ; $a << 1 [1,2].each do; $a << 2 begin; $a << 3 next; $a << 4 ensure; $a << 5 end; $a << 6 end; $a << 7 ; $a << 8 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 2, 6, 3, 5, 7, 8]}, %q{$a = []; begin; ; $a << 1 o = "test"; $a << 2 def o.test(a); $a << 3 return a; $a << 4 ensure; $a << 5 end; $a << 6 o.test(123); $a << 7 ; $a << 8 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 4, 7, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1 def m1 *args; $a << 2 ; $a << 3 end; $a << 4 def m2; $a << 5 m1(:a, :b, (return 1; :c)); $a << 6 end; $a << 7 m2; $a << 8 ; $a << 9 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 8, 2, 3, 4, 5, 9, 10]}, %q{$a = []; begin; ; $a << 1 def m(); $a << 2 begin; $a << 3 2; $a << 4 ensure; $a << 5 return 3; $a << 6 end; $a << 7 end; $a << 8 m; $a << 9 ; $a << 10 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 3, 11, 4, 5, 6, 7, 12, 13]}, %q{$a = []; begin; ; $a << 1 def m2; $a << 2 end; $a << 3 def m(); $a << 4 m2(begin; $a << 5 2; $a << 6 ensure; $a << 7 return 3; $a << 8 end); $a << 9 4; $a << 10 end; $a << 11 m(); $a << 12 ; $a << 13 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[1, 16, 2, 3, 4, 5, 6, 7, 10, 11, 17, 18]}, %q{$a = []; begin; ; $a << 1 def m; $a << 2 1; $a << 3 1.times{; $a << 4 2; $a << 5 begin; $a << 6 3; $a << 7 return; $a << 8 4; $a << 9 ensure; $a << 10 5; $a << 11 end; $a << 12 6; $a << 13 }; $a << 14 7; $a << 15 end; $a << 16 m(); $a << 17 ; $a << 18 ; rescue Exception; $a << 99; end; $a} assert_equal %q{[:ok, :ok2, :last]}, %q{ a = [] i = 0 begin while i < 1 i+=1 begin begin next ensure a << :ok end ensure a << :ok2 end end ensure a << :last end a } assert_equal %q{[:ok, :ok2, :last]}, %q{ a = [] i = 0 begin while i < 1 i+=1 begin begin break ensure a << :ok end ensure a << :ok2 end end ensure a << :last end a } assert_equal %q{[:ok, :ok2, :last]}, %q{ a = [] i = 0 begin while i < 1 if i>0 break end i+=1 begin begin redo ensure a << :ok end ensure a << :ok2 end end ensure a << :last end a } assert_equal %Q{ENSURE\n}, %q{ def test while true return end ensure puts("ENSURE") end test }, '[ruby-dev:37967]' [['[ruby-core:28129]', %q{ class Bug2728 include Enumerable define_method(:dynamic_method) do "dynamically defined method" end def each begin yield :foo ensure dynamic_method end end end e = Bug2728.new }], ['[ruby-core:28132]', %q{ class Bug2729 include Enumerable def each begin yield :foo ensure proc {}.call end end end e = Bug2729.new }], ['[ruby-core:39125]', %q{ class Bug5234 include Enumerable def each(&block) begin yield :foo ensure proc(&block) end end end e = Bug5234.new }], ['[ruby-dev:45656]', %q{ class Bug6460 include Enumerable def each(&block) begin yield :foo ensure 1.times { Proc.new(&block) } end end end e = Bug6460.new }]].each do |bug, src| assert_equal "foo", src + %q{e.detect {true}}, bug assert_equal "true", src + %q{e.any? {true}}, bug assert_equal "false", src + %q{e.all? {false}}, bug assert_equal "true", src + %q{e.include?(:foo)}, bug end assert_equal "foo", %q{ class Bug6460 def m1 m2 {|e| return e } end def m2 begin yield :foo ensure begin begin yield :foo ensure Proc.new raise '' end rescue end end end end Bug6460.new.m1 }, '[ruby-dev:46372]' assert_equal "foo", %q{ obj = "foo" if obj || any1 any2 = any2 else raise obj.inspect end obj }, '[ruby-core:87830]'