// Copyright (c) 2016, 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.

// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.

import 'dart:core';
import 'dart:core' as core;
import 'package:expect/expect.dart';

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
confuse(f) => f;

void _voidFunction() {}

typedef F0<T> = Function Function(int x);
typedef F1<T> = List<Function> Function(List<T> x);
typedef F2<T> = List<T> Function(int y, {List<Function> x});
typedef F3<T> = void Function(int, {Function x});
typedef F4<T> = void Function<A>(int x);
typedef F5<T> = int Function([List<Function> x]) Function();
typedef F6<T> = int Function(List<T>) Function();
typedef F7<T> = Function Function(int, [Function]) Function();
typedef F8<T> = Function Function(int, {core.List<core.int> x}) Function();
typedef F9<T> = List<Function> Function(Function x) Function();
typedef F10<T> = List<Function> Function(int y, [core.List<core.int> x])
    Function();
typedef F11<T> = core.List<core.int> Function([int]) Function();
typedef F12<T> = core.List<core.int> Function({List<Function> x}) Function();
typedef F13<T> = core.List<core.int> Function() Function();
typedef F14<T> = List<T> Function(int, [List<Function> x]) Function();
typedef F15<T> = List<T> Function([List<T>]) Function();
typedef F16<T> = Function(int x, [Function]) Function();
typedef F17<T> = Function(int y, {core.List<core.int> x}) Function();
typedef F18<T> = void Function([Function x]) Function();
typedef F19<T> = void Function(core.List<core.int>) Function();
typedef F20<T> = int Function<A>(A x) Function();
typedef F21<T> = core.List<core.int> Function<A>(List<A> x) Function();
typedef F22<T> = List<A> Function<A>(int x) Function();

Function f0(int x) => throw 'uncalled';
List<Function> f1(List<int> x) => throw 'uncalled';
List<int> f2(int y, {List<Function> x = const []}) => throw 'uncalled';
void f3(int x0, {Function x = _voidFunction}) => throw 'uncalled';
void f4<A>(int x) => throw 'uncalled';
int Function([List<Function> x]) f5() => throw 'uncalled';
int Function(List<int>) f6() => throw 'uncalled';
Function Function(int, [Function]) f7() => throw 'uncalled';
Function Function(int, {core.List<core.int> x}) f8() => throw 'uncalled';
List<Function> Function(Function x) f9() => throw 'uncalled';
List<Function> Function(int y, [core.List<core.int> x]) f10() =>
    throw 'uncalled';
core.List<core.int> Function([int]) f11() => throw 'uncalled';
core.List<core.int> Function({List<Function> x}) f12() => throw 'uncalled';
core.List<core.int> Function() f13() => throw 'uncalled';
List<int> Function(int, [List<Function> x]) f14() => throw 'uncalled';
List<int> Function([List<int>]) f15() => throw 'uncalled';
Function(int x, [Function]) f16() => throw 'uncalled';
Function(int y, {core.List<core.int> x}) f17() => throw 'uncalled';
void Function([Function x]) f18() => throw 'uncalled';
void Function(core.List<core.int>) f19() => throw 'uncalled';
int Function<A>(A x) f20() => throw 'uncalled';
core.List<core.int> Function<A>(List<A> x) f21() => throw 'uncalled';
List<A> Function<A>(int x) f22() => throw 'uncalled';

class U56<T> {
  final bool tIsBool;
  final bool tIsInt;
  final bool tIsDynamic;

  late Function Function(int x) x0;
  late List<Function> Function(List<T> x) x1;
  late List<T> Function(int y, {List<Function> x}) x2;
  late void Function(int, {Function x}) x3;
  late void Function<A>(int x) x4;
  late int Function([List<Function> x]) Function() x5;
  late int Function(List<T>) Function() x6;
  late Function Function(int, [Function]) Function() x7;
  late Function Function(int, {core.List<core.int> x}) Function() x8;
  late List<Function> Function(Function x) Function() x9;
  late List<Function> Function(int y, [core.List<core.int> x]) Function() x10;
  late core.List<core.int> Function([int]) Function() x11;
  late core.List<core.int> Function({List<Function> x}) Function() x12;
  late core.List<core.int> Function() Function() x13;
  late List<T> Function(int, [List<Function> x]) Function() x14;
  late List<T> Function([List<T>]) Function() x15;
  late Function(int x, [Function]) Function() x16;
  late Function(int y, {core.List<core.int> x}) Function() x17;
  late void Function([Function x]) Function() x18;
  late void Function(core.List<core.int>) Function() x19;
  late int Function<A>(A x) Function() x20;
  late core.List<core.int> Function<A>(List<A> x) Function() x21;
  late List<A> Function<A>(int x) Function() x22;

