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

// 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);

abstract class A {
  void foo(Object n);
}

class C implements A {
  F<Object> get foo => bar(new D<int>());
  //            ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_FIELD_AND_METHOD
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

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

F<Object> bar(D<int> d) => d.m as dynamic;
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());
}
