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

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

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

  U81({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) m4(int x) => null;
  int Function(int x, [List<Function> x0]) m5(int x) => null;
  int Function(int y, {List<T> x}) m6(int x) => null;
  Function Function([List<Function> x]) m7(int x) => null;
  Function Function(List<T> x0) m8(int x) => null;
  List<Function> Function(int x0, [Function x1]) m9(int x) => null;
  List<Function> Function(int x0, {core.List<core.int> x}) m10(int x) => null;
  core.List<core.int> Function(Function x) m11(int x) => null;
  core.List<core.int> Function(int y, [core.List<core.int> x]) m12(int x) =>
      null;
  List<T> Function([int x0]) m13(int x) => null;
  List<T> Function({List<Function> x}) m14(int x) => null;
  List<T> Function() m15(int x) => null;
  Function(int x0, [List<Function> x]) m16(int x) => null;
  Function([List<T> x0]) m17(int x) => null;
  void Function(int x, [Function x0]) m18(int x) => null;
  void Function(int y, {core.List<core.int> x}) m19(int x) => null;
  Function Function<A>(List<T> x) m20(int x) => null;
  List<T> Function<A>() m21(int x) => null;
  List<A> Function<A>(A x) m22(int x) => 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 (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 x1) Function(int x)
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    int Function(int x1) Function(int x) 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) Function(int x));
    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> x1]) Function(int x)
  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> x1]) Function(int x) 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> x1]) Function(int x));
    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(int x)
  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(int x) 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(int x));
    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(int x) l6;
        Expect.throws(() {
          l6 = (f6 as dynamic);
        });
        Expect.throws(() {
          l6 = confuse(f6);
        });
      }
      int Function(int y, {List<T> x}) Function(int x) l6 = m6;
      // In checked mode, verifies the type.
      x6 = m6;
      x6 = confuse(m6);
    }
  }

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

  /// List<Function> Function(int x2, [Function x3]) Function(int x)
  void testF9() {
    Expect.isTrue(f9 is F9);
    Expect.isTrue(confuse(f9) is F9);
    // In checked mode, verifies the type.
    List<Function> Function(int x2, [Function x3]) Function(int x) 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 x2, [Function x3]) Function(int x));
    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 x1, {core.List<core.int> x}) Function(int x)
  void testF10() {
    Expect.isTrue(f10 is F10);
    Expect.isTrue(confuse(f10) is F10);
    // In checked mode, verifies the type.
    List<Function> Function(int x1, {core.List<core.int> x}) Function(int x)
        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 x1,
            {core.List<core.int> x})
        Function(int x));
    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(int x)
  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(int x) 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(int x));
    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(int x)
  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(int x)
        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(int x));
    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(int x)
  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(int x) 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(int x));
    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(int x) l13;
        Expect.throws(() {
          l13 = (f13 as dynamic);
        });
        Expect.throws(() {
          l13 = confuse(f13);
        });
      }
      List<T> Function([int x1]) Function(int x) l13 = m13;
      // In checked mode, verifies the type.
      x13 = m13;
      x13 = confuse(m13);
    }
  }

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

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

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

  /// void Function(int x, [Function x1]) Function(int x)
  void testF18() {
    Expect.isTrue(f18 is F18);
    Expect.isTrue(confuse(f18) is F18);
    // In checked mode, verifies the type.
    void Function(int x, [Function x1]) Function(int x) 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 x1]) Function(int x));
    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(int x)
  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(int x) 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(int x));
    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(int x)
  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(int x) 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(int x));
    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(int x) l20;
        Expect.throws(() {
          l20 = (f20 as dynamic);
        });
        Expect.throws(() {
          l20 = confuse(f20);
        });
      }
      Function Function<A>(List<T> x) Function(int x) l20 = m20;
      // In checked mode, verifies the type.
      x20 = m20;
      x20 = confuse(m20);
    }
  }

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

  /// List<A> Function<A>(A x) Function(int x)
  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(int x) 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(int x));
    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 U81().runTests();
  new U81<int>(tIsInt: true).runTests();
  new U81<bool>(tIsBool: true).runTests();
}
