|  | // 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. | 
|  |  | 
|  | // This test exercises a corner case of override checking that is safe from a | 
|  | // soundness perspective, but which we haven't decided whether or not to allow | 
|  | // from a usability perspective. | 
|  |  | 
|  | class A { | 
|  | void foo() {} | 
|  | } | 
|  |  | 
|  | abstract class I { | 
|  | void foo([x]); | 
|  | } | 
|  |  | 
|  | abstract class B extends A implements I { | 
|  | // If this class were concrete, there would be a problem, since `new | 
|  | // B().foo(42)` would be statically allowed, but would lead to invalid | 
|  | // arguments being passed to A.foo.  But since the class is abstract, there is | 
|  | // no problem. | 
|  | } | 
|  |  | 
|  | class C extends B { | 
|  | void foo([x]) { | 
|  | super.foo(); | 
|  | } | 
|  | } | 
|  |  | 
|  | void f(B b) { | 
|  | b.foo(42); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | f(new C()); | 
|  | } |