// 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';

@NoInline()
@AssumeDynamic()
confuse(f) => f;

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

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

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

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

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

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

  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 y, {List<Function> 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 y, {List<Function> 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 y, {List<Function> x}));
    Expect.isTrue(confuse(m0) is F0<T>);
    // In checked mode, verifies the type.
    x0 = m0;
    l0 = m0;
    x0 = confuse(m0);
    l0 = confuse(m0);
  }

  /// core.List<core.int> Function(int x0, {Function x})
  void testF1() {
    Expect.isTrue(f1 is F1<int>);
    Expect.isTrue(confuse(f1) is F1<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function(int x0, {Function 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 core.List<core.int> Function(int x0, {Function x}));
    Expect.isTrue(confuse(m1) is F1<T>);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
  }

  /// Function({int x})
  void testF2() {
    Expect.isTrue(f2 is F2<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    Function({int 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 Function({int x}));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
  }

  /// void Function({List<T> x})
  void testF3() {
    Expect.isTrue(f3 is F3<int>);
    Expect.isTrue(confuse(f3) is F3<int>);
    // In checked mode, verifies the type.
    void Function({List<T> 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({List<T> x}));
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
    // The static function has its T always set to int.
    Expect.isTrue(f3 is F3<int>);
    Expect.isFalse(f3 is F3<bool>);
    Expect.isTrue(confuse(f3) is F3<int>);
    Expect.isFalse(confuse(f3) is F3<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x3 = (f3 as dynamic);
      });
      Expect.throws(() {
        x3 = confuse(f3);
      });
      Expect.throws(() {
        l3 = (f3 as dynamic);
      });
      Expect.throws(() {
        l3 = confuse(f3);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(true, m3 is F3<int>);
      Expect.equals(true, m3 is F3<bool>);
      Expect.equals(true, confuse(m3) is F3<int>);
      Expect.equals(true, confuse(m3) is F3<bool>);
    }
  }

  /// int Function(int x1, [int x2]) Function()
  void testF4() {
    Expect.isTrue(f4 is F4<int>);
    Expect.isTrue(confuse(f4) is F4<int>);
    // In checked mode, verifies the type.
    int Function(int x1, [int x2]) Function() 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 int Function(int x1, [int x2]) Function());
    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(int x0, {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(int x0, {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(int x0, {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);
  }

  /// Function Function(int x) Function()
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    Function Function(int x) 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 Function Function(int x) Function());
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function(int y, [List<Function> x]) 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 y, [List<Function> x]) 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 y, [List<Function> x]) 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 x1, [List<T> x2]) 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 x1, [List<T> x2]) 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 x1, [List<T> x2]) Function());
    Expect.isTrue(confuse(m8) is F8<T>);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
    // The static function has its T always set to int.
    Expect.isTrue(f8 is F8<int>);
    Expect.isFalse(f8 is F8<bool>);
    Expect.isTrue(confuse(f8) is F8<int>);
    Expect.isFalse(confuse(f8) is F8<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x8 = (f8 as dynamic);
      });
      Expect.throws(() {
        x8 = confuse(f8);
      });
      Expect.throws(() {
        l8 = (f8 as dynamic);
      });
      Expect.throws(() {
        l8 = confuse(f8);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m8 is F8<int>);
      Expect.equals(tIsBool, m8 is F8<bool>);
      Expect.equals(tIsInt, confuse(m8) is F8<int>);
      Expect.equals(tIsBool, confuse(m8) is F8<bool>);
    }
  }

  /// 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(List<T> 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(List<T> 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(List<T> 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);
    // The static function has its T always set to int.
    Expect.isTrue(f10 is F10<int>);
    Expect.isFalse(f10 is F10<bool>);
    Expect.isTrue(confuse(f10) is F10<int>);
    Expect.isFalse(confuse(f10) is F10<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x10 = (f10 as dynamic);
      });
      Expect.throws(() {
        x10 = confuse(f10);
      });
      Expect.throws(() {
        l10 = (f10 as dynamic);
      });
      Expect.throws(() {
        l10 = confuse(f10);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m10 is F10<int>);
      Expect.equals(tIsBool, m10 is F10<bool>);
      Expect.equals(tIsInt, confuse(m10) is F10<int>);
      Expect.equals(tIsBool, confuse(m10) is F10<bool>);
    }
  }

  /// core.List<core.int> Function(int x0, [Function x]) 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 x0, [Function x]) 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 x0, [Function x]) 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([core.List<core.int> x1]) 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([core.List<core.int> x1]) 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([core.List<core.int> x1])
        Function());
    Expect.isTrue(confuse(m12) is F12<T>);
    // In checked mode, verifies the type.
    x12 = m12;
    l12 = m12;
    x12 = confuse(m12);
    l12 = confuse(m12);
  }

  /// List<T> Function(int x, [int x2]) Function()
  void testF13() {
    Expect.isTrue(f13 is F13<int>);
    Expect.isTrue(confuse(f13) is F13<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x, [int x2]) 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 List<T> Function(int x, [int x2]) Function());
    Expect.isTrue(confuse(m13) is F13<T>);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    // The static function has its T always set to int.
    Expect.isTrue(f13 is F13<int>);
    Expect.isFalse(f13 is F13<bool>);
    Expect.isTrue(confuse(f13) is F13<int>);
    Expect.isFalse(confuse(f13) is F13<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x13 = (f13 as dynamic);
      });
      Expect.throws(() {
        x13 = confuse(f13);
      });
      Expect.throws(() {
        l13 = (f13 as dynamic);
      });
      Expect.throws(() {
        l13 = confuse(f13);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m13 is F13<int>);
      Expect.equals(tIsBool, m13 is F13<bool>);
      Expect.equals(tIsInt, confuse(m13) is F13<int>);
      Expect.equals(tIsBool, confuse(m13) is F13<bool>);
    }
  }

  /// List<T> Function(int y, {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 y, {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 y, {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>);
    }
  }

  /// Function([int x]) Function()
  void testF15() {
    Expect.isTrue(f15 is F15<int>);
    Expect.isTrue(confuse(f15) is F15<int>);
    // In checked mode, verifies the type.
    Function([int x]) 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 Function([int x]) Function());
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
  }

  /// Function(List<Function> x0) Function()
  void testF16() {
    Expect.isTrue(f16 is F16<int>);
    Expect.isTrue(confuse(f16) is F16<int>);
    // In checked mode, verifies the type.
    Function(List<Function> x0) 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(List<Function> x0) 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 x, [List<T> x2]) Function()
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(int x, [List<T> x2]) 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 x, [List<T> x2]) Function());
    Expect.isTrue(confuse(m17) is F17<T>);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
    // The static function has its T always set to int.
    Expect.isTrue(f17 is F17<int>);
    Expect.isFalse(f17 is F17<bool>);
    Expect.isTrue(confuse(f17) is F17<int>);
    Expect.isFalse(confuse(f17) is F17<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x17 = (f17 as dynamic);
      });
      Expect.throws(() {
        x17 = confuse(f17);
      });
      Expect.throws(() {
        l17 = (f17 as dynamic);
      });
      Expect.throws(() {
        l17 = confuse(f17);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m17 is F17<int>);
      Expect.equals(tIsBool, m17 is F17<bool>);
      Expect.equals(tIsInt, confuse(m17) is F17<int>);
      Expect.equals(tIsBool, confuse(m17) is F17<bool>);
    }
  }

  /// void Function(int x0, {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(int x0, {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(int x0, {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([List<T> x]) Function()
  void testF19() {
    Expect.isTrue(f19 is F19<int>);
    Expect.isTrue(confuse(f19) is F19<int>);
    // In checked mode, verifies the type.
    void Function([List<T> x]) 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([List<T> x]) Function());
    Expect.isTrue(confuse(m19) is F19<T>);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
    // The static function has its T always set to int.
    Expect.isTrue(f19 is F19<int>);
    Expect.isFalse(f19 is F19<bool>);
    Expect.isTrue(confuse(f19) is F19<int>);
    Expect.isFalse(confuse(f19) is F19<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x19 = (f19 as dynamic);
      });
      Expect.throws(() {
        x19 = confuse(f19);
      });
      Expect.throws(() {
        l19 = (f19 as dynamic);
      });
      Expect.throws(() {
        l19 = confuse(f19);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m19 is F19<int>);
      Expect.equals(tIsBool, m19 is F19<bool>);
      Expect.equals(tIsInt, confuse(m19) is F19<int>);
      Expect.equals(tIsBool, confuse(m19) is F19<bool>);
    }
  }

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

  /// List<T> 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.
    List<T> 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 List<T> 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);
    // The static function has its T always set to int.
    Expect.isTrue(f21 is F21<int>);
    Expect.isFalse(f21 is F21<bool>);
    Expect.isTrue(confuse(f21) is F21<int>);
    Expect.isFalse(confuse(f21) is F21<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x21 = (f21 as dynamic);
      });
      Expect.throws(() {
        x21 = confuse(f21);
      });
      Expect.throws(() {
        l21 = (f21 as dynamic);
      });
      Expect.throws(() {
        l21 = confuse(f21);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m21 is F21<int>);
      Expect.equals(tIsBool, m21 is F21<bool>);
      Expect.equals(tIsInt, confuse(m21) is F21<int>);
      Expect.equals(tIsBool, confuse(m21) is F21<bool>);
    }
  }

  /// void 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.
    void 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 void 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 U88().runTests();
  new U88<int>(tIsInt: true).runTests();
  new U88<bool>(tIsBool: true).runTests();
}
