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

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

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

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

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

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

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

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

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

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

  runTests() {
    testF0();
    testF1();
    testF2();
    testF3();
    testF4();
    testF5();
    testF6();
    testF7();
    testF8();
    testF9();
    testF10();
    testF11();
    testF12();
    testF13();
    testF14();
    testF15();
    testF16();
    testF17();
    testF18();
    testF19();
    testF20();
    testF21();
    testF22();
  }

  /// Function Function(int x0, [int x])
  void testF0() {
    Expect.isTrue(f0 is F0<int>);
    Expect.isTrue(confuse(f0) is F0<int>);
    // In checked mode, verifies the type.
    Function Function(int x0, [int x]) l0;
    // The static function f0 sets `T` to `int`.
    if (tIsInt) {
      x0 = f0 as dynamic;
      l0 = f0 as dynamic;
      x0 = confuse(f0);
      l0 = confuse(f0);
    }

    Expect.isTrue(m0 is F0<T>);
    Expect.isTrue(m0 is Function Function(int x0, [int x]));
    Expect.isTrue(confuse(m0) is F0<T>);
    // In checked mode, verifies the type.
    x0 = m0;
    l0 = m0;
    x0 = confuse(m0);
    l0 = confuse(m0);
  }

  /// List<Function> Function(int x0, [List<T> x])
  void testF1() {
    Expect.isTrue(f1 is F1<int>);
    Expect.isTrue(confuse(f1) is F1<int>);
    // In checked mode, verifies the type.
    List<Function> Function(int x0, [List<T> 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 List<Function> Function(int x0, [List<T> x]));
    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(tIsInt, m1 is F1<int>);
      Expect.equals(tIsBool, m1 is F1<bool>);
      Expect.equals(tIsInt, confuse(m1) is F1<int>);
      Expect.equals(tIsBool, confuse(m1) is F1<bool>);
    }
  }

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

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

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

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

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

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

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

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

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