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


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


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

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


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

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

  /// Function Function([List<Function> x])
  void testF0() {
    Expect.isTrue(f0 is F0);
    Expect.isTrue(confuse(f0) is F0);
    // In checked mode, verifies the type.
    Function Function([List<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([List<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(Function 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(Function 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(Function 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()
  void testF2() {
    Expect.isTrue(f2 is F2);
    Expect.isTrue(confuse(f2) is F2);
    // In checked mode, verifies the type.
    List<T> Function() 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());
    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() l2;
        Expect.throws(() { l2 = (f2 as dynamic); });
        Expect.throws(() { l2 = confuse(f2); });
      }
      List<T> Function() l2 = m2;
      // In checked mode, verifies the type.
      x2 = m2;
      x2 = confuse(m2);
    }
  }

  /// void Function(int y, {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(int y, {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(int y, {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 y, [int x]) Function<B extends core.int>(int x)
  void testF4() {
    Expect.isTrue(f4 is F4);
    Expect.isTrue(confuse(f4) is F4);
    // In checked mode, verifies the type.
    int Function(int y, [int x]) Function<B extends core.int>(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 int Function(int y, [int x]) Function<B extends core.int>(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 x2, [List<Function> x3]) 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 x2, [List<Function> x3]) 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 x2, [List<Function> x3]) 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(int x1, {List<T> 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(int x1, {List<T> 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(int x1, {List<T> 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);
    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 x1, {List<T> x}) Function<B extends core.int>(int x) l6;
        Expect.throws(() { l6 = (f6 as dynamic); });
        Expect.throws(() { l6 = confuse(f6); });
      }
      int Function(int x1, {List<T> x}) Function<B extends core.int>(int x) l6 = m6;
      // In checked mode, verifies the type.
      x6 = m6;
      x6 = confuse(m6);
    }
  }

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

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

  }

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

  }

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

  }

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

  }

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

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

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

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

  /// void Function(int x2, [Function x3]) 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.
    void Function(int x2, [Function x3]) 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 void Function(int x2, [Function x3]) 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);

  }

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

  }

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

  }

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

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