  U56({this.tIsBool: false, this.tIsInt: false})
      : tIsDynamic = !tIsBool && !tIsInt;

  Function m0(int x) => throw 'uncalled';
  List<Function> m1(List<T> x) => throw 'uncalled';
  List<T> m2(int y, {List<Function> x = const []}) => throw 'uncalled';
  void m3(int x0, {Function x = _voidFunction}) => throw 'uncalled';
  void m4<A>(int x) => throw 'uncalled';
  int Function([List<Function> x]) m5() => throw 'uncalled';
  int Function(List<T>) m6() => throw 'uncalled';
  Function Function(int, [Function]) m7() => throw 'uncalled';
  Function Function(int, {core.List<core.int> x}) m8() => throw 'uncalled';
  List<Function> Function(Function x) m9() => throw 'uncalled';
  List<Function> Function(int y, [core.List<core.int> x]) m10() =>
      throw 'uncalled';
  core.List<core.int> Function([int]) m11() => throw 'uncalled';
  core.List<core.int> Function({List<Function> x}) m12() => throw 'uncalled';
  core.List<core.int> Function() m13() => throw 'uncalled';
  List<T> Function(int, [List<Function> x]) m14() => throw 'uncalled';
  List<T> Function([List<T>]) m15() => throw 'uncalled';
  Function(int x, [Function]) m16() => throw 'uncalled';
  Function(int y, {core.List<core.int> x}) m17() => throw 'uncalled';
  void Function([Function x]) m18() => throw 'uncalled';
  void Function(core.List<core.int>) m19() => throw 'uncalled';
  int Function<A>(A x) m20() => throw 'uncalled';
  core.List<core.int> Function<A>(List<A> x) m21() => throw 'uncalled';
  List<A> Function<A>(int x) m22() => throw 'uncalled';

  runTests() {
    testF0();
    testF1();
    testF2();
    testF3();
    testF4();
    testF5();
    testF6();
    testF7();
    testF8();
    testF9();
    testF10();
    testF11();
    testF12();
    testF13();
    testF14();
    testF15();
    testF16();
    testF17();
    testF18();
    testF19();
    testF20();
    testF21();
    testF22();
  }

  /// Function Function(int x)
  void testF0() {
    Expect.isTrue(f0 is F0<int>);
    Expect.isTrue(confuse(f0) is F0<int>);
    // In checked mode, verifies the type.
    Function Function(int x) l0;
    // The static function f0 sets `T` to `int`.
    if (tIsInt) {
      x0 = f0 as dynamic;
      l0 = f0 as dynamic;
      x0 = confuse(f0);
      l0 = confuse(f0);
    }

    Expect.isTrue(m0 is F0<T>);
    Expect.isTrue(m0 is Function Function(int x));
    Expect.isTrue(confuse(m0) is F0<T>);
    // In checked mode, verifies the type.
    x0 = m0;
    l0 = m0;
    x0 = confuse(m0);
    l0 = confuse(m0);
  }

  /// List<Function> Function(List<T> x)
  void testF1() {
    Expect.isTrue(f1 is F1<int>);
    Expect.isTrue(confuse(f1) is F1<int>);
    // In checked mode, verifies the type.
    List<Function> Function(List<T> x) l1;
    // The static function f1 sets `T` to `int`.
    if (tIsInt) {
      x1 = f1 as dynamic;
      l1 = f1 as dynamic;
      x1 = confuse(f1);
      l1 = confuse(f1);
    }

    Expect.isTrue(m1 is F1<T>);
    Expect.isTrue(m1 is List<Function> Function(List<T> x));
    Expect.isTrue(confuse(m1) is F1<T>);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
    // The static function has its T always set to int.
    Expect.isTrue(f1 is F1<int>);
    Expect.isFalse(f1 is F1<bool>);
    Expect.isTrue(confuse(f1) is F1<int>);
    Expect.isFalse(confuse(f1) is F1<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x1 = (f1 as dynamic);
      });
      Expect.throws(() {
        x1 = confuse(f1);
      });
      Expect.throws(() {
        l1 = (f1 as dynamic);
      });
      Expect.throws(() {
        l1 = confuse(f1);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(true, m1 is F1<int>);
      Expect.equals(true, m1 is F1<bool>);
      Expect.equals(true, confuse(m1) is F1<int>);
      Expect.equals(true, confuse(m1) is F1<bool>);
    }
  }

