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

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

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

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

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

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

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

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

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

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