// Copyright (c) 2012, 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.

import "package:expect/expect.dart";

// Test that a call to a bailout method in dart2js resolves to the
// right method.

var reachedAfoo = new C();

class A {
  foo() {
    // Using '++' makes sure there is a type guard.
    reachedAfoo++;
  }
}

class B extends A {
  foo() {
    reachedAfoo++;
    // Call the Expect method after the type guard.
    Expect.fail('Should never reach B.foo');
  }

  bar() {
    super.foo();
  }
}

class C {
  int value = 0;
  operator +(int val) {
    value += val;
    return this;
  }
}

main() {
  // Using a loop makes sure the 'foo' methods will have an optimized
  // version.
  while (reachedAfoo.value != 0) {
    new A().foo();
    new B().foo();
  }
  new B().bar();
  Expect.equals(1, reachedAfoo.value);
}
