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

/**
 * @assertion An on-catch clause of the form on T catch (p1) s is equivalent to
 * an on-catch clause on T catch (p1, p2) s where p2 is an identiier that does
 * not occur anywhere else in the program.
 * @description Checks that it is not an error when the least specific catch
 * clause is placed first, followed by more specific, and therefore redundant,
 * catch clauses and that an exception can not be caught with clauses that don't
 * match.
 * @author iefremov
 */
import '../../../Utils/expect.dart';

class A {}
class B extends A {}
class C extends B {}

main() {
  try {
    try {
      throw new Object();
    } on A catch (ex) {
      Expect.fail("This clause shouldn't be executed");
    } on B catch (ex) {
      Expect.fail ("This clause shouldn't be executed");
    } on C catch (ex) {
      Expect.fail ("This clause shouldn't be executed");
    }
  } on Object catch (o) {}
}
