// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.
// GENERATED - DON'T EDIT.

import 'dart:core';
import 'dart:core' as core;
import 'package:expect/expect.dart';

@NoInline()
@AssumeDynamic()
confuse(f) => f;

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


typedef F0<T> = 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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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 (inCheckedMode) {
        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();
}
    