// 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';
import 'package:expect/variations.dart' as v;

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

void _voidFunction() {}

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

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

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

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

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

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

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

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

  /// int Function([int]) 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]) 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]) 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> x}) 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> x}) 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> x}) 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() 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() 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() Function(int x));
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function(int, [List<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, [List<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, [List<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>]) 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>]) 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>]) 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.throwsWhen(v.checkedImplicitDowncasts, () {
        x8 = (f8 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x8 = confuse(f8);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l8 = (f8 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        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 x, [Function]) 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 x, [Function]) 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 x, [Function]) 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 y, {core.List<core.int> x}) 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 y, {core.List<core.int> x}) 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 y, {core.List<core.int> x})
        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([Function 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([Function 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([Function 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>) 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>) 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>)
        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, [int]) 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, [int]) 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, [int]) 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.throwsWhen(v.checkedImplicitDowncasts, () {
        x13 = (f13 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x13 = confuse(f13);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l13 = (f13 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        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, {List<Function> x}) Function(int x)
  void testF14() {
    Expect.isTrue(f14 is F14<int>);
    Expect.isTrue(confuse(f14) is F14<int>);
    // In checked mode, verifies the type.
    List<T> Function(int, {List<Function> x}) Function(int x) l14;
    // The static function f14 sets `T` to `int`.
    if (tIsInt) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14<T>);
    Expect.isTrue(
        m14 is List<T> Function(int, {List<Function> x}) 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.throwsWhen(v.checkedImplicitDowncasts, () {
        x14 = (f14 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x14 = confuse(f14);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l14 = (f14 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        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>);
    }
  }

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

    Expect.isTrue(m15 is F15<T>);
    Expect.isTrue(m15 is Function(int x) Function(int x));
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
  }

  /// Function(int y, [List<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, [List<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, [List<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, [List<T>]) 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, [List<T>]) 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, [List<T>]) 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.throwsWhen(v.checkedImplicitDowncasts, () {
        x17 = (f17 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x17 = confuse(f17);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l17 = (f17 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        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 x}) 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 x}) 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 x}) Function(int x));
    Expect.isTrue(confuse(m18) is F18<T>);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

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

    Expect.isTrue(m19 is F19<T>);
    Expect.isTrue(m19 is void Function(List<T> x) Function(int x));
    Expect.isTrue(confuse(m19) is F19<T>);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
    // The static function has its T always set to int.
    Expect.isTrue(f19 is F19<int>);
    Expect.isFalse(f19 is F19<bool>);
    Expect.isTrue(confuse(f19) is F19<int>);
    Expect.isFalse(confuse(f19) is F19<bool>);
    if (tIsBool) {
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x19 = (f19 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x19 = confuse(f19);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l19 = (f19 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l19 = confuse(f19);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m19 is F19<int>);
      Expect.equals(tIsBool, m19 is F19<bool>);
      Expect.equals(tIsInt, confuse(m19) is F19<int>);
      Expect.equals(tIsBool, confuse(m19) is F19<bool>);
    }
  }

  /// Function Function<A>() 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(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(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>(A 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>(A 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>(A 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.throwsWhen(v.checkedImplicitDowncasts, () {
        x21 = (f21 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x21 = confuse(f21);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l21 = (f21 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        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>(List<A> 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>(List<A> 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>(List<A> 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() {
  U85().runTests();
  U85<int>(tIsInt: true).runTests();
  U85<bool>(tIsBool: true).runTests();
}
