// Copyright (c) 2017, 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";

class A {}

class B extends A {}

class C {
  void f(B x, B y) {}
}

abstract class I1 {
  void f(covariant A x, B y);
}

// D contains a forwarding stub for f which ensures that `x` is type checked.
class D extends C implements I1 {}

abstract class I2 {
  void f(B x, covariant A y);
}

// E contains a forwarding stub for f which ensures that `y` is type checked.
class E extends D implements I2 {}

main() {
  E e = new E();
  C c = e;
  I1 i1 = e;
  D d = e;
  I2 i2 = e;
  A a = new A();
  B b = new B();
  c.f(b, b); // No error
  i1.f(b, b); // No error
  d.f(b, b); // No error
  i2.f(b, b); // No error
  e.f(b, b); // No error
  Expect.throwsTypeError(() {
    i1.f(a, b);
  });
  Expect.throwsTypeError(() {
    d.f(a, b);
  });
  Expect.throwsTypeError(() {
    i2.f(b, a);
  });
  Expect.throwsTypeError(() {
    e.f(a, b);
  });
  Expect.throwsTypeError(() {
    e.f(b, a);
  });
}
