// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// This test ensures that the finally block executes correctly when
// there are throw, break and return statements in the finally block.

class Hello {
 static var sum;

 static foo() {
   sum = 0;
   try {
     sum += 1;
     return 'hi';
   } catch (var e) {
     sum += 1;
     throw 'ball';
     sum += 1;
   } finally {
     sum += 1;
     throw 'ball';
     sum += 1;
   }
 }

 static foo1() {
   bool loop = true;
   sum = 0;
   L:while (loop) {
     try {
       sum += 1;
       return 'hi';
     } catch (var ex) {
       sum += 1;
     } finally {
       try {
         L1:while (loop) {
           sum += 1;
           break L;
           sum += 1;
         }
       } catch (var ex) {
         sum += 1;
       } finally {
         sum += 1;
       }
     }
   }
 }

 static void main() {
   foo1();
   Expect.equals(3, sum);
   try {
     foo();
   } catch (var e) {
   }
   Expect.equals(2, sum);
 }

}

main() {
  Hello.main();
}
