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

/*@testedFeatures=checks*/
library test;

abstract class I<T> {
  void f1(T /*@covariance=genericImpl*/ x);
  void f2(T /*@covariance=genericImpl*/ x);
}

class C<U> implements I<int> {
  void f1(int /*@covariance=genericImpl*/ x) {}
  void f2(int /*@covariance=genericImpl*/ x,
      [U /*@covariance=genericImpl*/ y]) {}
}

class D<U> extends C<U> {
  void f1(int /*@covariance=genericImpl*/ x) {}
  void f2(int /*@covariance=genericImpl*/ x,
      [U /*@covariance=genericImpl*/ y]) {}
}

void g1(C<num> c) {
  c.f1(1);
}

void g2(I<num> i) {
  i.f1(1.5);
}

void g3(C<num> c) {
  c.f2(1, 1.5);
}

void g4(D<num> d) {
  d.f1(1);
}

void g5(D<num> d) {
  d.f2(1, 1.5);
}

void test() {
  g2(new C<num>());
}

void main() {}
