|  | // Copyright (c) 2021, 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. | 
|  |  | 
|  | // -------------------------------- Gives hint. ------------------------------- | 
|  |  | 
|  | class A<X> {} | 
|  |  | 
|  | typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y); | 
|  |  | 
|  | foo1a(F<A<dynamic>, A<Never>> x) {} | 
|  | foo1b(F x) {} | 
|  |  | 
|  | foo2a<X extends F<A<dynamic>, A<Never>>>() {} | 
|  | foo2b<X extends F>() {} | 
|  |  | 
|  | class Foo3a<X extends F<A<dynamic>, A<Never>>> {} | 
|  |  | 
|  | class Foo3b<X extends F> {} | 
|  |  | 
|  | F<A<dynamic>, A<Never>> foo4a() => throw 42; | 
|  | F foo4b() => throw 42; | 
|  |  | 
|  | foo5a({required F<A<dynamic>, A<Never>> x}) {} | 
|  | foo5b({required F x}) {} | 
|  |  | 
|  | foo6a() { | 
|  | F<A<dynamic>, A<Never>> x; | 
|  | for (F<A<dynamic>, A<Never>> x in []) {} | 
|  | fooFoo1(F<A<dynamic>, A<Never>> x) {} | 
|  | fooFoo2<X extends F<A<dynamic>, A<Never>>>() {} | 
|  | F<A<dynamic>, A<Never>> fooFoo4() => throw 42; | 
|  | fooFoo5({required F<A<dynamic>, A<Never>> x}) {} | 
|  | fooFoo7([F<A<dynamic>, A<Never>>? x]) {} | 
|  | } | 
|  |  | 
|  | foo6b() { | 
|  | F x; | 
|  | for (F x in []) {} | 
|  | fooFoo1(F x) {} | 
|  | fooFoo2<X extends F>() {} | 
|  | F fooFoo4() => throw 42; | 
|  | fooFoo5({required F x}) {} | 
|  | fooFoo7([F? x]) {} | 
|  | } | 
|  |  | 
|  | foo7a([F<A<dynamic>, A<Never>>? x]) {} | 
|  | foo7b([F? x]) {} | 
|  |  | 
|  | // ---------------------------- Doesn't give hint. ---------------------------- | 
|  |  | 
|  | class B<X extends int> {} | 
|  |  | 
|  | bar1(B<num> x) {} | 
|  |  | 
|  | bar2<X extends B<num>>() {} | 
|  |  | 
|  | class Bar3<X extends B<num>> {} | 
|  |  | 
|  | B<num> bar4() => throw 42; | 
|  |  | 
|  | bar5({required B<num> x}) {} | 
|  |  | 
|  | bar6() { | 
|  | B<num> x; | 
|  | for (B<num> x in []) {} | 
|  | barBar1(B<num> x) {} | 
|  | barBar2<X extends B<num>>() {} | 
|  | B<num> barBar4() => throw 42; | 
|  | barBar5({required B<num> x}) {} | 
|  | barBar7([B<num>? x]) {} | 
|  | new B<dynamic>(); | 
|  | new A<B<dynamic>>(); | 
|  | } | 
|  |  | 
|  | bar7([B<num>? x]) {} | 
|  |  | 
|  | class Bar8 extends B<dynamic> {} | 
|  |  | 
|  | main() {} |