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

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

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

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

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

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

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

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

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

    Expect.isTrue(m1 is F1<T>);
    Expect.isTrue(m1 is Function Function());
    Expect.isTrue(confuse(m1) is F1<T>);
    // In checked mode, verifies the type.
    x1 = m1;
    l1 = m1;
    x1 = confuse(m1);
    l1 = confuse(m1);
  }

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

    Expect.isTrue(m2 is F2<T>);
    Expect.isTrue(
        m2 is core.List<core.int> Function(int y, {core.List<core.int> x}));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
  }

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

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

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

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

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

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

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

  /// List<Function> Function([List<T> 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.
    List<Function> Function([List<T> 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 List<Function> Function([List<T> 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);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x11 = (f11 as dynamic);
      });
      Expect.throws(() {
        x11 = confuse(f11);
      });
      Expect.throws(() {
        l11 = (f11 as dynamic);
      });
      Expect.throws(() {
        l11 = confuse(f11);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m11 is F11<int>);
      Expect.equals(tIsBool, m11 is F11<bool>);
      Expect.equals(tIsInt, confuse(m11) is F11<int>);
      Expect.equals(tIsBool, confuse(m11) is F11<bool>);
    }
  }

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

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

  /// void Function(int x2, [List<T> x3]) 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.
    void Function(int x2, [List<T> x3]) 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 void Function(int x2, [List<T> x3])
        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);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throws(() {
        x20 = (f20 as dynamic);
      });
      Expect.throws(() {
        x20 = confuse(f20);
      });
      Expect.throws(() {
        l20 = (f20 as dynamic);
      });
      Expect.throws(() {
        l20 = confuse(f20);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m20 is F20<int>);
      Expect.equals(tIsBool, m20 is F20<bool>);
      Expect.equals(tIsInt, confuse(m20) is F20<int>);
      Expect.equals(tIsBool, confuse(m20) is F20<bool>);
    }
  }

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

  /// Function<A>(List<T> 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.
    Function<A>(List<T> 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 Function<A>(List<T> 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);
    // The static function has its T always set to int.
    Expect.isTrue(f22 is F22<int>);
    Expect.isFalse(f22 is F22<bool>);
    Expect.isTrue(confuse(f22) is F22<int>);
    Expect.isFalse(confuse(f22) is F22<bool>);
    if (tIsBool) {
      Expect.throws(() {
        x22 = (f22 as dynamic);
      });
      Expect.throws(() {
        x22 = confuse(f22);
      });
      Expect.throws(() {
        l22 = (f22 as dynamic);
      });
      Expect.throws(() {
        l22 = confuse(f22);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m22 is F22<int>);
      Expect.equals(tIsBool, m22 is F22<bool>);
      Expect.equals(tIsInt, confuse(m22) is F22<int>);
      Expect.equals(tIsBool, confuse(m22) is F22<bool>);
    }
  }

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

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

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