// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.

import 'dart:core';
import 'dart:core' as core;
import 'package:expect/expect.dart';

@NoInline()
@AssumeDynamic()
confuse(f) => f;

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

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

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

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

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

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

  /// core.List<core.int> Function([int x])
  void testF1() {
    Expect.isTrue(f1 is F1<int>);
    Expect.isTrue(confuse(f1) is F1<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function([int 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 core.List<core.int> Function([int 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([List<T> x])
  void testF2() {
    Expect.isTrue(f2 is F2<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    List<T> Function([List<T> x]) 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([List<T> x]));
    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(core.List<core.int> x)
  void testF3() {
    Expect.isTrue(f3 is F3<int>);
    Expect.isTrue(confuse(f3) is F3<int>);
    // In checked mode, verifies the type.
    void Function(core.List<core.int> x) 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(core.List<core.int> x));
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

  /// int Function([int x]) Function(int x)
  void testF4() {
    Expect.isTrue(f4 is F4<int>);
    Expect.isTrue(confuse(f4) is F4<int>);
    // In checked mode, verifies the type.
    int Function([int x]) Function(int 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 int Function([int x]) Function(int 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(List<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(List<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(List<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(int x, [List<T> x1]) 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(int x, [List<T> x1]) 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(int x, [List<T> x1]) 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);
    // 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(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 x1, {Function 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 x1, {Function 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([List<T> 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([List<T> 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([List<T> 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);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x8 = (f8 as dynamic);
      });
      Expect.throws(() {
        x8 = confuse(f8);
      });
      Expect.throws(() {
        l8 = (f8 as dynamic);
      });
      Expect.throws(() {
        l8 = confuse(f8);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m8 is F8<int>);
      Expect.equals(tIsBool, m8 is F8<bool>);
      Expect.equals(tIsInt, confuse(m8) is F8<int>);
      Expect.equals(tIsBool, confuse(m8) is F8<bool>);
    }
  }

  /// List<Function> Function(int y, [Function x]) 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 y, [Function x]) 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 y, [Function x]) 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 x2, [core.List<core.int> x3]) 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 x2, [core.List<core.int> x3]) 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 x2,
            [core.List<core.int> x3])
        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);
  }

  /// core.List<core.int> Function({int 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.
    core.List<core.int> Function({int 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 core.List<core.int> Function({int 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);
  }

  /// core.List<core.int> Function(core.List<core.int> 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(core.List<core.int> 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(core.List<core.int> 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);
  }

  /// List<T> Function(int x1, [int x]) Function(int x)
  void testF13() {
    Expect.isTrue(f13 is F13<int>);
    Expect.isTrue(confuse(f13) is F13<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x1, [int x]) 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 List<T> Function(int x1, [int x]) 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([List<Function> x1]) 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([List<Function> x1]) 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([List<Function> x1]) 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({List<T> 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({List<T> 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({List<T> 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(int y, {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(int y, {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(int y, {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 x1, [List<T> 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 x1, [List<T> 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 x1, [List<T> 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);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x17 = (f17 as dynamic);
      });
      Expect.throws(() {
        x17 = confuse(f17);
      });
      Expect.throws(() {
        l17 = (f17 as dynamic);
      });
      Expect.throws(() {
        l17 = confuse(f17);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m17 is F17<int>);
      Expect.equals(tIsBool, m17 is F17<bool>);
      Expect.equals(tIsInt, confuse(m17) is F17<int>);
      Expect.equals(tIsBool, confuse(m17) is F17<bool>);
    }
  }

  /// void Function(Function 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(Function 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(Function 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(int x, [core.List<core.int> x1]) 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(int x, [core.List<core.int> x1]) 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(int x, [core.List<core.int> x1]) 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);
  }

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

  /// List<T> Function<A>(List<Function> 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.
    List<T> Function<A>(List<Function> 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 List<T> Function<A>(List<Function> 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);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x21 = (f21 as dynamic);
      });
      Expect.throws(() {
        x21 = confuse(f21);
      });
      Expect.throws(() {
        l21 = (f21 as dynamic);
      });
      Expect.throws(() {
        l21 = confuse(f21);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m21 is F21<int>);
      Expect.equals(tIsBool, m21 is F21<bool>);
      Expect.equals(tIsInt, confuse(m21) is F21<int>);
      Expect.equals(tIsBool, confuse(m21) is F21<bool>);
    }
  }

  /// List<A> Function<A>(core.List<core.int> 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.
    List<A> Function<A>(core.List<core.int> 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 List<A> Function<A>(core.List<core.int> 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);
  }
}

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