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

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
confuse(f) => f;

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

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

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

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

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

  int m0(int x0, {core.List<core.int> x}) => null;
  List<Function> m1({List<Function> x}) => null;
  List<T> m2(int x, [Function x0]) => null;
  void m3(int x0, [int x1]) => null;
  A m4<A>(List<Function> x) => null;
  int Function({Function x}) m5<B extends core.int>() => null;
  int Function(List<T> x) m6<B extends core.int>() => null;
  Function Function(int x0, [Function x]) m7<B extends core.int>() => null;
  Function Function([core.List<core.int> x0]) m8<B extends core.int>() => null;
  List<Function> Function(int x, [int x0]) m9<B extends core.int>() => null;
  List<Function> Function(int y, {List<Function> x})
      m10<B extends core.int>() => null;
  core.List<core.int> Function([int x]) m11<B extends core.int>() => null;
  core.List<core.int> Function(List<Function> x0) m12<B extends core.int>() =>
      null;
  core.List<core.int> Function(int x, [List<T> x0]) m13<B extends core.int>() =>
      null;
  List<T> Function(int x0, {Function x}) m14<B extends core.int>() => null;
  List<T> Function([List<T> x]) m15<B extends core.int>() => null;
  Function(int y, [Function x]) m16<B extends core.int>() => null;
  Function(int x0, [core.List<core.int> x1]) m17<B extends core.int>() => null;
  void Function({int x}) m18<B extends core.int>() => null;
  void Function(core.List<core.int> x) m19<B extends core.int>() => null;
  int Function<A>(List<Function> x) m20<B extends core.int>() => null;
  core.List<core.int> Function<A>(core.List<core.int> x)
      m21<B extends core.int>() => null;
  A Function<A>(List<T> x) m22<B extends core.int>() => null;
  B Function(List<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 x0, {core.List<core.int> x})
  void testF0() {
    Expect.isTrue(f0 is F0<int>);
    Expect.isTrue(confuse(f0) is F0<int>);
    // In checked mode, verifies the type.
    int Function(int x0, {core.List<core.int> x}) l0;
    // The static function f0 sets `T` to `int`.
    if (tIsInt) {
      x0 = f0 as dynamic;
      l0 = f0 as dynamic;
      x0 = confuse(f0);
      l0 = confuse(f0);
    }

    Expect.isTrue(m0 is F0<T>);
    Expect.isTrue(m0 is int Function(int x0, {core.List<core.int> x}));
    Expect.isTrue(confuse(m0) is F0<T>);
    // In checked mode, verifies the type.
    x0 = m0;
    l0 = m0;
    x0 = confuse(m0);
    l0 = confuse(m0);
  }

  /// List<Function> Function({List<Function> x})
  void testF1() {
    Expect.isTrue(f1 is F1<int>);
    Expect.isTrue(confuse(f1) is F1<int>);
    // In checked mode, verifies the type.
    List<Function> Function({List<Function> x}) l1;
    // The static function f1 sets `T` to `int`.
    if (tIsInt) {
      x1 = f1 as dynamic;
      l1 = f1 as dynamic;
      x1 = confuse(f1);
      l1 = confuse(f1);
    }

    Expect.isTrue(m1 is F1<T>);
    Expect.isTrue(m1 is List<Function> Function({List<Function> x}));
    Expect.isTrue(confuse(m1) is F1<T>);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
  }

  /// List<T> Function(int x, [Function x2])
  void testF2() {
    Expect.isTrue(f2 is F2<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x, [Function x2]) l2;
    // The static function f2 sets `T` to `int`.
    if (tIsInt) {
      x2 = f2 as dynamic;
      l2 = f2 as dynamic;
      x2 = confuse(f2);
      l2 = confuse(f2);
    }

    Expect.isTrue(m2 is F2<T>);
    Expect.isTrue(m2 is List<T> Function(int x, [Function x2]));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x2 = (f2 as dynamic);
      });
      Expect.throws(() {
        x2 = confuse(f2);
      });
      Expect.throws(() {
        l2 = (f2 as dynamic);
      });
      Expect.throws(() {
        l2 = confuse(f2);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m2 is F2<int>);
      Expect.equals(tIsBool, m2 is F2<bool>);
      Expect.equals(tIsInt, confuse(m2) is F2<int>);
      Expect.equals(tIsBool, confuse(m2) is F2<bool>);
    }
  }

  /// void Function(int x1, [int x2])
  void testF3() {
    Expect.isTrue(f3 is F3<int>);
    Expect.isTrue(confuse(f3) is F3<int>);
    // In checked mode, verifies the type.
    void Function(int x1, [int x2]) l3;
    // The static function f3 sets `T` to `int`.
    if (tIsInt) {
      x3 = f3 as dynamic;
      l3 = f3 as dynamic;
      x3 = confuse(f3);
      l3 = confuse(f3);
    }

    Expect.isTrue(m3 is F3<T>);
    Expect.isTrue(m3 is void Function(int x1, [int x2]));
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

  /// A Function<A>(List<Function> x)
  void testF4() {
    Expect.isTrue(f4 is F4<int>);
    Expect.isTrue(confuse(f4) is F4<int>);
    // In checked mode, verifies the type.
    A Function<A>(List<Function> x) l4;
    // The static function f4 sets `T` to `int`.
    if (tIsInt) {
      x4 = f4 as dynamic;
      l4 = f4 as dynamic;
      x4 = confuse(f4);
      l4 = confuse(f4);
    }

    Expect.isTrue(m4 is F4<T>);
    Expect.isTrue(m4 is A Function<A>(List<Function> x));
    Expect.isTrue(confuse(m4) is F4<T>);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
  }

  /// int Function({Function x}) Function<B extends core.int>()
  void testF5() {
    Expect.isTrue(f5 is F5<int>);
    Expect.isTrue(confuse(f5) is F5<int>);
    // In checked mode, verifies the type.
    int Function({Function x}) Function<B extends core.int>() l5;
    // The static function f5 sets `T` to `int`.
    if (tIsInt) {
      x5 = f5 as dynamic;
      l5 = f5 as dynamic;
      x5 = confuse(f5);
      l5 = confuse(f5);
    }

    Expect.isTrue(m5 is F5<T>);
    Expect.isTrue(
        m5 is int Function({Function x}) Function<B extends core.int>());
    Expect.isTrue(confuse(m5) is F5<T>);
    // In checked mode, verifies the type.
    x5 = m5;
    l5 = m5;
    x5 = confuse(m5);
    l5 = confuse(m5);
  }

  /// int Function(List<T> x) Function<B extends core.int>()
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    int Function(List<T> x) Function<B extends core.int>() l6;
    // The static function f6 sets `T` to `int`.
    if (tIsInt) {
      x6 = f6 as dynamic;
      l6 = f6 as dynamic;
      x6 = confuse(f6);
      l6 = confuse(f6);
    }

    Expect.isTrue(m6 is F6<T>);
    Expect.isTrue(m6 is int Function(List<T> x) Function<B extends core.int>());
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x6 = (f6 as dynamic);
      });
      Expect.throws(() {
        x6 = confuse(f6);
      });
      Expect.throws(() {
        l6 = (f6 as dynamic);
      });
      Expect.throws(() {
        l6 = confuse(f6);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m6 is F6<int>);
      Expect.equals(tIsBool, m6 is F6<bool>);
      Expect.equals(tIsInt, confuse(m6) is F6<int>);
      Expect.equals(tIsBool, confuse(m6) is F6<bool>);
    }
  }

  /// Function Function(int x1, [Function x]) Function<B extends core.int>()
  void testF7() {
    Expect.isTrue(f7 is F7<int>);
    Expect.isTrue(confuse(f7) is F7<int>);
    // In checked mode, verifies the type.
    Function Function(int x1, [Function x]) Function<B extends core.int>() l7;
    // The static function f7 sets `T` to `int`.
    if (tIsInt) {
      x7 = f7 as dynamic;
      l7 = f7 as dynamic;
      x7 = confuse(f7);
      l7 = confuse(f7);
    }

    Expect.isTrue(m7 is F7<T>);
    Expect.isTrue(m7 is Function Function(int x1, [Function x])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m7) is F7<T>);
    // In checked mode, verifies the type.
    x7 = m7;
    l7 = m7;
    x7 = confuse(m7);
    l7 = confuse(m7);
  }

  /// Function Function([core.List<core.int> x1]) Function<B extends core.int>()
  void testF8() {
    Expect.isTrue(f8 is F8<int>);
    Expect.isTrue(confuse(f8) is F8<int>);
    // In checked mode, verifies the type.
    Function Function([core.List<core.int> x1]) Function<B extends core.int>()
        l8;
    // The static function f8 sets `T` to `int`.
    if (tIsInt) {
      x8 = f8 as dynamic;
      l8 = f8 as dynamic;
      x8 = confuse(f8);
      l8 = confuse(f8);
    }

    Expect.isTrue(m8 is F8<T>);
    Expect.isTrue(m8 is Function Function([core.List<core.int> x1])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m8) is F8<T>);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
  }

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

    Expect.isTrue(m9 is F9<T>);
    Expect.isTrue(m9 is List<Function> Function(int x, [int x1])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m9) is F9<T>);
    // 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<B extends core.int>()
  void testF10() {
    Expect.isTrue(f10 is F10<int>);
    Expect.isTrue(confuse(f10) is F10<int>);
    // In checked mode, verifies the type.
    List<Function> Function(int y, {List<Function> x})
        Function<B extends core.int>() l10;
    // The static function f10 sets `T` to `int`.
    if (tIsInt) {
      x10 = f10 as dynamic;
      l10 = f10 as dynamic;
      x10 = confuse(f10);
      l10 = confuse(f10);
    }

    Expect.isTrue(m10 is F10<T>);
    Expect.isTrue(m10 is List<Function> Function(int y, {List<Function> x})
        Function<B extends core.int>());
    Expect.isTrue(confuse(m10) is F10<T>);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// core.List<core.int> Function([int x]) Function<B extends core.int>()
  void testF11() {
    Expect.isTrue(f11 is F11<int>);
    Expect.isTrue(confuse(f11) is F11<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function([int x]) Function<B extends core.int>() l11;
    // The static function f11 sets `T` to `int`.
    if (tIsInt) {
      x11 = f11 as dynamic;
      l11 = f11 as dynamic;
      x11 = confuse(f11);
      l11 = confuse(f11);
    }

    Expect.isTrue(m11 is F11<T>);
    Expect.isTrue(m11 is core.List<core.int> Function([int x])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m11) is F11<T>);
    // In checked mode, verifies the type.
    x11 = m11;
    l11 = m11;
    x11 = confuse(m11);
    l11 = confuse(m11);
  }

  /// core.List<core.int> Function(List<Function> x1) Function<B extends core.int>()
  void testF12() {
    Expect.isTrue(f12 is F12<int>);
    Expect.isTrue(confuse(f12) is F12<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function(List<Function> x1)
        Function<B extends core.int>() l12;
    // The static function f12 sets `T` to `int`.
    if (tIsInt) {
      x12 = f12 as dynamic;
      l12 = f12 as dynamic;
      x12 = confuse(f12);
      l12 = confuse(f12);
    }

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

    Expect.isTrue(m13 is F13<T>);
    Expect.isTrue(m13 is core.List<core.int> Function(int x, [List<T> x1])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m13) is F13<T>);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x13 = (f13 as dynamic);
      });
      Expect.throws(() {
        x13 = confuse(f13);
      });
      Expect.throws(() {
        l13 = (f13 as dynamic);
      });
      Expect.throws(() {
        l13 = confuse(f13);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m13 is F13<int>);
      Expect.equals(tIsBool, m13 is F13<bool>);
      Expect.equals(tIsInt, confuse(m13) is F13<int>);
      Expect.equals(tIsBool, confuse(m13) is F13<bool>);
    }
  }

  /// List<T> Function(int x1, {Function x}) Function<B extends core.int>()
  void testF14() {
    Expect.isTrue(f14 is F14<int>);
    Expect.isTrue(confuse(f14) is F14<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x1, {Function x}) Function<B extends core.int>() l14;
    // The static function f14 sets `T` to `int`.
    if (tIsInt) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14<T>);
    Expect.isTrue(m14 is List<T> Function(int x1, {Function x})
        Function<B extends core.int>());
    Expect.isTrue(confuse(m14) is F14<T>);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x14 = (f14 as dynamic);
      });
      Expect.throws(() {
        x14 = confuse(f14);
      });
      Expect.throws(() {
        l14 = (f14 as dynamic);
      });
      Expect.throws(() {
        l14 = confuse(f14);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m14 is F14<int>);
      Expect.equals(tIsBool, m14 is F14<bool>);
      Expect.equals(tIsInt, confuse(m14) is F14<int>);
      Expect.equals(tIsBool, confuse(m14) is F14<bool>);
    }
  }

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

    Expect.isTrue(m15 is F15<T>);
    Expect.isTrue(
        m15 is List<T> Function([List<T> x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x15 = (f15 as dynamic);
      });
      Expect.throws(() {
        x15 = confuse(f15);
      });
      Expect.throws(() {
        l15 = (f15 as dynamic);
      });
      Expect.throws(() {
        l15 = confuse(f15);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m15 is F15<int>);
      Expect.equals(tIsBool, m15 is F15<bool>);
      Expect.equals(tIsInt, confuse(m15) is F15<int>);
      Expect.equals(tIsBool, confuse(m15) is F15<bool>);
    }
  }

  /// Function(int y, [Function x]) Function<B extends core.int>()
  void testF16() {
    Expect.isTrue(f16 is F16<int>);
    Expect.isTrue(confuse(f16) is F16<int>);
    // In checked mode, verifies the type.
    Function(int y, [Function x]) Function<B extends core.int>() l16;
    // The static function f16 sets `T` to `int`.
    if (tIsInt) {
      x16 = f16 as dynamic;
      l16 = f16 as dynamic;
      x16 = confuse(f16);
      l16 = confuse(f16);
    }

    Expect.isTrue(m16 is F16<T>);
    Expect.isTrue(
        m16 is Function(int y, [Function x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m16) is F16<T>);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function(int x2, [core.List<core.int> x3]) Function<B extends core.int>()
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(int x2, [core.List<core.int> x3]) Function<B extends core.int>()
        l17;
    // The static function f17 sets `T` to `int`.
    if (tIsInt) {
      x17 = f17 as dynamic;
      l17 = f17 as dynamic;
      x17 = confuse(f17);
      l17 = confuse(f17);
    }

    Expect.isTrue(m17 is F17<T>);
    Expect.isTrue(m17 is Function(int x2, [core.List<core.int> x3])
        Function<B extends core.int>());
    Expect.isTrue(confuse(m17) is F17<T>);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
  }

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

    Expect.isTrue(m18 is F18<T>);
    Expect.isTrue(m18 is void Function({int x}) Function<B extends core.int>());
    Expect.isTrue(confuse(m18) is F18<T>);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

  /// void Function(core.List<core.int> x) Function<B extends core.int>()
  void testF19() {
    Expect.isTrue(f19 is F19<int>);
    Expect.isTrue(confuse(f19) is F19<int>);
    // In checked mode, verifies the type.
    void Function(core.List<core.int> x) Function<B extends core.int>() l19;
    // The static function f19 sets `T` to `int`.
    if (tIsInt) {
      x19 = f19 as dynamic;
      l19 = f19 as dynamic;
      x19 = confuse(f19);
      l19 = confuse(f19);
    }

    Expect.isTrue(m19 is F19<T>);
    Expect.isTrue(m19 is void Function(core.List<core.int> x)
        Function<B extends core.int>());
    Expect.isTrue(confuse(m19) is F19<T>);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

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

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

    Expect.isTrue(m21 is F21<T>);
    Expect.isTrue(m21 is core.List<core.int> Function<A>(core.List<core.int> x)
        Function<B extends core.int>());
    Expect.isTrue(confuse(m21) is F21<T>);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
  }

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

    Expect.isTrue(m22 is F22<T>);
    Expect.isTrue(
        m22 is A Function<A>(List<T> x) Function<B extends core.int>());
    Expect.isTrue(confuse(m22) is F22<T>);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x22 = (f22 as dynamic);
      });
      Expect.throws(() {
        x22 = confuse(f22);
      });
      Expect.throws(() {
        l22 = (f22 as dynamic);
      });
      Expect.throws(() {
        l22 = confuse(f22);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m22 is F22<int>);
      Expect.equals(tIsBool, m22 is F22<bool>);
      Expect.equals(tIsInt, confuse(m22) is F22<int>);
      Expect.equals(tIsBool, confuse(m22) is F22<bool>);
    }
  }

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

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

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