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

final bool inCheckedMode = (() {
  bool result = false;
  assert(result = true);
  return result;
})();

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

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

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

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

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

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

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

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

  /// List<Function> Function(int x0, [int x])
  void testF1() {
    Expect.isTrue(f1 is F1);
    Expect.isTrue(confuse(f1) is F1);
    // In checked mode, verifies the type.
    List<Function> Function(int x0, [int x]) l1;
    // The static function f1 sets `T` to `int`.
    if (!tIsBool) {
      x1 = f1 as dynamic;
      l1 = f1 as dynamic;
      x1 = confuse(f1);
      l1 = confuse(f1);
    }

    Expect.isTrue(m1 is F1);
    Expect.isTrue(m1 is List<Function> Function(int x0, [int x]));
    Expect.isTrue(confuse(m1) is F1);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
  }

  /// core.List<core.int> Function(int x0, [List<T> x])
  void testF2() {
    Expect.isTrue(f2 is F2);
    Expect.isTrue(confuse(f2) is F2);
    // In checked mode, verifies the type.
    core.List<core.int> Function(int x0, [List<T> x]) l2;
    // The static function f2 sets `T` to `int`.
    if (!tIsBool) {
      x2 = f2 as dynamic;
      l2 = f2 as dynamic;
      x2 = confuse(f2);
      l2 = confuse(f2);
    }

    Expect.isTrue(m2 is F2);
    Expect.isTrue(m2 is core.List<core.int> Function(int x0, [List<T> x]));
    Expect.isTrue(confuse(m2) is F2);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m2 is F2<bool>);
      Expect.equals(tIsDynamic, confuse(m2) is F2<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x2 = (f2 as dynamic);
        });
        Expect.throws(() {
          x2 = confuse(f2);
        });
        core.List<core.int> Function(int x0, [List<T> x]) l2;
        Expect.throws(() {
          l2 = (f2 as dynamic);
        });
        Expect.throws(() {
          l2 = confuse(f2);
        });
      }
      core.List<core.int> Function(int x0, [List<T> x]) l2 = m2;
      // In checked mode, verifies the type.
      x2 = m2;
      x2 = confuse(m2);
    }
  }

  /// Function([core.List<core.int> x])
  void testF3() {
    Expect.isTrue(f3 is F3);
    Expect.isTrue(confuse(f3) is F3);
    // In checked mode, verifies the type.
    Function([core.List<core.int> x]) l3;
    // The static function f3 sets `T` to `int`.
    if (!tIsBool) {
      x3 = f3 as dynamic;
      l3 = f3 as dynamic;
      x3 = confuse(f3);
      l3 = confuse(f3);
    }

    Expect.isTrue(m3 is F3);
    Expect.isTrue(m3 is Function([core.List<core.int> x]));
    Expect.isTrue(confuse(m3) is F3);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

  /// List<Function> Function<A>(A x)
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    List<Function> Function<A>(A x) l4;
    // The static function f4 sets `T` to `int`.
    if (!tIsBool) {
      x4 = f4 as dynamic;
      l4 = f4 as dynamic;
      x4 = confuse(f4);
      l4 = confuse(f4);
    }

    Expect.isTrue(m4 is F4);
    Expect.isTrue(m4 is List<Function> Function<A>(A x));
    Expect.isTrue(confuse(m4) is F4);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
  }

  /// int Function([Function x]) Function<B extends core.int>()
  void testF5() {
    Expect.isTrue(f5 is F5);
    Expect.isTrue(confuse(f5) is F5);
    // In checked mode, verifies the type.
    int Function([Function x]) Function<B extends core.int>() l5;
    // The static function f5 sets `T` to `int`.
    if (!tIsBool) {
      x5 = f5 as dynamic;
      l5 = f5 as dynamic;
      x5 = confuse(f5);
      l5 = confuse(f5);
    }

    Expect.isTrue(m5 is F5);
    Expect.isTrue(
        m5 is int Function([Function x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m5) is F5);
    // In checked mode, verifies the type.
    x5 = m5;
    l5 = m5;
    x5 = confuse(m5);
    l5 = confuse(m5);
  }

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

    Expect.isTrue(m6 is F6);
    Expect.isTrue(m6 is int Function(
        core.List<core.int> x1) Function<B extends core.int>());
    Expect.isTrue(confuse(m6) is F6);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function(int x2, [int x3]) Function<B extends core.int>()
  void testF7() {
    Expect.isTrue(f7 is F7);
    Expect.isTrue(confuse(f7) is F7);
    // In checked mode, verifies the type.
    Function Function(int x2, [int x3]) Function<B extends core.int>() l7;
    // The static function f7 sets `T` to `int`.
    if (!tIsBool) {
      x7 = f7 as dynamic;
      l7 = f7 as dynamic;
      x7 = confuse(f7);
      l7 = confuse(f7);
    }

    Expect.isTrue(m7 is F7);
    Expect.isTrue(m7 is Function Function(int x2,
        [int x3]) Function<B extends core.int>());
    Expect.isTrue(confuse(m7) is F7);
    // In checked mode, verifies the type.
    x7 = m7;
    l7 = m7;
    x7 = confuse(m7);
    l7 = confuse(m7);
  }

  /// Function Function(int x1, {List<Function> x}) Function<B extends core.int>()
  void testF8() {
    Expect.isTrue(f8 is F8);
    Expect.isTrue(confuse(f8) is F8);
    // In checked mode, verifies the type.
    Function Function(int x1, {List<Function> x}) Function<B extends core.int>()
        l8;
    // The static function f8 sets `T` to `int`.
    if (!tIsBool) {
      x8 = f8 as dynamic;
      l8 = f8 as dynamic;
      x8 = confuse(f8);
      l8 = confuse(f8);
    }

    Expect.isTrue(m8 is F8);
    Expect.isTrue(m8 is Function Function(int x1,
        {List<Function> x}) Function<B extends core.int>());
    Expect.isTrue(confuse(m8) is F8);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
  }

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

    Expect.isTrue(m9 is F9);
    Expect.isTrue(
        m9 is List<Function> Function(int x) Function<B extends core.int>());
    Expect.isTrue(confuse(m9) is F9);
    // In checked mode, verifies the type.
    x9 = m9;
    l9 = m9;
    x9 = confuse(m9);
    l9 = confuse(m9);
  }

  /// List<Function> Function(int y, [List<Function> x]) Function<B extends core.int>()
  void testF10() {
    Expect.isTrue(f10 is F10);
    Expect.isTrue(confuse(f10) is F10);
    // In checked mode, verifies the type.
    List<Function> Function(int y,
        [List<Function> x]) Function<B extends core.int>() l10;
    // The static function f10 sets `T` to `int`.
    if (!tIsBool) {
      x10 = f10 as dynamic;
      l10 = f10 as dynamic;
      x10 = confuse(f10);
      l10 = confuse(f10);
    }

    Expect.isTrue(m10 is F10);
    Expect.isTrue(m10 is List<Function> Function(int y,
        [List<Function> x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m10) is F10);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

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

    Expect.isTrue(m11 is F11);
    Expect.isTrue(m11 is List<Function> Function(int x2,
        [List<T> x3]) Function<B extends core.int>());
    Expect.isTrue(confuse(m11) is F11);
    // In checked mode, verifies the type.
    x11 = m11;
    l11 = m11;
    x11 = confuse(m11);
    l11 = confuse(m11);
    if (!tIsBool) {
      Expect.isTrue(f11 is F11<int>);
      Expect.isFalse(f11 is F11<bool>);
      Expect.isTrue(confuse(f11) is F11<int>);
      Expect.isFalse(confuse(f11) is F11<bool>);
      Expect.equals(tIsDynamic, m11 is F11<bool>);
      Expect.equals(tIsDynamic, confuse(m11) is F11<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x11 = (f11 as dynamic);
        });
        Expect.throws(() {
          x11 = confuse(f11);
        });
        List<Function> Function(int x2,
            [List<T> x3]) Function<B extends core.int>() l11;
        Expect.throws(() {
          l11 = (f11 as dynamic);
        });
        Expect.throws(() {
          l11 = confuse(f11);
        });
      }
      List<Function> Function(int x2,
          [List<T> x3]) Function<B extends core.int>() l11 = m11;
      // In checked mode, verifies the type.
      x11 = m11;
      x11 = confuse(m11);
    }
  }

  /// core.List<core.int> Function({Function x}) Function<B extends core.int>()
  void testF12() {
    Expect.isTrue(f12 is F12);
    Expect.isTrue(confuse(f12) is F12);
    // In checked mode, verifies the type.
    core.List<core.int> Function({Function x}) Function<B extends core.int>()
        l12;
    // The static function f12 sets `T` to `int`.
    if (!tIsBool) {
      x12 = f12 as dynamic;
      l12 = f12 as dynamic;
      x12 = confuse(f12);
      l12 = confuse(f12);
    }

    Expect.isTrue(m12 is F12);
    Expect.isTrue(m12 is core.List<core.int> Function(
        {Function x}) Function<B extends core.int>());
    Expect.isTrue(confuse(m12) is F12);
    // In checked mode, verifies the type.
    x12 = m12;
    l12 = m12;
    x12 = confuse(m12);
    l12 = confuse(m12);
  }

  /// core.List<core.int> Function(List<T> x) Function<B extends core.int>()
  void testF13() {
    Expect.isTrue(f13 is F13);
    Expect.isTrue(confuse(f13) is F13);
    // In checked mode, verifies the type.
    core.List<core.int> Function(List<T> x) Function<B extends core.int>() l13;
    // The static function f13 sets `T` to `int`.
    if (!tIsBool) {
      x13 = f13 as dynamic;
      l13 = f13 as dynamic;
      x13 = confuse(f13);
      l13 = confuse(f13);
    }

    Expect.isTrue(m13 is F13);
    Expect.isTrue(m13 is core.List<core.int> Function(
        List<T> x) Function<B extends core.int>());
    Expect.isTrue(confuse(m13) is F13);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m13 is F13<bool>);
      Expect.equals(tIsDynamic, confuse(m13) is F13<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x13 = (f13 as dynamic);
        });
        Expect.throws(() {
          x13 = confuse(f13);
        });
        core.List<core.int> Function(List<T> x) Function<B extends core.int>()
            l13;
        Expect.throws(() {
          l13 = (f13 as dynamic);
        });
        Expect.throws(() {
          l13 = confuse(f13);
        });
      }
      core.List<core.int> Function(List<T> x) Function<B extends core.int>()
          l13 = m13;
      // In checked mode, verifies the type.
      x13 = m13;
      x13 = confuse(m13);
    }
  }

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

    Expect.isTrue(m14 is F14);
    Expect.isTrue(m14 is List<T> Function(int x1,
        [Function x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m14) is F14);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m14 is F14<bool>);
      Expect.equals(tIsDynamic, confuse(m14) is F14<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x14 = (f14 as dynamic);
        });
        Expect.throws(() {
          x14 = confuse(f14);
        });
        List<T> Function(int x1, [Function x]) Function<B extends core.int>()
            l14;
        Expect.throws(() {
          l14 = (f14 as dynamic);
        });
        Expect.throws(() {
          l14 = confuse(f14);
        });
      }
      List<T> Function(int x1, [Function x]) Function<B extends core.int>()
          l14 = m14;
      // In checked mode, verifies the type.
      x14 = m14;
      x14 = confuse(m14);
    }
  }

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

    Expect.isTrue(m15 is F15);
    Expect.isTrue(m15 is List<T> Function(
        [core.List<core.int> x1]) Function<B extends core.int>());
    Expect.isTrue(confuse(m15) is F15);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m15 is F15<bool>);
      Expect.equals(tIsDynamic, confuse(m15) is F15<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x15 = (f15 as dynamic);
        });
        Expect.throws(() {
          x15 = confuse(f15);
        });
        List<T> Function(
            [core.List<core.int> x1]) Function<B extends core.int>() l15;
        Expect.throws(() {
          l15 = (f15 as dynamic);
        });
        Expect.throws(() {
          l15 = confuse(f15);
        });
      }
      List<T> Function([core.List<core.int> x1]) Function<B extends core.int>()
          l15 = m15;
      // In checked mode, verifies the type.
      x15 = m15;
      x15 = confuse(m15);
    }
  }

  /// Function(int x, [int x1]) Function<B extends core.int>()
  void testF16() {
    Expect.isTrue(f16 is F16);
    Expect.isTrue(confuse(f16) is F16);
    // In checked mode, verifies the type.
    Function(int x, [int x1]) Function<B extends core.int>() l16;
    // The static function f16 sets `T` to `int`.
    if (!tIsBool) {
      x16 = f16 as dynamic;
      l16 = f16 as dynamic;
      x16 = confuse(f16);
      l16 = confuse(f16);
    }

    Expect.isTrue(m16 is F16);
    Expect.isTrue(
        m16 is Function(int x, [int x1]) Function<B extends core.int>());
    Expect.isTrue(confuse(m16) is F16);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

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

    Expect.isTrue(m17 is F17);
    Expect.isTrue(m17 is Function(int y,
        {List<Function> x}) Function<B extends core.int>());
    Expect.isTrue(confuse(m17) is F17);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
  }

  /// void Function([int x]) Function<B extends core.int>()
  void testF18() {
    Expect.isTrue(f18 is F18);
    Expect.isTrue(confuse(f18) is F18);
    // In checked mode, verifies the type.
    void Function([int x]) Function<B extends core.int>() l18;
    // The static function f18 sets `T` to `int`.
    if (!tIsBool) {
      x18 = f18 as dynamic;
      l18 = f18 as dynamic;
      x18 = confuse(f18);
      l18 = confuse(f18);
    }

    Expect.isTrue(m18 is F18);
    Expect.isTrue(m18 is void Function([int x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m18) is F18);
    // In checked mode, verifies the type.
    x18 = m18;
    l18 = m18;
    x18 = confuse(m18);
    l18 = confuse(m18);
  }

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

    Expect.isTrue(m19 is F19);
    Expect.isTrue(
        m19 is void Function(List<Function> x1) Function<B extends core.int>());
    Expect.isTrue(confuse(m19) is F19);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

  /// void Function(int x, [List<T> x1]) Function<B extends core.int>()
  void testF20() {
    Expect.isTrue(f20 is F20);
    Expect.isTrue(confuse(f20) is F20);
    // In checked mode, verifies the type.
    void Function(int x, [List<T> x1]) Function<B extends core.int>() l20;
    // The static function f20 sets `T` to `int`.
    if (!tIsBool) {
      x20 = f20 as dynamic;
      l20 = f20 as dynamic;
      x20 = confuse(f20);
      l20 = confuse(f20);
    }

    Expect.isTrue(m20 is F20);
    Expect.isTrue(m20 is void Function(int x,
        [List<T> x1]) Function<B extends core.int>());
    Expect.isTrue(confuse(m20) is F20);
    // In checked mode, verifies the type.
    x20 = m20;
    l20 = m20;
    x20 = confuse(m20);
    l20 = confuse(m20);
    if (!tIsBool) {
      Expect.isTrue(f20 is F20<int>);
      Expect.isFalse(f20 is F20<bool>);
      Expect.isTrue(confuse(f20) is F20<int>);
      Expect.isFalse(confuse(f20) is F20<bool>);
      Expect.equals(tIsDynamic, m20 is F20<bool>);
      Expect.equals(tIsDynamic, confuse(m20) is F20<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x20 = (f20 as dynamic);
        });
        Expect.throws(() {
          x20 = confuse(f20);
        });
        void Function(int x, [List<T> x1]) Function<B extends core.int>() l20;
        Expect.throws(() {
          l20 = (f20 as dynamic);
        });
        Expect.throws(() {
          l20 = confuse(f20);
        });
      }
      void Function(int x, [List<T> x1]) Function<B extends core.int>() l20 =
          m20;
      // In checked mode, verifies the type.
      x20 = m20;
      x20 = confuse(m20);
    }
  }

  /// List<Function> Function<A>(List<T> x) Function<B extends core.int>()
  void testF21() {
    Expect.isTrue(f21 is F21);
    Expect.isTrue(confuse(f21) is F21);
    // In checked mode, verifies the type.
    List<Function> Function<A>(List<T> x) Function<B extends core.int>() l21;
    // The static function f21 sets `T` to `int`.
    if (!tIsBool) {
      x21 = f21 as dynamic;
      l21 = f21 as dynamic;
      x21 = confuse(f21);
      l21 = confuse(f21);
    }

    Expect.isTrue(m21 is F21);
    Expect.isTrue(m21 is List<Function> Function<A>(
        List<T> x) Function<B extends core.int>());
    Expect.isTrue(confuse(m21) is F21);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m21 is F21<bool>);
      Expect.equals(tIsDynamic, confuse(m21) is F21<bool>);
    } else {
      if (inCheckedMode) {
        Expect.throws(() {
          x21 = (f21 as dynamic);
        });
        Expect.throws(() {
          x21 = confuse(f21);
        });
        List<Function> Function<A>(List<T> x) Function<B extends core.int>()
            l21;
        Expect.throws(() {
          l21 = (f21 as dynamic);
        });
        Expect.throws(() {
          l21 = confuse(f21);
        });
      }
      List<Function> Function<A>(List<T> x) Function<B extends core.int>() l21 =
          m21;
      // In checked mode, verifies the type.
      x21 = m21;
      x21 = confuse(m21);
    }
  }

  /// Function<A>() Function<B extends core.int>()
  void testF22() {
    Expect.isTrue(f22 is F22);
    Expect.isTrue(confuse(f22) is F22);
    // In checked mode, verifies the type.
    Function<A>() Function<B extends core.int>() l22;
    // The static function f22 sets `T` to `int`.
    if (!tIsBool) {
      x22 = f22 as dynamic;
      l22 = f22 as dynamic;
      x22 = confuse(f22);
      l22 = confuse(f22);
    }

    Expect.isTrue(m22 is F22);
    Expect.isTrue(m22 is Function<A>() Function<B extends core.int>());
    Expect.isTrue(confuse(m22) is F22);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }

  /// void Function<A>(A x) Function<B extends core.int>()
  void testF23() {
    Expect.isTrue(f23 is F23);
    Expect.isTrue(confuse(f23) is F23);
    // In checked mode, verifies the type.
    void Function<A>(A x) Function<B extends core.int>() l23;
    // The static function f23 sets `T` to `int`.
    if (!tIsBool) {
      x23 = f23 as dynamic;
      l23 = f23 as dynamic;
      x23 = confuse(f23);
      l23 = confuse(f23);
    }

    Expect.isTrue(m23 is F23);
    Expect.isTrue(m23 is void Function<A>(A x) Function<B extends core.int>());
    Expect.isTrue(confuse(m23) is F23);
    // In checked mode, verifies the type.
    x23 = m23;
    l23 = m23;
    x23 = confuse(m23);
    l23 = confuse(m23);
  }
}

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