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

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

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

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

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

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

  /// core.List<core.int> Function(int x0, [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(int x0, [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(int x0, [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>(core.List<core.int> x)
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    Function Function<A>(core.List<core.int> 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>(core.List<core.int> 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>(int x)
  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>(int x) 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>(int x));
    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>(int x)
  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>(int x)
        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>(int x));
    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>(int x)
  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>(int x) 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>(int x));
    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>(int x)
  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>(
        int x) 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>(int x));
    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>(int x)
  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>(int x)
        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>(int x));
    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>(
            int x) l9;
        Expect.throws(() {
          l9 = (f9 as dynamic);
        });
        Expect.throws(() {
          l9 = confuse(f9);
        });
      }
      Function Function(int x1, {List<T> x}) Function<B extends core.int>(int x)
          l9 = m9;
      // In checked mode, verifies the type.
      x9 = m9;
      x9 = confuse(m9);
    }
  }

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

  /// Function(int x1) Function<B extends core.int>(int x)
  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>(int x) 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>(int x));
    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>(int x)
  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>(int x)
        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>(int x));
    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>(int x)
  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>(int x) 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>(int x));
    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>(int x) l18;
        Expect.throws(() {
          l18 = (f18 as dynamic);
        });
        Expect.throws(() {
          l18 = confuse(f18);
        });
      }
      Function(int y, {List<T> x}) Function<B extends core.int>(int x) l18 =
          m18;
      // In checked mode, verifies the type.
      x18 = m18;
      x18 = confuse(m18);
    }
  }

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

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