  /// List<T> Function(int y, {List<Function> x})
  void testF2() {
    Expect.isTrue(f2 is F2<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    List<T> Function(int y, {List<Function> x}) l2;
    // The static function f2 sets `T` to `int`.
    if (tIsInt) {
      x2 = f2 as dynamic;
      l2 = f2 as dynamic;
      x2 = confuse(f2);
      l2 = confuse(f2);
    }

    Expect.isTrue(m2 is F2<T>);
    Expect.isTrue(m2 is List<T> Function(int y, {List<Function> x}));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
    // The static function has its T always set to int.
    Expect.isTrue(f2 is F2<int>);
    Expect.isFalse(f2 is F2<bool>);
    Expect.isTrue(confuse(f2) is F2<int>);
    Expect.isFalse(confuse(f2) is F2<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x2 = (f2 as dynamic);
      });
      Expect.throws(() {
        x2 = confuse(f2);
      });
      Expect.throws(() {
        l2 = (f2 as dynamic);
      });
      Expect.throws(() {
        l2 = confuse(f2);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m2 is F2<int>);
      Expect.equals(tIsBool, m2 is F2<bool>);
      Expect.equals(tIsInt, confuse(m2) is F2<int>);
      Expect.equals(tIsBool, confuse(m2) is F2<bool>);
    }
  }

