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

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

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

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

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

  Function m0(int x0, [List<Function> x]) => null;
  core.List<core.int> m1([Function x]) => null;
  m2(int x) => null;
  void m3(List<T> x) => null;
  int Function(int x0) m4() => null;
  int Function(int x, [List<Function> x0]) m5() => null;
  int Function(int y, {List<T> x}) m6() => null;
  Function Function([List<Function> x]) m7() => null;
  Function Function(List<T> x0) m8() => null;
  List<Function> Function(int x0, [Function x1]) m9() => null;
  List<Function> Function(int x0, {core.List<core.int> x}) m10() => null;
  core.List<core.int> Function(Function x) m11() => null;
  core.List<core.int> Function(int y, [core.List<core.int> x]) m12() => null;
  List<T> Function([int x0]) m13() => null;
  List<T> Function({List<Function> x}) m14() => null;
  List<T> Function() m15() => null;
  Function(int x0, [List<Function> x]) m16() => null;
  Function([List<T> x0]) m17() => null;
  void Function(int x, [Function x0]) m18() => null;
  void Function(int y, {core.List<core.int> x}) m19() => null;
  Function Function<A>(List<T> x) m20() => null;
  List<T> Function<A>() m21() => null;
  List<A> Function<A>(A 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 x0, [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 x0, [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 x0, [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([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([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([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 (typeAssertionsEnabled) {
        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 x0) Function()
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    int Function(int x0) 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 x0) 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 x, [List<Function> x2]) Function()
  void testF5() {
    Expect.isTrue(f5 is F5);
    Expect.isTrue(confuse(f5) is F5);
    // In checked mode, verifies the type.
    int Function(int x, [List<Function> x2]) 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 x, [List<Function> x2]) Function());
    Expect.isTrue(confuse(m5) is F5);
    // In checked mode, verifies the type.
    x5 = m5;
    l5 = m5;
    x5 = confuse(m5);
    l5 = confuse(m5);
  }

  /// int Function(int y, {List<T> x}) Function()
  void testF6() {
    Expect.isTrue(f6 is F6);
    Expect.isTrue(confuse(f6) is F6);
    // In checked mode, verifies the type.
    int Function(int y, {List<T> 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 int Function(int y, {List<T> x}) Function());
    Expect.isTrue(confuse(m6) is F6);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m6 is F6<bool>);
      Expect.equals(tIsDynamic, confuse(m6) is F6<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x6 = (f6 as dynamic);
        });
        Expect.throws(() {
          x6 = confuse(f6);
        });
        int Function(int y, {List<T> x}) Function() l6;
        Expect.throws(() {
          l6 = (f6 as dynamic);
        });
        Expect.throws(() {
          l6 = confuse(f6);
        });
      }
      int Function(int y, {List<T> x}) Function() l6 = m6;
      // In checked mode, verifies the type.
      x6 = m6;
      x6 = confuse(m6);
    }
  }

  /// Function Function([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([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([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(List<T> x0) Function()
  void testF8() {
    Expect.isTrue(f8 is F8);
    Expect.isTrue(confuse(f8) is F8);
    // In checked mode, verifies the type.
    Function Function(List<T> x0) 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(List<T> x0) 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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x8 = (f8 as dynamic);
        });
        Expect.throws(() {
          x8 = confuse(f8);
        });
        Function Function(List<T> x0) Function() l8;
        Expect.throws(() {
          l8 = (f8 as dynamic);
        });
        Expect.throws(() {
          l8 = confuse(f8);
        });
      }
      Function Function(List<T> x0) Function() l8 = m8;
      // In checked mode, verifies the type.
      x8 = m8;
      x8 = confuse(m8);
    }
  }

  /// List<Function> Function(int x1, [Function x2]) Function()
  void testF9() {
    Expect.isTrue(f9 is F9);
    Expect.isTrue(confuse(f9) is F9);
    // In checked mode, verifies the type.
    List<Function> Function(int x1, [Function x2]) 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(int x1, [Function x2]) 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(int x0, {core.List<core.int> x}) Function()
  void testF10() {
    Expect.isTrue(f10 is F10);
    Expect.isTrue(confuse(f10) is F10);
    // In checked mode, verifies the type.
    List<Function> Function(int x0, {core.List<core.int> 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(int x0, {core.List<core.int> x}) Function());
    Expect.isTrue(confuse(m10) is F10);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// core.List<core.int> Function(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(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(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(int y, [core.List<core.int> x]) 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(int y, [core.List<core.int> x]) 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(int y,
            [core.List<core.int> x])
        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 x1]) Function()
  void testF13() {
    Expect.isTrue(f13 is F13);
    Expect.isTrue(confuse(f13) is F13);
    // In checked mode, verifies the type.
    List<T> Function([int x1]) 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 x1]) 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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x13 = (f13 as dynamic);
        });
        Expect.throws(() {
          x13 = confuse(f13);
        });
        List<T> Function([int x1]) Function() l13;
        Expect.throws(() {
          l13 = (f13 as dynamic);
        });
        Expect.throws(() {
          l13 = confuse(f13);
        });
      }
      List<T> Function([int x1]) Function() l13 = m13;
      // In checked mode, verifies the type.
      x13 = m13;
      x13 = confuse(m13);
    }
  }

  /// List<T> Function({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({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({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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x14 = (f14 as dynamic);
        });
        Expect.throws(() {
          x14 = confuse(f14);
        });
        List<T> Function({List<Function> x}) Function() l14;
        Expect.throws(() {
          l14 = (f14 as dynamic);
        });
        Expect.throws(() {
          l14 = confuse(f14);
        });
      }
      List<T> Function({List<Function> x}) Function() l14 = m14;
      // In checked mode, verifies the type.
      x14 = m14;
      x14 = confuse(m14);
    }
  }

  /// List<T> Function() Function()
  void testF15() {
    Expect.isTrue(f15 is F15);
    Expect.isTrue(confuse(f15) is F15);
    // In checked mode, verifies the type.
    List<T> Function() 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 List<T> Function() Function());
    Expect.isTrue(confuse(m15) is F15);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m15 is F15<bool>);
      Expect.equals(tIsDynamic, confuse(m15) is F15<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x15 = (f15 as dynamic);
        });
        Expect.throws(() {
          x15 = confuse(f15);
        });
        List<T> Function() Function() l15;
        Expect.throws(() {
          l15 = (f15 as dynamic);
        });
        Expect.throws(() {
          l15 = confuse(f15);
        });
      }
      List<T> Function() Function() l15 = m15;
      // In checked mode, verifies the type.
      x15 = m15;
      x15 = confuse(m15);
    }
  }

  /// Function(int x0, [List<Function> x]) Function()
  void testF16() {
    Expect.isTrue(f16 is F16);
    Expect.isTrue(confuse(f16) is F16);
    // In checked mode, verifies the type.
    Function(int x0, [List<Function> x]) 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(int x0, [List<Function> x]) Function());
    Expect.isTrue(confuse(m16) is F16);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function([List<T> x1]) Function()
  void testF17() {
    Expect.isTrue(f17 is F17);
    Expect.isTrue(confuse(f17) is F17);
    // In checked mode, verifies the type.
    Function([List<T> x1]) 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([List<T> x1]) 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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x17 = (f17 as dynamic);
        });
        Expect.throws(() {
          x17 = confuse(f17);
        });
        Function([List<T> x1]) Function() l17;
        Expect.throws(() {
          l17 = (f17 as dynamic);
        });
        Expect.throws(() {
          l17 = confuse(f17);
        });
      }
      Function([List<T> x1]) Function() l17 = m17;
      // In checked mode, verifies the type.
      x17 = m17;
      x17 = confuse(m17);
    }
  }

  /// void Function(int x, [Function x2]) Function()
  void testF18() {
    Expect.isTrue(f18 is F18);
    Expect.isTrue(confuse(f18) is F18);
    // In checked mode, verifies the type.
    void Function(int x, [Function x2]) 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 x, [Function x2]) 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(int y, {core.List<core.int> x}) Function()
  void testF19() {
    Expect.isTrue(f19 is F19);
    Expect.isTrue(confuse(f19) is F19);
    // In checked mode, verifies the type.
    void Function(int y, {core.List<core.int> 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(int y, {core.List<core.int> x}) Function());
    Expect.isTrue(confuse(m19) is F19);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

  /// Function Function<A>(List<T> x) Function()
  void testF20() {
    Expect.isTrue(f20 is F20);
    Expect.isTrue(confuse(f20) is F20);
    // In checked mode, verifies the type.
    Function Function<A>(List<T> 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>(List<T> x) Function());
    Expect.isTrue(confuse(m20) is F20);
    // In checked mode, verifies the type.
    x20 = m20;
    l20 = m20;
    x20 = confuse(m20);
    l20 = confuse(m20);
    if (!tIsBool) {
      Expect.isTrue(f20 is F20<int>);
      Expect.isFalse(f20 is F20<bool>);
      Expect.isTrue(confuse(f20) is F20<int>);
      Expect.isFalse(confuse(f20) is F20<bool>);
      Expect.equals(tIsDynamic, m20 is F20<bool>);
      Expect.equals(tIsDynamic, confuse(m20) is F20<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x20 = (f20 as dynamic);
        });
        Expect.throws(() {
          x20 = confuse(f20);
        });
        Function Function<A>(List<T> x) Function() l20;
        Expect.throws(() {
          l20 = (f20 as dynamic);
        });
        Expect.throws(() {
          l20 = confuse(f20);
        });
      }
      Function Function<A>(List<T> x) Function() l20 = m20;
      // In checked mode, verifies the type.
      x20 = m20;
      x20 = confuse(m20);
    }
  }

  /// List<T> Function<A>() Function()
  void testF21() {
    Expect.isTrue(f21 is F21);
    Expect.isTrue(confuse(f21) is F21);
    // In checked mode, verifies the type.
    List<T> Function<A>() 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>() 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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x21 = (f21 as dynamic);
        });
        Expect.throws(() {
          x21 = confuse(f21);
        });
        List<T> Function<A>() Function() l21;
        Expect.throws(() {
          l21 = (f21 as dynamic);
        });
        Expect.throws(() {
          l21 = confuse(f21);
        });
      }
      List<T> Function<A>() Function() l21 = m21;
      // In checked mode, verifies the type.
      x21 = m21;
      x21 = confuse(m21);
    }
  }

  /// List<A> Function<A>(A x) Function()
  void testF22() {
    Expect.isTrue(f22 is F22);
    Expect.isTrue(confuse(f22) is F22);
    // In checked mode, verifies the type.
    List<A> Function<A>(A 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 List<A> Function<A>(A 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 U80().runTests();
  new U80<int>(tIsInt: true).runTests();
  new U80<bool>(tIsBool: true).runTests();
}
