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

void _voidFunction() {}

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

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

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

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

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

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

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

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

  /// core.List<core.int> Function([core.List<core.int>])
  void testF2() {
    Expect.isTrue(f2 is F2<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function([core.List<core.int>]) 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 core.List<core.int> Function([core.List<core.int>]));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
  }

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

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

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

  /// Function Function(int y, {List<T> x}) 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.
    Function Function(int y, {List<T> x}) 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 Function Function(int y, {List<T> x})
        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);
    // The static function has its T always set to int.
    Expect.isTrue(f9 is F9<int>);
    Expect.isFalse(f9 is F9<bool>);
    Expect.isTrue(confuse(f9) is F9<int>);
    Expect.isFalse(confuse(f9) is F9<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x9 = (f9 as dynamic);
      });
      Expect.throws(() {
        x9 = confuse(f9);
      });
      Expect.throws(() {
        l9 = (f9 as dynamic);
      });
      Expect.throws(() {
        l9 = confuse(f9);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m9 is F9<int>);
      Expect.equals(tIsBool, m9 is F9<bool>);
      Expect.equals(tIsInt, confuse(m9) is F9<int>);
      Expect.equals(tIsBool, confuse(m9) is F9<bool>);
    }
  }

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

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

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

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

  /// void Function([List<T>]) 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.
    void Function([List<T>]) 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 void Function([List<T>]) 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);
    // The static function has its T always set to int.
    Expect.isTrue(f20 is F20<int>);
    Expect.isFalse(f20 is F20<bool>);
    Expect.isTrue(confuse(f20) is F20<int>);
    Expect.isFalse(confuse(f20) is F20<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x20 = (f20 as dynamic);
      });
      Expect.throws(() {
        x20 = confuse(f20);
      });
      Expect.throws(() {
        l20 = (f20 as dynamic);
      });
      Expect.throws(() {
        l20 = confuse(f20);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m20 is F20<int>);
      Expect.equals(tIsBool, m20 is F20<bool>);
      Expect.equals(tIsInt, confuse(m20) is F20<int>);
      Expect.equals(tIsBool, confuse(m20) is F20<bool>);
    }
  }

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

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

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