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

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

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

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

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

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

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

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

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

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

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

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

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

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

  /// int Function([int x]) Function<B extends core.int>()
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    int Function([int x]) Function<B extends core.int>() 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 int Function([int x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m4) is F4);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
  }

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

    Expect.isTrue(m6 is F6);
    Expect.isTrue(
        m6 is int Function(int x, [List<T> x1]) Function<B extends core.int>());
    Expect.isTrue(confuse(m6) is F6);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
    if (!tIsBool) {
      Expect.isTrue(f6 is F6<int>);
      Expect.isFalse(f6 is F6<bool>);
      Expect.isTrue(confuse(f6) is F6<int>);
      Expect.isFalse(confuse(f6) is F6<bool>);
      Expect.equals(tIsDynamic, m6 is F6<bool>);
      Expect.equals(tIsDynamic, confuse(m6) is F6<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x6 = (f6 as dynamic);
        });
        Expect.throws(() {
          x6 = confuse(f6);
        });
        int Function(int x, [List<T> x1]) Function<B extends core.int>() l6;
        Expect.throws(() {
          l6 = (f6 as dynamic);
        });
        Expect.throws(() {
          l6 = confuse(f6);
        });
      }
      int Function(int x, [List<T> x1]) Function<B extends core.int>() l6 = m6;
      // In checked mode, verifies the type.
      x6 = m6;
      x6 = confuse(m6);
    }
  }

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

    Expect.isTrue(m8 is F8);
    Expect.isTrue(
        m8 is Function Function([List<T> x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m8) is F8);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
    if (!tIsBool) {
      Expect.isTrue(f8 is F8<int>);
      Expect.isFalse(f8 is F8<bool>);
      Expect.isTrue(confuse(f8) is F8<int>);
      Expect.isFalse(confuse(f8) is F8<bool>);
      Expect.equals(tIsDynamic, m8 is F8<bool>);
      Expect.equals(tIsDynamic, confuse(m8) is F8<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x8 = (f8 as dynamic);
        });
        Expect.throws(() {
          x8 = confuse(f8);
        });
        Function Function([List<T> x]) Function<B extends core.int>() l8;
        Expect.throws(() {
          l8 = (f8 as dynamic);
        });
        Expect.throws(() {
          l8 = confuse(f8);
        });
      }
      Function Function([List<T> x]) Function<B extends core.int>() l8 = m8;
      // In checked mode, verifies the type.
      x8 = m8;
      x8 = confuse(m8);
    }
  }

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

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

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

    Expect.isTrue(m10 is F10);
    Expect.isTrue(m10 is List<Function> Function(int x2,
            [core.List<core.int> x3])
        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);
  }

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

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

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

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

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

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

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

    Expect.isTrue(m17 is F17);
    Expect.isTrue(
        m17 is Function(int x1, [List<T> x]) Function<B extends core.int>());
    Expect.isTrue(confuse(m17) is F17);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
    if (!tIsBool) {
      Expect.isTrue(f17 is F17<int>);
      Expect.isFalse(f17 is F17<bool>);
      Expect.isTrue(confuse(f17) is F17<int>);
      Expect.isFalse(confuse(f17) is F17<bool>);
      Expect.equals(tIsDynamic, m17 is F17<bool>);
      Expect.equals(tIsDynamic, confuse(m17) is F17<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x17 = (f17 as dynamic);
        });
        Expect.throws(() {
          x17 = confuse(f17);
        });
        Function(int x1, [List<T> x]) Function<B extends core.int>() l17;
        Expect.throws(() {
          l17 = (f17 as dynamic);
        });
        Expect.throws(() {
          l17 = confuse(f17);
        });
      }
      Function(int x1, [List<T> x]) Function<B extends core.int>() l17 = m17;
      // In checked mode, verifies the type.
      x17 = m17;
      x17 = confuse(m17);
    }
  }

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

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

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

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

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

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

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