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

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

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

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

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

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

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

  /// Function([List<T> x1])
  void testF3() {
    Expect.isTrue(f3 is F3<int>);
    Expect.isTrue(confuse(f3) is F3<int>);
    // In checked mode, verifies the type.
    Function([List<T> x1]) 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 Function([List<T> x1]));
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x3 = (f3 as dynamic);
      });
      Expect.throws(() {
        x3 = confuse(f3);
      });
      Expect.throws(() {
        l3 = (f3 as dynamic);
      });
      Expect.throws(() {
        l3 = confuse(f3);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(true, m3 is F3<int>);
      Expect.equals(true, m3 is F3<bool>);
      Expect.equals(true, confuse(m3) is F3<int>);
      Expect.equals(true, confuse(m3) is F3<bool>);
    }
  }

  /// List<T> Function<A>()
  void testF4() {
    Expect.isTrue(f4 is F4<int>);
    Expect.isTrue(confuse(f4) is F4<int>);
    // In checked mode, verifies the type.
    List<T> Function<A>() 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 List<T> Function<A>());
    Expect.isTrue(confuse(m4) is F4<T>);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
    // The static function has its T always set to int.
    Expect.isTrue(f4 is F4<int>);
    Expect.isFalse(f4 is F4<bool>);
    Expect.isTrue(confuse(f4) is F4<int>);
    Expect.isFalse(confuse(f4) is F4<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x4 = (f4 as dynamic);
      });
      Expect.throws(() {
        x4 = confuse(f4);
      });
      Expect.throws(() {
        l4 = (f4 as dynamic);
      });
      Expect.throws(() {
        l4 = confuse(f4);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m4 is F4<int>);
      Expect.equals(tIsBool, m4 is F4<bool>);
      Expect.equals(tIsInt, confuse(m4) is F4<int>);
      Expect.equals(tIsBool, confuse(m4) is F4<bool>);
    }
  }

  /// int Function([Function x1]) Function(int x)
  void testF5() {
    Expect.isTrue(f5 is F5<int>);
    Expect.isTrue(confuse(f5) is F5<int>);
    // In checked mode, verifies the type.
    int Function([Function x1]) Function(int x) 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 x1]) Function(int x));
    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({core.List<core.int> x}) Function(int x)
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    int Function({core.List<core.int> x}) Function(int x) 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({core.List<core.int> x}) Function(int x));
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function(int y, {int x}) Function(int x)
  void testF7() {
    Expect.isTrue(f7 is F7<int>);
    Expect.isTrue(confuse(f7) is F7<int>);
    // In checked mode, verifies the type.
    Function Function(int y, {int x}) Function(int x) 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 y, {int x}) Function(int x));
    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(int x1, [core.List<core.int> x]) Function(int x)
  void testF8() {
    Expect.isTrue(f8 is F8<int>);
    Expect.isTrue(confuse(f8) is F8<int>);
    // In checked mode, verifies the type.
    Function Function(int x1, [core.List<core.int> x]) Function(int x) 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(int x1, [core.List<core.int> x])
        Function(int x));
    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 x1) Function(int x)
  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 x1) Function(int x) 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 x1) Function(int x));
    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 x, [List<Function> x1]) Function(int x)
  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 x, [List<Function> x1]) Function(int x) 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 x, [List<Function> x1])
        Function(int x));
    Expect.isTrue(confuse(m10) is F10<T>);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// List<Function> Function(int y, {List<T> x}) Function(int x)
  void testF11() {
    Expect.isTrue(f11 is F11<int>);
    Expect.isTrue(confuse(f11) is F11<int>);
    // In checked mode, verifies the type.
    List<Function> Function(int y, {List<T> x}) Function(int x) 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 List<Function> Function(int y, {List<T> x}) Function(int x));
    Expect.isTrue(confuse(m11) is F11<T>);
    // In checked mode, verifies the type.
    x11 = m11;
    l11 = m11;
    x11 = confuse(m11);
    l11 = confuse(m11);
    // The static function has its T always set to int.
    Expect.isTrue(f11 is F11<int>);
    Expect.isFalse(f11 is F11<bool>);
    Expect.isTrue(confuse(f11) is F11<int>);
    Expect.isFalse(confuse(f11) is F11<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x11 = (f11 as dynamic);
      });
      Expect.throws(() {
        x11 = confuse(f11);
      });
      Expect.throws(() {
        l11 = (f11 as dynamic);
      });
      Expect.throws(() {
        l11 = confuse(f11);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m11 is F11<int>);
      Expect.equals(tIsBool, m11 is F11<bool>);
      Expect.equals(tIsInt, confuse(m11) is F11<int>);
      Expect.equals(tIsBool, confuse(m11) is F11<bool>);
    }
  }

  /// core.List<core.int> Function([List<Function> x]) Function(int x)
  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> x]) Function(int x) 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> x])
        Function(int x));
    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(List<T> x1) Function(int x)
  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(List<T> x1) Function(int x) 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(List<T> x1) Function(int x));
    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 x2, [Function x3]) Function(int x)
  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 x2, [Function x3]) Function(int x) 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 x2, [Function x3]) Function(int x));
    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(int x1, {core.List<core.int> x}) Function(int x)
  void testF15() {
    Expect.isTrue(f15 is F15<int>);
    Expect.isTrue(confuse(f15) is F15<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x1, {core.List<core.int> x}) Function(int x) 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(int x1, {core.List<core.int> x})
        Function(int x));
    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(Function x) Function(int x)
  void testF16() {
    Expect.isTrue(f16 is F16<int>);
    Expect.isTrue(confuse(f16) is F16<int>);
    // In checked mode, verifies the type.
    Function(Function x) Function(int x) 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(Function x) Function(int x));
    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 y, [core.List<core.int> x]) Function(int x)
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(int y, [core.List<core.int> x]) Function(int x) 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 y, [core.List<core.int> x]) Function(int x));
    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 x1]) Function(int x)
  void testF18() {
    Expect.isTrue(f18 is F18<int>);
    Expect.isTrue(confuse(f18) is F18<int>);
    // In checked mode, verifies the type.
    void Function([int x1]) Function(int x) 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 x1]) Function(int x));
    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({List<Function> x}) Function(int x)
  void testF19() {
    Expect.isTrue(f19 is F19<int>);
    Expect.isTrue(confuse(f19) is F19<int>);
    // In checked mode, verifies the type.
    void Function({List<Function> x}) Function(int x) 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({List<Function> x}) Function(int x));
    Expect.isTrue(confuse(m19) is F19<T>);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

  /// void Function() Function(int x)
  void testF20() {
    Expect.isTrue(f20 is F20<int>);
    Expect.isTrue(confuse(f20) is F20<int>);
    // In checked mode, verifies the type.
    void Function() Function(int x) 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 void Function() Function(int x));
    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>(int x) Function(int x)
  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>(int x) Function(int x) 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>(int x) Function(int x));
    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>(Function x) Function(int x)
  void testF22() {
    Expect.isTrue(f22 is F22<int>);
    Expect.isTrue(confuse(f22) is F22<int>);
    // In checked mode, verifies the type.
    A Function<A>(Function x) Function(int x) 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>(Function x) Function(int x));
    Expect.isTrue(confuse(m22) is F22<T>);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }

  /// List<T> Function(B x) Function<B extends core.int>(int x)
  void testF23() {
    Expect.isTrue(f23 is F23<int>);
    Expect.isTrue(confuse(f23) is F23<int>);
    // In checked mode, verifies the type.
    List<T> Function(B x) Function<B extends core.int>(int x) 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 List<T> Function(B x) Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m23) is F23<T>);
    // In checked mode, verifies the type.
    x23 = m23;
    l23 = m23;
    x23 = confuse(m23);
    l23 = confuse(m23);
    // The static function has its T always set to int.
    Expect.isTrue(f23 is F23<int>);
    Expect.isFalse(f23 is F23<bool>);
    Expect.isTrue(confuse(f23) is F23<int>);
    Expect.isFalse(confuse(f23) is F23<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x23 = (f23 as dynamic);
      });
      Expect.throws(() {
        x23 = confuse(f23);
      });
      Expect.throws(() {
        l23 = (f23 as dynamic);
      });
      Expect.throws(() {
        l23 = confuse(f23);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m23 is F23<int>);
      Expect.equals(tIsBool, m23 is F23<bool>);
      Expect.equals(tIsInt, confuse(m23) is F23<int>);
      Expect.equals(tIsBool, confuse(m23) is F23<bool>);
    }
  }
}

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