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

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

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

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

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

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

  /// int Function(int x, [core.List<core.int> x2])
  void testF0() {
    Expect.isTrue(f0 is F0);
    Expect.isTrue(confuse(f0) is F0);
    // In checked mode, verifies the type.
    int Function(int x, [core.List<core.int> x2]) 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 int Function(int x, [core.List<core.int> x2]));
    Expect.isTrue(confuse(m0) is F0);
    // In checked mode, verifies the type.
    x0 = m0;
    l0 = m0;
    x0 = confuse(m0);
    l0 = confuse(m0);
  }

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

  /// List<T> Function([Function x1])
  void testF2() {
    Expect.isTrue(f2 is F2);
    Expect.isTrue(confuse(f2) is F2);
    // In checked mode, verifies the type.
    List<T> Function([Function x1]) 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 List<T> Function([Function x1]));
    Expect.isTrue(confuse(m2) is F2);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
    if (!tIsBool) {
      Expect.isTrue(f2 is F2<int>);
      Expect.isFalse(f2 is F2<bool>);
      Expect.isTrue(confuse(f2) is F2<int>);
      Expect.isFalse(confuse(f2) is F2<bool>);
      Expect.equals(tIsDynamic, m2 is F2<bool>);
      Expect.equals(tIsDynamic, confuse(m2) is F2<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x2 = (f2 as dynamic);
        });
        Expect.throws(() {
          x2 = confuse(f2);
        });
        List<T> Function([Function x1]) l2;
        Expect.throws(() {
          l2 = (f2 as dynamic);
        });
        Expect.throws(() {
          l2 = confuse(f2);
        });
      }
      List<T> Function([Function x1]) l2 = m2;
      // In checked mode, verifies the type.
      x2 = m2;
      x2 = confuse(m2);
    }
  }

  /// void Function(int x0)
  void testF3() {
    Expect.isTrue(f3 is F3);
    Expect.isTrue(confuse(f3) is F3);
    // In checked mode, verifies the type.
    void Function(int x0) 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(int x0));
    Expect.isTrue(confuse(m3) is F3);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

  /// A Function<A>(int x)
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    A Function<A>(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 A Function<A>(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({Function x}) Function()
  void testF5() {
    Expect.isTrue(f5 is F5);
    Expect.isTrue(confuse(f5) is F5);
    // In checked mode, verifies the type.
    int Function({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({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);
  }

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

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

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

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

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

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

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

  /// void Function({int x}) 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() 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());
    Expect.isTrue(confuse(m18) is F18);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

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

  /// int Function<A>(List<Function> x) Function()
  void testF20() {
    Expect.isTrue(f20 is F20);
    Expect.isTrue(confuse(f20) is F20);
    // In checked mode, verifies the type.
    int Function<A>(List<Function> 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 int Function<A>(List<Function> x) Function());
    Expect.isTrue(confuse(m20) is F20);
    // In checked mode, verifies the type.
    x20 = m20;
    l20 = m20;
    x20 = confuse(m20);
    l20 = confuse(m20);
  }

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

  /// A Function<A>(List<T> x) Function()
  void testF22() {
    Expect.isTrue(f22 is F22);
    Expect.isTrue(confuse(f22) is F22);
    // In checked mode, verifies the type.
    A Function<A>(List<T> 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 A Function<A>(List<T> x) Function());
    Expect.isTrue(confuse(m22) is F22);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
    if (!tIsBool) {
      Expect.isTrue(f22 is F22<int>);
      Expect.isFalse(f22 is F22<bool>);
      Expect.isTrue(confuse(f22) is F22<int>);
      Expect.isFalse(confuse(f22) is F22<bool>);
      Expect.equals(tIsDynamic, m22 is F22<bool>);
      Expect.equals(tIsDynamic, confuse(m22) is F22<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x22 = (f22 as dynamic);
        });
        Expect.throws(() {
          x22 = confuse(f22);
        });
        A Function<A>(List<T> x) Function() l22;
        Expect.throws(() {
          l22 = (f22 as dynamic);
        });
        Expect.throws(() {
          l22 = confuse(f22);
        });
      }
      A Function<A>(List<T> x) Function() l22 = m22;
      // In checked mode, verifies the type.
      x22 = m22;
      x22 = confuse(m22);
    }
  }

  /// B Function(Function x) Function<B extends core.int>()
  void testF23() {
    Expect.isTrue(f23 is F23);
    Expect.isTrue(confuse(f23) is F23);
    // In checked mode, verifies the type.
    B Function(Function x) Function<B extends core.int>() l23;
    // The static function f23 sets `T` to `int`.
    if (!tIsBool) {
      x23 = f23 as dynamic;
      l23 = f23 as dynamic;
      x23 = confuse(f23);
      l23 = confuse(f23);
    }

    Expect.isTrue(m23 is F23);
    Expect.isTrue(m23 is B Function(Function x) Function<B extends core.int>());
    Expect.isTrue(confuse(m23) is F23);
    // In checked mode, verifies the type.
    x23 = m23;
    l23 = m23;
    x23 = confuse(m23);
    l23 = confuse(m23);
  }
}

void main() {
  new U40().runTests();
  new U40<int>(tIsInt: true).runTests();
  new U40<bool>(tIsBool: true).runTests();
}
