1assert_equal %q{[1, 2, 4, 5, 6, 7, 8]}, %q{$a = []; begin;  ; $a << 1
2  [1,2].each{; $a << 2
3    break; $a << 3
4  }; $a << 4
5  begin; $a << 5
6  ensure; $a << 6
7  end; $a << 7
8; $a << 8
9; rescue Exception; $a << 99; end; $a}
10assert_equal %q{[1, 2, 3, 5, 6, 7, 8]}, %q{$a = []; begin;  ; $a << 1
11  begin; $a << 2
12    [1,2].each do; $a << 3
13      break; $a << 4
14    end; $a << 5
15  ensure; $a << 6
16  end; $a << 7
17; $a << 8
18; rescue Exception; $a << 99; end; $a}
19assert_equal %q{ok}, %q{
20  ["a"].inject("ng"){|x,y|
21    break :ok
22  }
23}
24assert_equal %q{ok}, %q{
25  unless ''.respond_to? :lines
26    class String
27      def lines
28        self
29      end
30    end
31  end
32
33  ('a').lines.map{|e|
34    break :ok
35  }
36}
37assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1
38  ["a"].inject("ng"){|x,y|; $a << 2
39    break :ok; $a << 3
40  }; $a << 4
41; $a << 5
42; rescue Exception; $a << 99; end; $a}
43assert_equal %q{[1, 2, 4, 5]}, %q{$a = []; begin; ; $a << 1
44  ('a'..'b').map{|e|; $a << 2
45    break :ok; $a << 3
46  }; $a << 4
47; $a << 5
48; rescue Exception; $a << 99; end; $a}
49assert_equal %q{[1, 2, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
50  [1,2].each do; $a << 2
51    begin; $a << 3
52      break; $a << 4
53    ensure; $a << 5
54    end; $a << 6
55  end; $a << 7
56; $a << 8
57; rescue Exception; $a << 99; end; $a}
58assert_equal %q{[1, 2, 3, 4, 5, 6, 9, 10]}, %q{$a = []; begin; ; $a << 1
59  i=0; $a << 2
60  while i<3; $a << 3
61    i+=1; $a << 4
62    begin; $a << 5
63    ensure; $a << 6
64      break; $a << 7
65    end; $a << 8
66  end; $a << 9
67; $a << 10
68; rescue Exception; $a << 99; end; $a}
69assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1
70  i=0; $a << 2
71  while i<3; $a << 3
72    i+=1; $a << 4
73    begin; $a << 5
74      raise; $a << 6
75    ensure; $a << 7
76      break; $a << 8
77    end; $a << 9
78  end; $a << 10
79; $a << 11
80; rescue Exception; $a << 99; end; $a}
81assert_equal %q{[1, 2, 3, 4, 5, 7, 10, 11]}, %q{$a = []; begin; ; $a << 1
82  i=0; $a << 2
83  while i<3; $a << 3
84    i+=1; $a << 4
85    begin; $a << 5
86      raise; $a << 6
87    rescue; $a << 7
88      break; $a << 8
89    end; $a << 9
90  end; $a << 10
91; $a << 11
92; rescue Exception; $a << 99; end; $a}
93assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin;  ; $a << 1
94  [1,2].each do; $a << 2
95    begin; $a << 3
96      raise StandardError; $a << 4
97    ensure; $a << 5
98      break; $a << 6
99    end; $a << 7
100  end; $a << 8
101; $a << 9
102; rescue Exception; $a << 99; end; $a}
103assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin;  ; $a << 1
104  [1,2].each do; $a << 2
105    begin; $a << 3
106      raise StandardError; $a << 4
107    rescue; $a << 5
108      break; $a << 6
109    end; $a << 7
110  end; $a << 8
111; $a << 9
112; rescue Exception; $a << 99; end; $a}
113assert_equal %q{[1, 2, 3, 4, 6, 8, 10, 11]}, %q{$a = []; begin;  ; $a << 1
114  [1,2].each do; $a << 2
115    begin; $a << 3
116      begin; $a << 4
117        break; $a << 5
118      ensure; $a << 6
119      end; $a << 7
120    ensure; $a << 8
121    end; $a << 9
122  end; $a << 10
123; $a << 11
124; rescue Exception; $a << 99; end; $a}
125assert_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
126  i = 0; $a << 2
127  while i<3; $a << 3
128    i+=1; $a << 4
129    j = 0; $a << 5
130    while j<3; $a << 6
131      j+=1; $a << 7
132      begin; $a << 8
133        raise; $a << 9
134      rescue; $a << 10
135        break; $a << 11
136      end; $a << 12
137    end; $a << 13
138  end; $a << 14
139; $a << 15
140; rescue Exception; $a << 99; end; $a}
141assert_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
142  i = 0; $a << 2
143  while i<3; $a << 3
144    i+=1; $a << 4
145    j = 0; $a << 5
146    while j<3; $a << 6
147      j+=1; $a << 7
148      1.times{; $a << 8
149        begin; $a << 9
150          raise; $a << 10
151        rescue; $a << 11
152          break; $a << 12
153        end; $a << 13
154      }; $a << 14
155    end; $a << 15
156  end; $a << 16
157; $a << 17
158; rescue Exception; $a << 99; end; $a}
159assert_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
160  i = 0; $a << 2
161  while i<3; $a << 3
162    i+=1; $a << 4
163    j = 0; $a << 5
164    while j<3; $a << 6
165      j+=1; $a << 7
166      begin; $a << 8
167        raise; $a << 9
168      ensure; $a << 10
169        break; $a << 11
170      end; $a << 12
171    end; $a << 13
172  end; $a << 14
173; $a << 15
174; rescue Exception; $a << 99; end; $a}
175assert_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
176  i = 0; $a << 2
177  while i<3; $a << 3
178    i+=1; $a << 4
179    j = 0; $a << 5
180    while j<3; $a << 6
181      j+=1; $a << 7
182      1.times{; $a << 8
183        begin; $a << 9
184          raise; $a << 10
185        ensure; $a << 11
186          break; $a << 12
187        end; $a << 13
188      }; $a << 14
189    end; $a << 15
190  end; $a << 16
191; $a << 17
192; rescue Exception; $a << 99; end; $a}
193assert_equal %q{[1, 2, 3, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
194  while true; $a << 2
195    begin; $a << 3
196      break; $a << 4
197    ensure; $a << 5
198      break; $a << 6
199    end; $a << 7
200  end; $a << 8
201; $a << 9
202; rescue Exception; $a << 99; end; $a}
203assert_equal %q{[1, 2, 3, 5, 99]}, %q{
204$a = [];
205begin; ; $a << 1
206  while true; $a << 2
207    begin; $a << 3
208      break; $a << 4
209    ensure; $a << 5
210      raise; $a << 6
211    end; $a << 7
212  end; $a << 8
213; $a << 9
214; rescue Exception; $a << 99; end; $a}
215assert_equal %q{[1, 2, 3, 4, 6, 8, 9, 10, 11]}, %q{$a = []; begin;  ; $a << 1
216  begin; $a << 2
217    [1,2].each do; $a << 3
218      begin; $a << 4
219        break; $a << 5
220      ensure; $a << 6
221      end; $a << 7
222    end; $a << 8
223  ensure; $a << 9
224  end; $a << 10
225; $a << 11
226; rescue Exception; $a << 99; end; $a}
227assert_equal %q{[1, 2, 4, 99]}, %q{$a = []; begin; ; $a << 1
228  begin; $a << 2
229    raise StandardError; $a << 3
230  ensure; $a << 4
231  end; $a << 5
232; $a << 6
233; rescue Exception; $a << 99; end; $a}
234assert_equal %q{[1, 2, 3, 4]}, %q{$a = []; begin;  ; $a << 1
235  begin; $a << 2
236  ensure; $a << 3
237  end ; $a << 4
238; rescue Exception; $a << 99; end; $a}
239assert_equal %q{[1, 2, 3, 5, 99]}, %q{$a = []; begin;  ; $a << 1
240  [1,2].each do; $a << 2
241    begin; $a << 3
242      break; $a << 4
243    ensure; $a << 5
244      raise StandardError; $a << 6
245    end; $a << 7
246  end; $a << 8
247; $a << 9
248; rescue Exception; $a << 99; end; $a}
249assert_equal %q{3}, %q{
250  def m a, b
251    a + b
252  end
253  m(1,
254    while true
255      break 2
256    end
257    )
258}
259assert_equal %q{4}, %q{
260  def m a, b
261    a + b
262  end
263  m(1,
264    (i=0; while i<2
265       i+=1
266       class C
267         next 2
268       end
269     end; 3)
270    )
271}
272assert_equal %q{34}, %q{
273  def m a, b
274    a+b
275  end
276  m(1, 1.times{break 3}) +
277  m(10, (1.times{next 3}; 20))
278}
279assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
280  3.times{; $a << 2
281    class C; $a << 3
282      break; $a << 4
283    end; $a << 5
284  }; $a << 6
285; $a << 7
286; rescue Exception; $a << 99; end; $a}
287assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
288  3.times{; $a << 2
289    class A; $a << 3
290      class B; $a << 4
291        break; $a << 5
292      end; $a << 6
293    end; $a << 7
294  }; $a << 8
295; $a << 9
296; rescue Exception; $a << 99; end; $a}
297assert_equal %q{[1, 2, 3, 2, 3, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
298  3.times{; $a << 2
299    class C; $a << 3
300      next; $a << 4
301    end; $a << 5
302  }; $a << 6
303; $a << 7
304; rescue Exception; $a << 99; end; $a}
305assert_equal %q{[1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
306  3.times{; $a << 2
307    class C; $a << 3
308      class D; $a << 4
309        next; $a << 5
310      end; $a << 6
311    end; $a << 7
312  }; $a << 8
313; $a << 9
314; rescue Exception; $a << 99; end; $a}
315assert_equal %q{[1, 2, 3, 6, 7]}, %q{$a = []; begin; ; $a << 1
316  while true; $a << 2
317    class C; $a << 3
318      break; $a << 4
319    end; $a << 5
320  end; $a << 6
321; $a << 7
322; rescue Exception; $a << 99; end; $a}
323assert_equal %q{[1, 2, 3, 4, 8, 9]}, %q{$a = []; begin; ; $a << 1
324  while true; $a << 2
325    class C; $a << 3
326      class D; $a << 4
327        break; $a << 5
328      end; $a << 6
329    end; $a << 7
330  end; $a << 8
331; $a << 9
332; rescue Exception; $a << 99; end; $a}
333assert_equal %q{[1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
334  i=0; $a << 2
335  while i<3; $a << 3
336    i+=1; $a << 4
337    class C; $a << 5
338      next 10; $a << 6
339    end; $a << 7
340  end; $a << 8
341; $a << 9
342; rescue Exception; $a << 99; end; $a}
343assert_equal %q{1}, %q{
344  1.times{
345    while true
346      class C
347        begin
348          break
349        ensure
350          break
351        end
352      end
353    end
354  }
355}
356assert_equal %q{[1, 2, 3, 5, 2, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
357  [1,2].each do; $a << 2
358    begin; $a << 3
359      next; $a << 4
360    ensure; $a << 5
361    end; $a << 6
362  end; $a << 7
363; $a << 8
364; rescue Exception; $a << 99; end; $a}
365assert_equal %q{[1, 2, 6, 3, 5, 7, 8]}, %q{$a = []; begin;  ; $a << 1
366  o = "test"; $a << 2
367  def o.test(a); $a << 3
368    return a; $a << 4
369  ensure; $a << 5
370  end; $a << 6
371  o.test(123); $a << 7
372; $a << 8
373; rescue Exception; $a << 99; end; $a}
374assert_equal %q{[1, 4, 7, 5, 8, 9]}, %q{$a = []; begin; ; $a << 1
375  def m1 *args; $a << 2
376    ; $a << 3
377  end; $a << 4
378  def m2; $a << 5
379    m1(:a, :b, (return 1; :c)); $a << 6
380  end; $a << 7
381  m2; $a << 8
382; $a << 9
383; rescue Exception; $a << 99; end; $a}
384assert_equal %q{[1, 8, 2, 3, 4, 5, 9, 10]}, %q{$a = []; begin; ; $a << 1
385  def m(); $a << 2
386    begin; $a << 3
387      2; $a << 4
388    ensure; $a << 5
389      return 3; $a << 6
390    end; $a << 7
391  end; $a << 8
392  m; $a << 9
393; $a << 10
394; rescue Exception; $a << 99; end; $a}
395assert_equal %q{[1, 3, 11, 4, 5, 6, 7, 12, 13]}, %q{$a = []; begin; ; $a << 1
396  def m2; $a << 2
397  end; $a << 3
398  def m(); $a << 4
399    m2(begin; $a << 5
400         2; $a << 6
401       ensure; $a << 7
402         return 3; $a << 8
403       end); $a << 9
404    4; $a << 10
405  end; $a << 11
406  m(); $a << 12
407; $a << 13
408; rescue Exception; $a << 99; end; $a}
409assert_equal %q{[1, 16, 2, 3, 4, 5, 6, 7, 10, 11, 17, 18]}, %q{$a = []; begin; ; $a << 1
410  def m; $a << 2
411    1; $a << 3
412    1.times{; $a << 4
413      2; $a << 5
414      begin; $a << 6
415        3; $a << 7
416        return; $a << 8
417        4; $a << 9
418      ensure; $a << 10
419        5; $a << 11
420      end; $a << 12
421      6; $a << 13
422    }; $a << 14
423    7; $a << 15
424  end; $a << 16
425  m(); $a << 17
426; $a << 18
427; rescue Exception; $a << 99; end; $a}
428assert_equal %q{[:ok, :ok2, :last]}, %q{
429  a = []
430  i = 0
431  begin
432    while i < 1
433      i+=1
434      begin
435        begin
436          next
437        ensure
438          a << :ok
439        end
440      ensure
441        a << :ok2
442      end
443    end
444  ensure
445    a << :last
446  end
447  a
448}
449assert_equal %q{[:ok, :ok2, :last]}, %q{
450  a = []
451  i = 0
452  begin
453    while i < 1
454      i+=1
455      begin
456        begin
457          break
458        ensure
459          a << :ok
460        end
461      ensure
462        a << :ok2
463      end
464    end
465  ensure
466    a << :last
467  end
468  a
469}
470assert_equal %q{[:ok, :ok2, :last]}, %q{
471  a = []
472  i = 0
473  begin
474    while i < 1
475      if i>0
476        break
477      end
478      i+=1
479      begin
480        begin
481          redo
482        ensure
483          a << :ok
484        end
485      ensure
486        a << :ok2
487      end
488    end
489  ensure
490    a << :last
491  end
492  a
493}
494assert_equal %Q{ENSURE\n}, %q{
495  def test
496    while true
497      return
498    end
499  ensure
500    puts("ENSURE")
501  end
502  test
503}, '[ruby-dev:37967]'
504
505[['[ruby-core:28129]', %q{
506  class Bug2728
507    include Enumerable
508    define_method(:dynamic_method) do
509      "dynamically defined method"
510    end
511    def each
512      begin
513        yield :foo
514      ensure
515        dynamic_method
516      end
517    end
518  end
519  e = Bug2728.new
520}],
521 ['[ruby-core:28132]', %q{
522  class Bug2729
523    include Enumerable
524    def each
525      begin
526        yield :foo
527      ensure
528        proc {}.call
529      end
530    end
531  end
532  e = Bug2729.new
533}],
534 ['[ruby-core:39125]', %q{
535  class Bug5234
536    include Enumerable
537    def each
538      begin
539        yield :foo
540      ensure
541        proc
542      end
543    end
544  end
545  e = Bug5234.new
546}],
547 ['[ruby-dev:45656]', %q{
548  class Bug6460
549    include Enumerable
550    def each
551      begin
552        yield :foo
553      ensure
554        1.times { Proc.new }
555      end
556    end
557  end
558  e = Bug6460.new
559}]].each do |bug, src|
560  assert_equal "foo", src + %q{e.detect {true}}, bug
561  assert_equal "true", src + %q{e.any? {true}}, bug
562  assert_equal "false", src + %q{e.all? {false}}, bug
563  assert_equal "true", src + %q{e.include?(:foo)}, bug
564end
565
566assert_equal "foo", %q{
567  class Bug6460
568    def m1
569      m2 {|e|
570        return e
571      }
572    end
573
574    def m2
575      begin
576        yield :foo
577      ensure
578        begin
579          begin
580            yield :foo
581          ensure
582            Proc.new
583            raise ''
584          end
585        rescue
586        end
587      end
588    end
589  end
590  Bug6460.new.m1
591}, '[ruby-dev:46372]'
592