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