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