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

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

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

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

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

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

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

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

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

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

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

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

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

  /// void Function(int x)
  void testF3() {
    Expect.isTrue(f3 is F3);
    Expect.isTrue(confuse(f3) is F3);
    // In checked mode, verifies the type.
    void Function(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 x));
    Expect.isTrue(confuse(m3) is F3);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

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

    Expect.isTrue(m4 is F4);
    Expect.isTrue(m4 is Function<A>(List<T> x));
    Expect.isTrue(confuse(m4) is F4);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
    if (!tIsBool) {
      Expect.isTrue(f4 is F4<int>);
      Expect.isFalse(f4 is F4<bool>);
      Expect.isTrue(confuse(f4) is F4<int>);
      Expect.isFalse(confuse(f4) is F4<bool>);
      Expect.equals(tIsDynamic, m4 is F4<bool>);
      Expect.equals(tIsDynamic, confuse(m4) is F4<bool>);
    } else {
      if (typeAssertionsEnabled) {
        Expect.throws(() {
          x4 = (f4 as dynamic);
        });
        Expect.throws(() {
          x4 = confuse(f4);
        });
        Function<A>(List<T> x) l4;
        Expect.throws(() {
          l4 = (f4 as dynamic);
        });
        Expect.throws(() {
          l4 = confuse(f4);
        });
      }
      Function<A>(List<T> x) l4 = m4;
      // In checked mode, verifies the type.
      x4 = m4;
      x4 = confuse(m4);
    }
  }

  /// int Function(int x, [Function x2]) Function()
  void testF5() {
    Expect.isTrue(f5 is F5);
    Expect.isTrue(confuse(f5) is F5);
    // In checked mode, verifies the type.
    int Function(int x, [Function x2]) Function() 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 x, [Function x2]) Function());
    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 y, {core.List<core.int> x}) Function()
  void testF6() {
    Expect.isTrue(f6 is F6);
    Expect.isTrue(confuse(f6) is F6);
    // In checked mode, verifies the type.
    int Function(int y, {core.List<core.int> x}) Function() 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 y, {core.List<core.int> x}) Function());
    Expect.isTrue(confuse(m6) is F6);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function([Function x]) Function()
  void testF7() {
    Expect.isTrue(f7 is F7);
    Expect.isTrue(confuse(f7) is F7);
    // In checked mode, verifies the type.
    Function Function([Function x]) Function() 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([Function x]) Function());
    Expect.isTrue(confuse(m7) is F7);
    // In checked mode, verifies the type.
    x7 = m7;
    l7 = m7;
    x7 = confuse(m7);
    l7 = confuse(m7);
  }

  /// Function Function(core.List<core.int> x0) Function()
  void testF8() {
    Expect.isTrue(f8 is F8);
    Expect.isTrue(confuse(f8) is F8);
    // In checked mode, verifies the type.
    Function Function(core.List<core.int> x0) Function() 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(core.List<core.int> x0) Function());
    Expect.isTrue(confuse(m8) is F8);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
  }

  /// List<Function> Function(int x1, [int x2]) Function()
  void testF9() {
    Expect.isTrue(f9 is F9);
    Expect.isTrue(confuse(f9) is F9);
    // In checked mode, verifies the type.
    List<Function> Function(int x1, [int x2]) Function() 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 x1, [int x2]) Function());
    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 x0, {List<Function> x}) Function()
  void testF10() {
    Expect.isTrue(f10 is F10);
    Expect.isTrue(confuse(f10) is F10);
    // In checked mode, verifies the type.
    List<Function> Function(int x0, {List<Function> x}) Function() 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 x0, {List<Function> x}) Function());
    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()
  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() 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());
    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 y, [List<Function> x]) Function()
  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 y, [List<Function> x]) Function() 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 y, [List<Function> x])
        Function());
    Expect.isTrue(confuse(m12) is F12);
    // In checked mode, verifies the type.
    x12 = m12;
    l12 = m12;
    x12 = confuse(m12);
    l12 = confuse(m12);
  }

  /// core.List<core.int> Function(int x1, [List<T> x2]) Function()
  void testF13() {
    Expect.isTrue(f13 is F13);
    Expect.isTrue(confuse(f13) is F13);
    // In checked mode, verifies the type.
    core.List<core.int> Function(int x1, [List<T> x2]) Function() l13;
    // The static function f13 sets `T` to `int`.
    if (!tIsBool) {
      x13 = f13 as dynamic;
      l13 = f13 as dynamic;
      x13 = confuse(f13);
      l13 = confuse(f13);
    }

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

  /// List<T> Function({Function x}) Function()
  void testF14() {
    Expect.isTrue(f14 is F14);
    Expect.isTrue(confuse(f14) is F14);
    // In checked mode, verifies the type.
    List<T> Function({Function x}) Function() 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({Function x}) Function());
    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({Function x}) Function() l14;
        Expect.throws(() {
          l14 = (f14 as dynamic);
        });
        Expect.throws(() {
          l14 = confuse(f14);
        });
      }
      List<T> Function({Function x}) Function() l14 = m14;
      // In checked mode, verifies the type.
      x14 = m14;
      x14 = confuse(m14);
    }
  }

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

  /// Function(int x0, [Function x]) Function()
  void testF16() {
    Expect.isTrue(f16 is F16);
    Expect.isTrue(confuse(f16) is F16);
    // In checked mode, verifies the type.
    Function(int x0, [Function x]) Function() 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 x0, [Function x]) Function());
    Expect.isTrue(confuse(m16) is F16);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function([core.List<core.int> x1]) Function()
  void testF17() {
    Expect.isTrue(f17 is F17);
    Expect.isTrue(confuse(f17) is F17);
    // In checked mode, verifies the type.
    Function([core.List<core.int> x1]) Function() 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([core.List<core.int> x1]) Function());
    Expect.isTrue(confuse(m17) is F17);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
  }

  /// void Function(int x, [int x2]) Function()
  void testF18() {
    Expect.isTrue(f18 is F18);
    Expect.isTrue(confuse(f18) is F18);
    // In checked mode, verifies the type.
    void Function(int x, [int x2]) Function() 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 x, [int x2]) Function());
    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 y, {List<Function> x}) Function()
  void testF19() {
    Expect.isTrue(f19 is F19);
    Expect.isTrue(confuse(f19) is F19);
    // In checked mode, verifies the type.
    void Function(int y, {List<Function> x}) Function() 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 y, {List<Function> x}) Function());
    Expect.isTrue(confuse(m19) is F19);
    // In checked mode, verifies the type.
    x19 = m19;
    l19 = m19;
    x19 = confuse(m19);
    l19 = confuse(m19);
  }

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

  /// core.List<core.int> Function<A>(List<Function> x) Function()
  void testF21() {
    Expect.isTrue(f21 is F21);
    Expect.isTrue(confuse(f21) is F21);
    // In checked mode, verifies the type.
    core.List<core.int> Function<A>(List<Function> x) Function() 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 core.List<core.int> Function<A>(List<Function> x) Function());
    Expect.isTrue(confuse(m21) is F21);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
  }

  /// A Function<A>(core.List<core.int> x) Function()
  void testF22() {
    Expect.isTrue(f22 is F22);
    Expect.isTrue(confuse(f22) is F22);
    // In checked mode, verifies the type.
    A Function<A>(core.List<core.int> x) Function() 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 A Function<A>(core.List<core.int> x) Function());
    Expect.isTrue(confuse(m22) is F22);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }

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

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

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