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

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

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

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

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

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

  /// Function Function(int x0, [List<T> x])
  void testF1() {
    Expect.isTrue(f1 is F1);
    Expect.isTrue(confuse(f1) is F1);
    // In checked mode, verifies the type.
    Function Function(int x0, [List<T> 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 Function Function(int x0, [List<T> x]));
    Expect.isTrue(confuse(m1) is F1);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
    if (!tIsBool) {
      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>);
      Expect.equals(tIsDynamic, m1 is F1<bool>);
      Expect.equals(tIsDynamic, confuse(m1) is F1<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x1 = (f1 as dynamic);
        });
        Expect.throws(() {
          x1 = confuse(f1);
        });
        Function Function(int x0, [List<T> x]) l1;
        Expect.throws(() {
          l1 = (f1 as dynamic);
        });
        Expect.throws(() {
          l1 = confuse(f1);
        });
      }
      Function Function(int x0, [List<T> x]) l1 = m1;
      // In checked mode, verifies the type.
      x1 = m1;
      x1 = confuse(m1);
    }
  }

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

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

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

  /// Function Function(int x1, {List<T> 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.
    Function Function(int x1, {List<T> 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 Function Function(int x1, {List<T> 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);
    if (!tIsBool) {
      Expect.isTrue(f9 is F9<int>);
      Expect.isFalse(f9 is F9<bool>);
      Expect.isTrue(confuse(f9) is F9<int>);
      Expect.isFalse(confuse(f9) is F9<bool>);
      Expect.equals(tIsDynamic, m9 is F9<bool>);
      Expect.equals(tIsDynamic, confuse(m9) is F9<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x9 = (f9 as dynamic);
        });
        Expect.throws(() {
          x9 = confuse(f9);
        });
        Function Function(int x1, {List<T> x}) Function<B extends core.int>()
            l9;
        Expect.throws(() {
          l9 = (f9 as dynamic);
        });
        Expect.throws(() {
          l9 = confuse(f9);
        });
      }
      Function Function(int x1, {List<T> x}) Function<B extends core.int>() l9 =
          m9;
      // In checked mode, verifies the type.
      x9 = m9;
      x9 = confuse(m9);
    }
  }

  /// List<Function> Function(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(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(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 y, [List<T> x]) 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 y, [List<T> x]) 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 y, [List<T> x])
        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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x11 = (f11 as dynamic);
        });
        Expect.throws(() {
          x11 = confuse(f11);
        });
        List<Function> Function(int y, [List<T> x])
            Function<B extends core.int>() l11;
        Expect.throws(() {
          l11 = (f11 as dynamic);
        });
        Expect.throws(() {
          l11 = confuse(f11);
        });
      }
      List<Function> Function(int y, [List<T> x]) Function<B extends core.int>()
          l11 = m11;
      // In checked mode, verifies the type.
      x11 = m11;
      x11 = confuse(m11);
    }
  }

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

  /// List<T> Function(int y, {int 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 y, {int 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 y, {int 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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x14 = (f14 as dynamic);
        });
        Expect.throws(() {
          x14 = confuse(f14);
        });
        List<T> Function(int y, {int x}) Function<B extends core.int>() l14;
        Expect.throws(() {
          l14 = (f14 as dynamic);
        });
        Expect.throws(() {
          l14 = confuse(f14);
        });
      }
      List<T> Function(int y, {int x}) Function<B extends core.int>() l14 = m14;
      // In checked mode, verifies the type.
      x14 = m14;
      x14 = confuse(m14);
    }
  }

  /// List<T> Function(int x1, [core.List<core.int> x]) 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(int x1, [core.List<core.int> x])
        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(int x1, [core.List<core.int> x])
        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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x15 = (f15 as dynamic);
        });
        Expect.throws(() {
          x15 = confuse(f15);
        });
        List<T> Function(int x1, [core.List<core.int> x])
            Function<B extends core.int>() l15;
        Expect.throws(() {
          l15 = (f15 as dynamic);
        });
        Expect.throws(() {
          l15 = confuse(f15);
        });
      }
      List<T> Function(int x1, [core.List<core.int> x])
          Function<B extends core.int>() l15 = m15;
      // In checked mode, verifies the type.
      x15 = m15;
      x15 = confuse(m15);
    }
  }

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

  /// Function(int y, {List<T> 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.
    Function(int y, {List<T> 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 Function(int y, {List<T> 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);
    if (!tIsBool) {
      Expect.isTrue(f18 is F18<int>);
      Expect.isFalse(f18 is F18<bool>);
      Expect.isTrue(confuse(f18) is F18<int>);
      Expect.isFalse(confuse(f18) is F18<bool>);
      Expect.equals(tIsDynamic, m18 is F18<bool>);
      Expect.equals(tIsDynamic, confuse(m18) is F18<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x18 = (f18 as dynamic);
        });
        Expect.throws(() {
          x18 = confuse(f18);
        });
        Function(int y, {List<T> x}) Function<B extends core.int>() l18;
        Expect.throws(() {
          l18 = (f18 as dynamic);
        });
        Expect.throws(() {
          l18 = confuse(f18);
        });
      }
      Function(int y, {List<T> x}) Function<B extends core.int>() l18 = m18;
      // In checked mode, verifies the type.
      x18 = m18;
      x18 = confuse(m18);
    }
  }

  /// void Function([List<Function> x]) 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> x]) 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> x])
        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(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(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(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 (typeAssertionsEnabled) {
        Expect.throws(() {
          x20 = (f20 as dynamic);
        });
        Expect.throws(() {
          x20 = confuse(f20);
        });
        void Function(List<T> x1) Function<B extends core.int>() l20;
        Expect.throws(() {
          l20 = (f20 as dynamic);
        });
        Expect.throws(() {
          l20 = confuse(f20);
        });
      }
      void Function(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>(Function 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>(Function 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>(Function 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);
  }

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