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

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

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

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

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

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

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

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

  /// int Function()
  void testF0() {
    Expect.isTrue(f0 is F0<int>);
    Expect.isTrue(confuse(f0) is F0<int>);
    // In checked mode, verifies the type.
    int 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 int Function());
    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 y, {core.List<core.int> 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 y, {core.List<core.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 List<Function> Function(int y, {core.List<core.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 x0, {List<Function> 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 x0, {List<Function> 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 x0, {List<Function> 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({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({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({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);
  }

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

  /// int Function(int y, [List<T> x]) Function<B extends core.int>(int x)
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    int Function(int y, [List<T> x]) Function<B extends core.int>(int x) l6;
    // The static function f6 sets `T` to `int`.
    if (tIsInt) {
      x6 = f6 as dynamic;
      l6 = f6 as dynamic;
      x6 = confuse(f6);
      l6 = confuse(f6);
    }

    Expect.isTrue(m6 is F6<T>);
    Expect.isTrue(m6 is int Function(int y, [List<T> x])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
    // The static function has its T always set to int.
    Expect.isTrue(f6 is F6<int>);
    Expect.isFalse(f6 is F6<bool>);
    Expect.isTrue(confuse(f6) is F6<int>);
    Expect.isFalse(confuse(f6) is F6<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x6 = (f6 as dynamic);
      });
      Expect.throws(() {
        x6 = confuse(f6);
      });
      Expect.throws(() {
        l6 = (f6 as dynamic);
      });
      Expect.throws(() {
        l6 = confuse(f6);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m6 is F6<int>);
      Expect.equals(tIsBool, m6 is F6<bool>);
      Expect.equals(tIsInt, confuse(m6) is F6<int>);
      Expect.equals(tIsBool, confuse(m6) is F6<bool>);
    }
  }

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

  /// List<Function> Function(int y, {int x}) Function<B extends core.int>(int x)
  void testF9() {
    Expect.isTrue(f9 is F9<int>);
    Expect.isTrue(confuse(f9) is F9<int>);
    // In checked mode, verifies the type.
    List<Function> Function(int y, {int x}) Function<B extends core.int>(int x)
        l9;
    // The static function f9 sets `T` to `int`.
    if (tIsInt) {
      x9 = f9 as dynamic;
      l9 = f9 as dynamic;
      x9 = confuse(f9);
      l9 = confuse(f9);
    }

    Expect.isTrue(m9 is F9<T>);
    Expect.isTrue(m9 is List<Function> Function(int y, {int x})
        Function<B extends core.int>(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 x1, [core.List<core.int> x]) Function<B extends core.int>(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 x1, [core.List<core.int> x])
        Function<B extends core.int>(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 x1,
            [core.List<core.int> x])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m10) is F10<T>);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// core.List<core.int> Function(int x1) Function<B extends core.int>(int x)
  void testF11() {
    Expect.isTrue(f11 is F11<int>);
    Expect.isTrue(confuse(f11) is F11<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function(int x1) Function<B extends core.int>(int x)
        l11;
    // The static function f11 sets `T` to `int`.
    if (tIsInt) {
      x11 = f11 as dynamic;
      l11 = f11 as dynamic;
      x11 = confuse(f11);
      l11 = confuse(f11);
    }

    Expect.isTrue(m11 is F11<T>);
    Expect.isTrue(m11 is core.List<core.int> Function(int x1)
        Function<B extends core.int>(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(int x, [List<Function> x1]) Function<B extends core.int>(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(int x, [List<Function> x1])
        Function<B extends core.int>(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(int x,
            [List<Function> x1])
        Function<B extends core.int>(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);
  }

  /// core.List<core.int> Function(int y, {List<T> x}) Function<B extends core.int>(int x)
  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 y, {List<T> x})
        Function<B extends core.int>(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 core.List<core.int> Function(int y, {List<T> x})
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m13) is F13<T>);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    // The static function has its T always set to int.
    Expect.isTrue(f13 is F13<int>);
    Expect.isFalse(f13 is F13<bool>);
    Expect.isTrue(confuse(f13) is F13<int>);
    Expect.isFalse(confuse(f13) is F13<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x13 = (f13 as dynamic);
      });
      Expect.throws(() {
        x13 = confuse(f13);
      });
      Expect.throws(() {
        l13 = (f13 as dynamic);
      });
      Expect.throws(() {
        l13 = confuse(f13);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m13 is F13<int>);
      Expect.equals(tIsBool, m13 is F13<bool>);
      Expect.equals(tIsInt, confuse(m13) is F13<int>);
      Expect.equals(tIsBool, confuse(m13) is F13<bool>);
    }
  }

  /// List<T> Function([List<Function> x]) Function<B extends core.int>(int x)
  void testF14() {
    Expect.isTrue(f14 is F14<int>);
    Expect.isTrue(confuse(f14) is F14<int>);
    // In checked mode, verifies the type.
    List<T> Function([List<Function> x]) Function<B extends core.int>(int x)
        l14;
    // The static function f14 sets `T` to `int`.
    if (tIsInt) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14<T>);
    Expect.isTrue(m14 is List<T> Function([List<Function> x])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m14) is F14<T>);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    // The static function has its T always set to int.
    Expect.isTrue(f14 is F14<int>);
    Expect.isFalse(f14 is F14<bool>);
    Expect.isTrue(confuse(f14) is F14<int>);
    Expect.isFalse(confuse(f14) is F14<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x14 = (f14 as dynamic);
      });
      Expect.throws(() {
        x14 = confuse(f14);
      });
      Expect.throws(() {
        l14 = (f14 as dynamic);
      });
      Expect.throws(() {
        l14 = confuse(f14);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m14 is F14<int>);
      Expect.equals(tIsBool, m14 is F14<bool>);
      Expect.equals(tIsInt, confuse(m14) is F14<int>);
      Expect.equals(tIsBool, confuse(m14) is F14<bool>);
    }
  }

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

    Expect.isTrue(m15 is F15<T>);
    Expect.isTrue(m15 is List<T> Function(List<T> x1)
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    // The static function has its T always set to int.
    Expect.isTrue(f15 is F15<int>);
    Expect.isFalse(f15 is F15<bool>);
    Expect.isTrue(confuse(f15) is F15<int>);
    Expect.isFalse(confuse(f15) is F15<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x15 = (f15 as dynamic);
      });
      Expect.throws(() {
        x15 = confuse(f15);
      });
      Expect.throws(() {
        l15 = (f15 as dynamic);
      });
      Expect.throws(() {
        l15 = confuse(f15);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m15 is F15<int>);
      Expect.equals(tIsBool, m15 is F15<bool>);
      Expect.equals(tIsInt, confuse(m15) is F15<int>);
      Expect.equals(tIsBool, confuse(m15) is F15<bool>);
    }
  }

  /// Function(int x2, [Function x3]) Function<B extends core.int>(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 x2, [Function x3]) Function<B extends core.int>(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 x2, [Function x3])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m16) is F16<T>);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function(int x1, {core.List<core.int> x}) Function<B extends core.int>(int x)
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(int x1, {core.List<core.int> x}) Function<B extends core.int>(
        int x) l17;
    // The static function f17 sets `T` to `int`.
    if (tIsInt) {
      x17 = f17 as dynamic;
      l17 = f17 as dynamic;
      x17 = confuse(f17);
      l17 = confuse(f17);
    }

    Expect.isTrue(m17 is F17<T>);
    Expect.isTrue(m17 is Function(int x1, {core.List<core.int> x})
        Function<B extends core.int>(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);
  }

  /// void Function(Function x) Function<B extends core.int>(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<B extends core.int>(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<B extends core.int>(int x));
    Expect.isTrue(confuse(m18) is F18<T>);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

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

    Expect.isTrue(m19 is F19<T>);
    Expect.isTrue(m19 is void Function(int y, [core.List<core.int> x])
        Function<B extends core.int>(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);
  }

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

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

  /// A Function<A>(List<A> x) Function<B extends core.int>(int x)
  void testF22() {
    Expect.isTrue(f22 is F22<int>);
    Expect.isTrue(confuse(f22) is F22<int>);
    // In checked mode, verifies the type.
    A Function<A>(List<A> x) Function<B extends core.int>(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 A Function<A>(List<A> x) Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m22) is F22<T>);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }
}

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