  /// void Function(int, {Function x})
  void testF3() {
    Expect.isTrue(f3 is F3<int>);
    Expect.isTrue(confuse(f3) is F3<int>);
    // In checked mode, verifies the type.
    void Function(int, {Function x}) l3;
    // The static function f3 sets `T` to `int`.
    if (tIsInt) {
      x3 = f3 as dynamic;
      l3 = f3 as dynamic;
      x3 = confuse(f3);
      l3 = confuse(f3);
    }

    Expect.isTrue(m3 is F3<T>);
    Expect.isTrue(m3 is void Function(int, {Function x}));
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

  /// void Function<A>(int x)
  void testF4() {
    Expect.isTrue(f4 is F4<int>);
    Expect.isTrue(confuse(f4) is F4<int>);
    // In checked mode, verifies the type.
    void Function<A>(int x) l4;
    // The static function f4 sets `T` to `int`.
    if (tIsInt) {
      x4 = f4 as dynamic;
      l4 = f4 as dynamic;
      x4 = confuse(f4);
      l4 = confuse(f4);
    }

    Expect.isTrue(m4 is F4<T>);
    Expect.isTrue(m4 is void Function<A>(int x));
    Expect.isTrue(confuse(m4) is F4<T>);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
  }

  /// int Function([List<Function> x]) Function()
  void testF5() {
    Expect.isTrue(f5 is F5<int>);
    Expect.isTrue(confuse(f5) is F5<int>);
    // In checked mode, verifies the type.
    int Function([List<Function> x]) Function() l5;
    // The static function f5 sets `T` to `int`.
    if (tIsInt) {
      x5 = f5 as dynamic;
      l5 = f5 as dynamic;
      x5 = confuse(f5);
      l5 = confuse(f5);
    }

    Expect.isTrue(m5 is F5<T>);
    Expect.isTrue(m5 is int Function([List<Function> x]) Function());
    Expect.isTrue(confuse(m5) is F5<T>);
    // In checked mode, verifies the type.
    x5 = m5;
    l5 = m5;
    x5 = confuse(m5);
    l5 = confuse(m5);
  }

  /// int Function(List<T>) Function()
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    int Function(List<T>) Function() l6;
    // The static function f6 sets `T` to `int`.
    if (tIsInt) {
      x6 = f6 as dynamic;
      l6 = f6 as dynamic;
      x6 = confuse(f6);
      l6 = confuse(f6);
    }

    Expect.isTrue(m6 is F6<T>);
    Expect.isTrue(m6 is int Function(List<T>) Function());
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
    // The static function has its T always set to int.
    Expect.isTrue(f6 is F6<int>);
    Expect.isFalse(f6 is F6<bool>);
    Expect.isTrue(confuse(f6) is F6<int>);
    Expect.isFalse(confuse(f6) is F6<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x6 = (f6 as dynamic);
      });
      Expect.throws(() {
        x6 = confuse(f6);
      });
      Expect.throws(() {
        l6 = (f6 as dynamic);
      });
      Expect.throws(() {
        l6 = confuse(f6);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m6 is F6<int>);
      Expect.equals(tIsBool, m6 is F6<bool>);
      Expect.equals(tIsInt, confuse(m6) is F6<int>);
      Expect.equals(tIsBool, confuse(m6) is F6<bool>);
    }
  }

  /// Function Function(int, [Function]) Function()
  void testF7() {
    Expect.isTrue(f7 is F7<int>);
    Expect.isTrue(confuse(f7) is F7<int>);
    // In checked mode, verifies the type.
    Function Function(int, [Function]) Function() l7;
    // The static function f7 sets `T` to `int`.
    if (tIsInt) {
      x7 = f7 as dynamic;
      l7 = f7 as dynamic;
      x7 = confuse(f7);
      l7 = confuse(f7);
    }

    Expect.isTrue(m7 is F7<T>);
    Expect.isTrue(m7 is Function Function(int, [Function]) Function());
    Expect.isTrue(confuse(m7) is F7<T>);
    // In checked mode, verifies the type.
    x7 = m7;
    l7 = m7;
    x7 = confuse(m7);
    l7 = confuse(m7);
  }

  /// Function Function(int, {core.List<core.int> x}) Function()
  void testF8() {
    Expect.isTrue(f8 is F8<int>);
    Expect.isTrue(confuse(f8) is F8<int>);
    // In checked mode, verifies the type.
    Function Function(int, {core.List<core.int> x}) Function() l8;
    // The static function f8 sets `T` to `int`.
    if (tIsInt) {
      x8 = f8 as dynamic;
      l8 = f8 as dynamic;
      x8 = confuse(f8);
      l8 = confuse(f8);
    }

    Expect.isTrue(m8 is F8<T>);
    Expect.isTrue(
        m8 is Function Function(int, {core.List<core.int> x}) Function());
    Expect.isTrue(confuse(m8) is F8<T>);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
  }

  /// List<Function> Function(Function x) Function()
  void testF9() {
    Expect.isTrue(f9 is F9<int>);
    Expect.isTrue(confuse(f9) is F9<int>);
    // In checked mode, verifies the type.
    List<Function> Function(Function x) Function() l9;
    // The static function f9 sets `T` to `int`.
    if (tIsInt) {
      x9 = f9 as dynamic;
      l9 = f9 as dynamic;
      x9 = confuse(f9);
      l9 = confuse(f9);
    }

    Expect.isTrue(m9 is F9<T>);
    Expect.isTrue(m9 is List<Function> Function(Function x) Function());
    Expect.isTrue(confuse(m9) is F9<T>);
    // In checked mode, verifies the type.
    x9 = m9;
    l9 = m9;
    x9 = confuse(m9);
    l9 = confuse(m9);
  }

  /// List<Function> Function(int y, [core.List<core.int> x]) Function()
  void testF10() {
    Expect.isTrue(f10 is F10<int>);
    Expect.isTrue(confuse(f10) is F10<int>);
    // In checked mode, verifies the type.
    List<Function> Function(int y, [core.List<core.int> x]) Function() l10;
    // The static function f10 sets `T` to `int`.
    if (tIsInt) {
      x10 = f10 as dynamic;
      l10 = f10 as dynamic;
      x10 = confuse(f10);
      l10 = confuse(f10);
    }

    Expect.isTrue(m10 is F10<T>);
    Expect.isTrue(m10 is List<Function> Function(int y, [core.List<core.int> x])
        Function());
    Expect.isTrue(confuse(m10) is F10<T>);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// core.List<core.int> Function([int]) Function()
  void testF11() {
    Expect.isTrue(f11 is F11<int>);
    Expect.isTrue(confuse(f11) is F11<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function([int]) Function() l11;
    // The static function f11 sets `T` to `int`.
    if (tIsInt) {
      x11 = f11 as dynamic;
      l11 = f11 as dynamic;
      x11 = confuse(f11);
      l11 = confuse(f11);
    }

    Expect.isTrue(m11 is F11<T>);
    Expect.isTrue(m11 is core.List<core.int> Function([int]) Function());
    Expect.isTrue(confuse(m11) is F11<T>);
    // In checked mode, verifies the type.
    x11 = m11;
    l11 = m11;
    x11 = confuse(m11);
    l11 = confuse(m11);
  }

  /// core.List<core.int> Function({List<Function> x}) Function()
  void testF12() {
    Expect.isTrue(f12 is F12<int>);
    Expect.isTrue(confuse(f12) is F12<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function({List<Function> x}) Function() l12;
    // The static function f12 sets `T` to `int`.
    if (tIsInt) {
      x12 = f12 as dynamic;
      l12 = f12 as dynamic;
      x12 = confuse(f12);
      l12 = confuse(f12);
    }

    Expect.isTrue(m12 is F12<T>);
    Expect.isTrue(
        m12 is core.List<core.int> Function({List<Function> x}) Function());
    Expect.isTrue(confuse(m12) is F12<T>);
    // In checked mode, verifies the type.
    x12 = m12;
    l12 = m12;
    x12 = confuse(m12);
    l12 = confuse(m12);
  }

  /// core.List<core.int> Function() Function()
  void testF13() {
    Expect.isTrue(f13 is F13<int>);
    Expect.isTrue(confuse(f13) is F13<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function() Function() l13;
    // The static function f13 sets `T` to `int`.
    if (tIsInt) {
      x13 = f13 as dynamic;
      l13 = f13 as dynamic;
      x13 = confuse(f13);
      l13 = confuse(f13);
    }

    Expect.isTrue(m13 is F13<T>);
    Expect.isTrue(m13 is core.List<core.int> Function() Function());
    Expect.isTrue(confuse(m13) is F13<T>);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
  }

  /// List<T> Function(int, [List<Function> x]) Function()
  void testF14() {
    Expect.isTrue(f14 is F14<int>);
    Expect.isTrue(confuse(f14) is F14<int>);
    // In checked mode, verifies the type.
    List<T> Function(int, [List<Function> x]) Function() l14;
    // The static function f14 sets `T` to `int`.
    if (tIsInt) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14<T>);
    Expect.isTrue(m14 is List<T> Function(int, [List<Function> x]) Function());
    Expect.isTrue(confuse(m14) is F14<T>);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    // The static function has its T always set to int.
    Expect.isTrue(f14 is F14<int>);
    Expect.isFalse(f14 is F14<bool>);
    Expect.isTrue(confuse(f14) is F14<int>);
    Expect.isFalse(confuse(f14) is F14<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x14 = (f14 as dynamic);
      });
      Expect.throws(() {
        x14 = confuse(f14);
      });
      Expect.throws(() {
        l14 = (f14 as dynamic);
      });
      Expect.throws(() {
        l14 = confuse(f14);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m14 is F14<int>);
      Expect.equals(tIsBool, m14 is F14<bool>);
      Expect.equals(tIsInt, confuse(m14) is F14<int>);
      Expect.equals(tIsBool, confuse(m14) is F14<bool>);
    }
  }

  /// List<T> Function([List<T>]) Function()
  void testF15() {
    Expect.isTrue(f15 is F15<int>);
    Expect.isTrue(confuse(f15) is F15<int>);
    // In checked mode, verifies the type.
    List<T> Function([List<T>]) Function() l15;
    // The static function f15 sets `T` to `int`.
    if (tIsInt) {
      x15 = f15 as dynamic;
      l15 = f15 as dynamic;
      x15 = confuse(f15);
      l15 = confuse(f15);
    }

    Expect.isTrue(m15 is F15<T>);
    Expect.isTrue(m15 is List<T> Function([List<T>]) Function());
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    // The static function has its T always set to int.
    Expect.isTrue(f15 is F15<int>);
    Expect.isFalse(f15 is F15<bool>);
    Expect.isTrue(confuse(f15) is F15<int>);
    Expect.isFalse(confuse(f15) is F15<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x15 = (f15 as dynamic);
      });
      Expect.throws(() {
        x15 = confuse(f15);
      });
      Expect.throws(() {
        l15 = (f15 as dynamic);
      });
      Expect.throws(() {
        l15 = confuse(f15);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m15 is F15<int>);
      Expect.equals(tIsBool, m15 is F15<bool>);
      Expect.equals(tIsInt, confuse(m15) is F15<int>);
      Expect.equals(tIsBool, confuse(m15) is F15<bool>);
    }
  }

  /// Function(int x, [Function]) Function()
  void testF16() {
    Expect.isTrue(f16 is F16<int>);
    Expect.isTrue(confuse(f16) is F16<int>);
    // In checked mode, verifies the type.
    Function(int x, [Function]) Function() l16;
    // The static function f16 sets `T` to `int`.
    if (tIsInt) {
      x16 = f16 as dynamic;
      l16 = f16 as dynamic;
      x16 = confuse(f16);
      l16 = confuse(f16);
    }

    Expect.isTrue(m16 is F16<T>);
    Expect.isTrue(m16 is Function(int x, [Function]) Function());
    Expect.isTrue(confuse(m16) is F16<T>);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function(int y, {core.List<core.int> x}) Function()
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(int y, {core.List<core.int> x}) Function() l17;
    // The static function f17 sets `T` to `int`.
    if (tIsInt) {
      x17 = f17 as dynamic;
      l17 = f17 as dynamic;
      x17 = confuse(f17);
      l17 = confuse(f17);
    }

    Expect.isTrue(m17 is F17<T>);
    Expect.isTrue(m17 is Function(int y, {core.List<core.int> x}) Function());
    Expect.isTrue(confuse(m17) is F17<T>);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
  }

  /// void Function([Function x]) Function()
  void testF18() {
    Expect.isTrue(f18 is F18<int>);
    Expect.isTrue(confuse(f18) is F18<int>);
    // In checked mode, verifies the type.
    void Function([Function x]) Function() l18;
    // The static function f18 sets `T` to `int`.
    if (tIsInt) {
      x18 = f18 as dynamic;
      l18 = f18 as dynamic;
      x18 = confuse(f18);
      l18 = confuse(f18);
    }

    Expect.isTrue(m18 is F18<T>);
    Expect.isTrue(m18 is void Function([Function x]) Function());
    Expect.isTrue(confuse(m18) is F18<T>);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

  /// void Function(core.List<core.int>) Function()
  void testF19() {
    Expect.isTrue(f19 is F19<int>);
    Expect.isTrue(confuse(f19) is F19<int>);
    // In checked mode, verifies the type.
    void Function(core.List<core.int>) Function() l19;
    // The static function f19 sets `T` to `int`.
    if (tIsInt) {
      x19 = f19 as dynamic;
      l19 = f19 as dynamic;
      x19 = confuse(f19);
      l19 = confuse(f19);
    }

    Expect.isTrue(m19 is F19<T>);
    Expect.isTrue(m19 is void Function(core.List<core.int>) Function());
    Expect.isTrue(confuse(m19) is F19<T>);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

  /// int Function<A>(A x) Function()
  void testF20() {
    Expect.isTrue(f20 is F20<int>);
    Expect.isTrue(confuse(f20) is F20<int>);
    // In checked mode, verifies the type.
    int Function<A>(A x) Function() l20;
    // The static function f20 sets `T` to `int`.
    if (tIsInt) {
      x20 = f20 as dynamic;
      l20 = f20 as dynamic;
      x20 = confuse(f20);
      l20 = confuse(f20);
    }

    Expect.isTrue(m20 is F20<T>);
    Expect.isTrue(m20 is int Function<A>(A x) Function());
    Expect.isTrue(confuse(m20) is F20<T>);
    // In checked mode, verifies the type.
    x20 = m20;
    l20 = m20;
    x20 = confuse(m20);
    l20 = confuse(m20);
  }

  /// core.List<core.int> Function<A>(List<A> x) Function()
  void testF21() {
    Expect.isTrue(f21 is F21<int>);
    Expect.isTrue(confuse(f21) is F21<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function<A>(List<A> x) Function() l21;
    // The static function f21 sets `T` to `int`.
    if (tIsInt) {
      x21 = f21 as dynamic;
      l21 = f21 as dynamic;
      x21 = confuse(f21);
      l21 = confuse(f21);
    }

    Expect.isTrue(m21 is F21<T>);
    Expect.isTrue(m21 is core.List<core.int> Function<A>(List<A> x) Function());
    Expect.isTrue(confuse(m21) is F21<T>);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
  }

  /// List<A> Function<A>(int x) Function()
  void testF22() {
    Expect.isTrue(f22 is F22<int>);
    Expect.isTrue(confuse(f22) is F22<int>);
    // In checked mode, verifies the type.
    List<A> Function<A>(int x) Function() l22;
    // The static function f22 sets `T` to `int`.
    if (tIsInt) {
      x22 = f22 as dynamic;
      l22 = f22 as dynamic;
      x22 = confuse(f22);
      l22 = confuse(f22);
    }

    Expect.isTrue(m22 is F22<T>);
    Expect.isTrue(m22 is List<A> Function<A>(int x) Function());
    Expect.isTrue(confuse(m22) is F22<T>);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }
}

void main() {
  new U56().runTests();
  new U56<int>(tIsInt: true).runTests();
  new U56<bool>(tIsBool: true).runTests();
}
