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

final bool inCheckedMode = (() {
  bool result = false;
  assert(result = true);
  return result;
})();

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);
    Expect.isTrue(confuse(f0) is F0);
    // In checked mode, verifies the type.
    Function Function(int y, {List<Function> x}) l0;
    // The static function f0 sets `T` to `int`.
    if (!tIsBool) {
      x0 = f0 as dynamic;
      l0 = f0 as dynamic;
      x0 = confuse(f0);
      l0 = confuse(f0);
    }

    Expect.isTrue(m0 is F0);
    Expect.isTrue(m0 is Function Function(int y, {List<Function> x}));
    Expect.isTrue(confuse(m0) is F0);
    // 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);
    Expect.isTrue(confuse(f1) is F1);
    // 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 (!tIsBool) {
      x1 = f1 as dynamic;
      l1 = f1 as dynamic;
      x1 = confuse(f1);
      l1 = confuse(f1);
    }

    Expect.isTrue(m1 is F1);
    Expect.isTrue(m1 is core.List<core.int> Function(int x0, {Function x}));
    Expect.isTrue(confuse(m1) is F1);
    // 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);
    Expect.isTrue(confuse(f2) is F2);
    // In checked mode, verifies the type.
    Function({int x}) l2;
    // The static function f2 sets `T` to `int`.
    if (!tIsBool) {
      x2 = f2 as dynamic;
      l2 = f2 as dynamic;
      x2 = confuse(f2);
      l2 = confuse(f2);
    }

    Expect.isTrue(m2 is F2);
    Expect.isTrue(m2 is Function({int x}));
    Expect.isTrue(confuse(m2) is F2);
    // 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);
    Expect.isTrue(confuse(f3) is F3);
    // In checked mode, verifies the type.
    void Function({List<T> x}) l3;
    // The static function f3 sets `T` to `int`.
    if (!tIsBool) {
      x3 = f3 as dynamic;
      l3 = f3 as dynamic;
      x3 = confuse(f3);
      l3 = confuse(f3);
    }

    Expect.isTrue(m3 is F3);
    Expect.isTrue(m3 is void Function({List<T> x}));
    Expect.isTrue(confuse(m3) is F3);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m3 is F3<bool>);
      Expect.equals(tIsDynamic, confuse(m3) is F3<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x3 = (f3 as dynamic);
        });
        Expect.throws(() {
          x3 = confuse(f3);
        });
        void Function({List<T> x}) l3;
        Expect.throws(() {
          l3 = (f3 as dynamic);
        });
        Expect.throws(() {
          l3 = confuse(f3);
        });
      }
      void Function({List<T> x}) l3 = m3;
      // In checked mode, verifies the type.
      x3 = m3;
      x3 = confuse(m3);
    }
  }

  /// int Function(int x1, [int x2]) Function()
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    int Function(int x1, [int x2]) Function() l4;
    // The static function f4 sets `T` to `int`.
    if (!tIsBool) {
      x4 = f4 as dynamic;
      l4 = f4 as dynamic;
      x4 = confuse(f4);
      l4 = confuse(f4);
    }

    Expect.isTrue(m4 is F4);
    Expect.isTrue(m4 is int Function(int x1, [int x2]) Function());
    Expect.isTrue(confuse(m4) is F4);
    // 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);
    Expect.isTrue(confuse(f5) is F5);
    // In checked mode, verifies the type.
    int Function(int x0, {List<Function> x}) Function() l5;
    // The static function f5 sets `T` to `int`.
    if (!tIsBool) {
      x5 = f5 as dynamic;
      l5 = f5 as dynamic;
      x5 = confuse(f5);
      l5 = confuse(f5);
    }

    Expect.isTrue(m5 is F5);
    Expect.isTrue(m5 is int Function(int x0, {List<Function> x}) Function());
    Expect.isTrue(confuse(m5) is F5);
    // 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);
    Expect.isTrue(confuse(f6) is F6);
    // In checked mode, verifies the type.
    Function Function(int x) Function() l6;
    // The static function f6 sets `T` to `int`.
    if (!tIsBool) {
      x6 = f6 as dynamic;
      l6 = f6 as dynamic;
      x6 = confuse(f6);
      l6 = confuse(f6);
    }

    Expect.isTrue(m6 is F6);
    Expect.isTrue(m6 is Function Function(int x) Function());
    Expect.isTrue(confuse(m6) is F6);
    // 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);
    Expect.isTrue(confuse(f7) is F7);
    // In checked mode, verifies the type.
    Function Function(int y, [List<Function> x]) Function() l7;
    // The static function f7 sets `T` to `int`.
    if (!tIsBool) {
      x7 = f7 as dynamic;
      l7 = f7 as dynamic;
      x7 = confuse(f7);
      l7 = confuse(f7);
    }

    Expect.isTrue(m7 is F7);
    Expect
        .isTrue(m7 is Function Function(int y, [List<Function> x]) Function());
    Expect.isTrue(confuse(m7) is F7);
    // 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);
    Expect.isTrue(confuse(f8) is F8);
    // In checked mode, verifies the type.
    Function Function(int x1, [List<T> x2]) Function() l8;
    // The static function f8 sets `T` to `int`.
    if (!tIsBool) {
      x8 = f8 as dynamic;
      l8 = f8 as dynamic;
      x8 = confuse(f8);
      l8 = confuse(f8);
    }

    Expect.isTrue(m8 is F8);
    Expect.isTrue(m8 is Function Function(int x1, [List<T> x2]) Function());
    Expect.isTrue(confuse(m8) is F8);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m8 is F8<bool>);
      Expect.equals(tIsDynamic, confuse(m8) is F8<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x8 = (f8 as dynamic);
        });
        Expect.throws(() {
          x8 = confuse(f8);
        });
        Function Function(int x1, [List<T> x2]) Function() l8;
        Expect.throws(() {
          l8 = (f8 as dynamic);
        });
        Expect.throws(() {
          l8 = confuse(f8);
        });
      }
      Function Function(int x1, [List<T> x2]) Function() l8 = m8;
      // In checked mode, verifies the type.
      x8 = m8;
      x8 = confuse(m8);
    }
  }

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

    Expect.isTrue(m9 is F9);
    Expect.isTrue(m9 is List<Function> Function({Function x}) Function());
    Expect.isTrue(confuse(m9) is F9);
    // 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);
    Expect.isTrue(confuse(f10) is F10);
    // In checked mode, verifies the type.
    List<Function> Function(List<T> x) Function() l10;
    // The static function f10 sets `T` to `int`.
    if (!tIsBool) {
      x10 = f10 as dynamic;
      l10 = f10 as dynamic;
      x10 = confuse(f10);
      l10 = confuse(f10);
    }

    Expect.isTrue(m10 is F10);
    Expect.isTrue(m10 is List<Function> Function(List<T> x) Function());
    Expect.isTrue(confuse(m10) is F10);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m10 is F10<bool>);
      Expect.equals(tIsDynamic, confuse(m10) is F10<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x10 = (f10 as dynamic);
        });
        Expect.throws(() {
          x10 = confuse(f10);
        });
        List<Function> Function(List<T> x) Function() l10;
        Expect.throws(() {
          l10 = (f10 as dynamic);
        });
        Expect.throws(() {
          l10 = confuse(f10);
        });
      }
      List<Function> Function(List<T> x) Function() l10 = m10;
      // In checked mode, verifies the type.
      x10 = m10;
      x10 = confuse(m10);
    }
  }

  /// core.List<core.int> Function(int x0, [Function x]) Function()
  void testF11() {
    Expect.isTrue(f11 is F11);
    Expect.isTrue(confuse(f11) is F11);
    // 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 (!tIsBool) {
      x11 = f11 as dynamic;
      l11 = f11 as dynamic;
      x11 = confuse(f11);
      l11 = confuse(f11);
    }

    Expect.isTrue(m11 is F11);
    Expect.isTrue(
        m11 is core.List<core.int> Function(int x0, [Function x]) Function());
    Expect.isTrue(confuse(m11) is F11);
    // 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);
    Expect.isTrue(confuse(f12) is F12);
    // 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 (!tIsBool) {
      x12 = f12 as dynamic;
      l12 = f12 as dynamic;
      x12 = confuse(f12);
      l12 = confuse(f12);
    }

    Expect.isTrue(m12 is F12);
    Expect.isTrue(m12 is core.List<core.int> Function(
        [core.List<core.int> x1]) Function());
    Expect.isTrue(confuse(m12) is F12);
    // 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);
    Expect.isTrue(confuse(f13) is F13);
    // In checked mode, verifies the type.
    List<T> Function(int x, [int x2]) Function() l13;
    // The static function f13 sets `T` to `int`.
    if (!tIsBool) {
      x13 = f13 as dynamic;
      l13 = f13 as dynamic;
      x13 = confuse(f13);
      l13 = confuse(f13);
    }

    Expect.isTrue(m13 is F13);
    Expect.isTrue(m13 is List<T> Function(int x, [int x2]) Function());
    Expect.isTrue(confuse(m13) is F13);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m13 is F13<bool>);
      Expect.equals(tIsDynamic, confuse(m13) is F13<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x13 = (f13 as dynamic);
        });
        Expect.throws(() {
          x13 = confuse(f13);
        });
        List<T> Function(int x, [int x2]) Function() l13;
        Expect.throws(() {
          l13 = (f13 as dynamic);
        });
        Expect.throws(() {
          l13 = confuse(f13);
        });
      }
      List<T> Function(int x, [int x2]) Function() l13 = m13;
      // In checked mode, verifies the type.
      x13 = m13;
      x13 = confuse(m13);
    }
  }

  /// List<T> Function(int y, {List<Function> x}) Function()
  void testF14() {
    Expect.isTrue(f14 is F14);
    Expect.isTrue(confuse(f14) is F14);
    // 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 (!tIsBool) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14);
    Expect
        .isTrue(m14 is List<T> Function(int y, {List<Function> x}) Function());
    Expect.isTrue(confuse(m14) is F14);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m14 is F14<bool>);
      Expect.equals(tIsDynamic, confuse(m14) is F14<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x14 = (f14 as dynamic);
        });
        Expect.throws(() {
          x14 = confuse(f14);
        });
        List<T> Function(int y, {List<Function> x}) Function() l14;
        Expect.throws(() {
          l14 = (f14 as dynamic);
        });
        Expect.throws(() {
          l14 = confuse(f14);
        });
      }
      List<T> Function(int y, {List<Function> x}) Function() l14 = m14;
      // In checked mode, verifies the type.
      x14 = m14;
      x14 = confuse(m14);
    }
  }

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

    Expect.isTrue(m15 is F15);
    Expect.isTrue(m15 is Function([int x]) Function());
    Expect.isTrue(confuse(m15) is F15);
    // 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);
    Expect.isTrue(confuse(f16) is F16);
    // In checked mode, verifies the type.
    Function(List<Function> x0) Function() l16;
    // The static function f16 sets `T` to `int`.
    if (!tIsBool) {
      x16 = f16 as dynamic;
      l16 = f16 as dynamic;
      x16 = confuse(f16);
      l16 = confuse(f16);
    }

    Expect.isTrue(m16 is F16);
    Expect.isTrue(m16 is Function(List<Function> x0) Function());
    Expect.isTrue(confuse(m16) is F16);
    // 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);
    Expect.isTrue(confuse(f17) is F17);
    // In checked mode, verifies the type.
    Function(int x, [List<T> x2]) Function() l17;
    // The static function f17 sets `T` to `int`.
    if (!tIsBool) {
      x17 = f17 as dynamic;
      l17 = f17 as dynamic;
      x17 = confuse(f17);
      l17 = confuse(f17);
    }

    Expect.isTrue(m17 is F17);
    Expect.isTrue(m17 is Function(int x, [List<T> x2]) Function());
    Expect.isTrue(confuse(m17) is F17);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m17 is F17<bool>);
      Expect.equals(tIsDynamic, confuse(m17) is F17<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x17 = (f17 as dynamic);
        });
        Expect.throws(() {
          x17 = confuse(f17);
        });
        Function(int x, [List<T> x2]) Function() l17;
        Expect.throws(() {
          l17 = (f17 as dynamic);
        });
        Expect.throws(() {
          l17 = confuse(f17);
        });
      }
      Function(int x, [List<T> x2]) Function() l17 = m17;
      // In checked mode, verifies the type.
      x17 = m17;
      x17 = confuse(m17);
    }
  }

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

    Expect.isTrue(m18 is F18);
    Expect.isTrue(m18 is void Function(int x0, {Function x}) Function());
    Expect.isTrue(confuse(m18) is F18);
    // 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);
    Expect.isTrue(confuse(f19) is F19);
    // In checked mode, verifies the type.
    void Function([List<T> x]) Function() l19;
    // The static function f19 sets `T` to `int`.
    if (!tIsBool) {
      x19 = f19 as dynamic;
      l19 = f19 as dynamic;
      x19 = confuse(f19);
      l19 = confuse(f19);
    }

    Expect.isTrue(m19 is F19);
    Expect.isTrue(m19 is void Function([List<T> x]) Function());
    Expect.isTrue(confuse(m19) is F19);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m19 is F19<bool>);
      Expect.equals(tIsDynamic, confuse(m19) is F19<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x19 = (f19 as dynamic);
        });
        Expect.throws(() {
          x19 = confuse(f19);
        });
        void Function([List<T> x]) Function() l19;
        Expect.throws(() {
          l19 = (f19 as dynamic);
        });
        Expect.throws(() {
          l19 = confuse(f19);
        });
      }
      void Function([List<T> x]) Function() l19 = m19;
      // In checked mode, verifies the type.
      x19 = m19;
      x19 = confuse(m19);
    }
  }

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

    Expect.isTrue(m20 is F20);
    Expect.isTrue(m20 is Function Function<A>(A x) Function());
    Expect.isTrue(confuse(m20) is F20);
    // 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);
    Expect.isTrue(confuse(f21) is F21);
    // In checked mode, verifies the type.
    List<T> Function<A>(List<A> x) Function() l21;
    // The static function f21 sets `T` to `int`.
    if (!tIsBool) {
      x21 = f21 as dynamic;
      l21 = f21 as dynamic;
      x21 = confuse(f21);
      l21 = confuse(f21);
    }

    Expect.isTrue(m21 is F21);
    Expect.isTrue(m21 is List<T> Function<A>(List<A> x) Function());
    Expect.isTrue(confuse(m21) is F21);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m21 is F21<bool>);
      Expect.equals(tIsDynamic, confuse(m21) is F21<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x21 = (f21 as dynamic);
        });
        Expect.throws(() {
          x21 = confuse(f21);
        });
        List<T> Function<A>(List<A> x) Function() l21;
        Expect.throws(() {
          l21 = (f21 as dynamic);
        });
        Expect.throws(() {
          l21 = confuse(f21);
        });
      }
      List<T> Function<A>(List<A> x) Function() l21 = m21;
      // In checked mode, verifies the type.
      x21 = m21;
      x21 = confuse(m21);
    }
  }

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

    Expect.isTrue(m22 is F22);
    Expect.isTrue(m22 is void Function<A>(int x) Function());
    Expect.isTrue(confuse(m22) is F22);
    // 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();
}
