// 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.

// @dart = 2.9

import "package:expect/expect.dart";

class Hello {
  static var sum;

  static foo() {
    sum = 0;
    try {
      sum += 1;
      return 'hi';
    } catch (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 (ex) {
        sum += 1;
      } finally {
        try {
          L1:
          while (loop) {
            sum += 1;
            break L;
            sum += 1;
          }
        } catch (ex) {
          sum += 1;
        } finally {
          sum += 1;
        }
      }
    }
  }

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

main() {
  Hello.main();
}
