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

// @dart = 2.9

// Note: this test expects a compile error (getter overrides a method), but it
// contains more code than necessary to provoke the compile error.  The reason
// for the extra code is to document the complications that would arise if we
// decided to eliminate the compile error (and allow getters to override
// methods).

import "package:expect/expect.dart";

typedef void F<T>(T t);

class A {
  void foo(Object n);
}

class C implements A {
  F<Object> /*@compile-error=unspecified*/ foo;
}

class D<T> {
  void m(T t) {}
}

F<Object> bar(D<int> d) => d.m;
void baz(A a) {
  Expect.throws(() {
    // This call looks like it doesn't require any runtime type checking, since
    // it is a call to a regular method with no covariant parameters.  However,
    // if we decide to allow getters to override methods, then it's possible
    // that it's actually invoking a getter that returns a closure, and that
    // closure might have covariant parameters that need runtime type checks.
    a.foo('hi');
  });
  // This call is ok because the types match up at runtime.
  a.foo(1);
}

main() {
  baz(new C()..foo = bar(new D<int>()));
}
