| // 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. | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 |  | 
 | void foo(F f<F>(F f)) {} | 
 |  | 
 | B bar<B>(B g<F>(F f)) => throw "uncalled"; | 
 |  | 
 | Function baz<B>() { | 
 |   B foo<F>(B b, F f) => throw "uncalled"; | 
 |   return foo; | 
 | } | 
 |  | 
 | class C<T> { | 
 |   void foo(F f<F>(T t, F f)) => null; | 
 |   B bar<B>(B g<F>(T t, F f)) => throw "uncalled"; | 
 |   Function baz<B>() { | 
 |     B foo<F>(T t, F f) => throw "uncalled"; | 
 |     return foo; | 
 |   } | 
 | } | 
 |  | 
 | main() { | 
 |   // Check the run-time type of the functions with generic parameters. | 
 |  | 
 |   Expect.type<void Function(X Function<X>(X))>(foo); | 
 |  | 
 |   Expect.isTrue(bar is X1 Function<X1>(X1 Function<X2>(X2))); | 
 |  | 
 |   Expect.isTrue(baz<int>() is int Function<X1>(int, X1)); | 
 |   Expect.isTrue(baz<Object>() is Object Function<X1>(Object, X1)); | 
 |   Expect.isTrue(baz<Null>() is Null Function<X1>(Null, X1)); | 
 |  | 
 |   void testC<T>() { | 
 |     var c = new C<T>(); | 
 |  | 
 |     Expect.type<void Function(F Function<F>(T, F))>(c.foo); | 
 |  | 
 |     Expect.isTrue(c.bar is X1 Function<X1>(X1 Function<X2>(T, X2))); | 
 |  | 
 |     Expect.isTrue(c.baz<int>() is int Function<X1>(T, X1)); | 
 |   } | 
 |  | 
 |   testC<bool>(); | 
 |   testC<Object>(); | 
 |   testC<Null>(); | 
 | } |