// 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';
import 'package:expect/variations.dart' as v;

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
confuse(f) => f;

void _voidFunction() {}

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

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

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

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

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

  int m0(int x0, [core.List<core.int> x = const []]) => throw 'uncalled';
  List<Function> m1([List<Function> x = const []]) => throw 'uncalled';
  List<T> m2(Function x) => throw 'uncalled';
  m3() => throw 'uncalled';
  m4<A>(core.List<core.int> x) => throw 'uncalled';
  int Function(int, [Function]) m5<B extends core.int>(int x) =>
      throw 'uncalled';
  int Function(int, {core.List<core.int> x}) m6<B extends core.int>(int x) =>
      throw 'uncalled';
  Function Function(Function x) m7<B extends core.int>(int x) =>
      throw 'uncalled';
  Function Function(int y, [core.List<core.int> x]) m8<B extends core.int>(
          int x) =>
      throw 'uncalled';
  List<Function> Function([int]) m9<B extends core.int>(int x) =>
      throw 'uncalled';
  List<Function> Function({List<Function> x}) m10<B extends core.int>(int x) =>
      throw 'uncalled';
  List<Function> Function() m11<B extends core.int>(int x) => throw 'uncalled';
  core.List<core.int> Function(int, [List<Function> x]) m12<B extends core.int>(
          int x) =>
      throw 'uncalled';
  core.List<core.int> Function([List<T>]) m13<B extends core.int>(int x) =>
      throw 'uncalled';
  List<T> Function(int x, [Function]) m14<B extends core.int>(int x) =>
      throw 'uncalled';
  List<T> Function(int y, {core.List<core.int> x}) m15<B extends core.int>(
          int x) =>
      throw 'uncalled';
  Function([Function x]) m16<B extends core.int>(int x) => throw 'uncalled';
  Function(core.List<core.int>) m17<B extends core.int>(int x) =>
      throw 'uncalled';
  void Function(int, [int]) m18<B extends core.int>(int x) => throw 'uncalled';
  void Function(int, {List<Function> x}) m19<B extends core.int>(int x) =>
      throw 'uncalled';
  int Function<A>(int x) m20<B extends core.int>(int x) => throw 'uncalled';
  core.List<core.int> Function<A>(Function x) m21<B extends core.int>(int x) =>
      throw 'uncalled';
  A Function<A>(List<Function> x) m22<B extends core.int>(int x) =>
      throw 'uncalled';
  List<B> Function(B x) m23<B extends core.int>(int x) => throw 'uncalled';

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

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

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

    Expect.isTrue(m1 is F1<T>);
    Expect.isTrue(m1 is List<Function> Function([List<Function> x]));
    Expect.isTrue(confuse(m1) is F1<T>);
    // 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<int>);
    Expect.isTrue(confuse(f2) is F2<int>);
    // In checked mode, verifies the type.
    List<T> Function(Function x) l2;
    // The static function f2 sets `T` to `int`.
    if (tIsInt) {
      x2 = f2 as dynamic;
      l2 = f2 as dynamic;
      x2 = confuse(f2);
      l2 = confuse(f2);
    }

    Expect.isTrue(m2 is F2<T>);
    Expect.isTrue(m2 is List<T> Function(Function x));
    Expect.isTrue(confuse(m2) is F2<T>);
    // In checked mode, verifies the type.
    x2 = m2;
    l2 = m2;
    x2 = confuse(m2);
    l2 = confuse(m2);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x2 = (f2 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x2 = confuse(f2);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l2 = (f2 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l2 = confuse(f2);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m2 is F2<int>);
      Expect.equals(tIsBool, m2 is F2<bool>);
      Expect.equals(tIsInt, confuse(m2) is F2<int>);
      Expect.equals(tIsBool, confuse(m2) is F2<bool>);
    }
  }

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

    Expect.isTrue(m3 is F3<T>);
    Expect.isTrue(m3 is Function());
    Expect.isTrue(confuse(m3) is F3<T>);
    // In checked mode, verifies the type.
    x3 = m3;
    l3 = m3;
    x3 = confuse(m3);
    l3 = confuse(m3);
  }

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

    Expect.isTrue(m4 is F4<T>);
    Expect.isTrue(m4 is Function<A>(core.List<core.int> x));
    Expect.isTrue(confuse(m4) is F4<T>);
    // In checked mode, verifies the type.
    x4 = m4;
    l4 = m4;
    x4 = confuse(m4);
    l4 = confuse(m4);
  }

  /// int Function(int, [Function]) Function<B extends core.int>(int x)
  void testF5() {
    Expect.isTrue(f5 is F5<int>);
    Expect.isTrue(confuse(f5) is F5<int>);
    // In checked mode, verifies the type.
    int Function(int, [Function]) Function<B extends core.int>(int x) l5;
    // The static function f5 sets `T` to `int`.
    if (tIsInt) {
      x5 = f5 as dynamic;
      l5 = f5 as dynamic;
      x5 = confuse(f5);
      l5 = confuse(f5);
    }

    Expect.isTrue(m5 is F5<T>);
    Expect.isTrue(m5 is int Function(int, [Function])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m5) is F5<T>);
    // In checked mode, verifies the type.
    x5 = m5;
    l5 = m5;
    x5 = confuse(m5);
    l5 = confuse(m5);
  }

  /// int Function(int, {core.List<core.int> x}) Function<B extends core.int>(int x)
  void testF6() {
    Expect.isTrue(f6 is F6<int>);
    Expect.isTrue(confuse(f6) is F6<int>);
    // In checked mode, verifies the type.
    int Function(int, {core.List<core.int> x}) Function<B extends core.int>(
        int x) l6;
    // The static function f6 sets `T` to `int`.
    if (tIsInt) {
      x6 = f6 as dynamic;
      l6 = f6 as dynamic;
      x6 = confuse(f6);
      l6 = confuse(f6);
    }

    Expect.isTrue(m6 is F6<T>);
    Expect.isTrue(m6 is int Function(int, {core.List<core.int> x})
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m6) is F6<T>);
    // In checked mode, verifies the type.
    x6 = m6;
    l6 = m6;
    x6 = confuse(m6);
    l6 = confuse(m6);
  }

  /// Function Function(Function x) Function<B extends core.int>(int x)
  void testF7() {
    Expect.isTrue(f7 is F7<int>);
    Expect.isTrue(confuse(f7) is F7<int>);
    // In checked mode, verifies the type.
    Function Function(Function x) Function<B extends core.int>(int x) l7;
    // The static function f7 sets `T` to `int`.
    if (tIsInt) {
      x7 = f7 as dynamic;
      l7 = f7 as dynamic;
      x7 = confuse(f7);
      l7 = confuse(f7);
    }

    Expect.isTrue(m7 is F7<T>);
    Expect.isTrue(m7 is Function Function(Function x)
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m7) is F7<T>);
    // In checked mode, verifies the type.
    x7 = m7;
    l7 = m7;
    x7 = confuse(m7);
    l7 = confuse(m7);
  }

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

    Expect.isTrue(m8 is F8<T>);
    Expect.isTrue(m8 is Function Function(int y, [core.List<core.int> x])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m8) is F8<T>);
    // In checked mode, verifies the type.
    x8 = m8;
    l8 = m8;
    x8 = confuse(m8);
    l8 = confuse(m8);
  }

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

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

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

    Expect.isTrue(m10 is F10<T>);
    Expect.isTrue(m10 is List<Function> Function({List<Function> x})
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m10) is F10<T>);
    // In checked mode, verifies the type.
    x10 = m10;
    l10 = m10;
    x10 = confuse(m10);
    l10 = confuse(m10);
  }

  /// List<Function> Function() Function<B extends core.int>(int x)
  void testF11() {
    Expect.isTrue(f11 is F11<int>);
    Expect.isTrue(confuse(f11) is F11<int>);
    // In checked mode, verifies the type.
    List<Function> Function() Function<B extends core.int>(int x) l11;
    // The static function f11 sets `T` to `int`.
    if (tIsInt) {
      x11 = f11 as dynamic;
      l11 = f11 as dynamic;
      x11 = confuse(f11);
      l11 = confuse(f11);
    }

    Expect.isTrue(m11 is F11<T>);
    Expect.isTrue(
        m11 is List<Function> Function() Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m11) is F11<T>);
    // In checked mode, verifies the type.
    x11 = m11;
    l11 = m11;
    x11 = confuse(m11);
    l11 = confuse(m11);
  }

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

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

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

    Expect.isTrue(m13 is F13<T>);
    Expect.isTrue(m13 is core.List<core.int> Function([List<T>])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m13) is F13<T>);
    // In checked mode, verifies the type.
    x13 = m13;
    l13 = m13;
    x13 = confuse(m13);
    l13 = confuse(m13);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x13 = (f13 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x13 = confuse(f13);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l13 = (f13 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l13 = confuse(f13);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m13 is F13<int>);
      Expect.equals(tIsBool, m13 is F13<bool>);
      Expect.equals(tIsInt, confuse(m13) is F13<int>);
      Expect.equals(tIsBool, confuse(m13) is F13<bool>);
    }
  }

  /// List<T> Function(int x, [Function]) Function<B extends core.int>(int x)
  void testF14() {
    Expect.isTrue(f14 is F14<int>);
    Expect.isTrue(confuse(f14) is F14<int>);
    // In checked mode, verifies the type.
    List<T> Function(int x, [Function]) Function<B extends core.int>(int x) l14;
    // The static function f14 sets `T` to `int`.
    if (tIsInt) {
      x14 = f14 as dynamic;
      l14 = f14 as dynamic;
      x14 = confuse(f14);
      l14 = confuse(f14);
    }

    Expect.isTrue(m14 is F14<T>);
    Expect.isTrue(m14 is List<T> Function(int x, [Function])
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m14) is F14<T>);
    // In checked mode, verifies the type.
    x14 = m14;
    l14 = m14;
    x14 = confuse(m14);
    l14 = confuse(m14);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x14 = (f14 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x14 = confuse(f14);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l14 = (f14 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l14 = confuse(f14);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m14 is F14<int>);
      Expect.equals(tIsBool, m14 is F14<bool>);
      Expect.equals(tIsInt, confuse(m14) is F14<int>);
      Expect.equals(tIsBool, confuse(m14) is F14<bool>);
    }
  }

  /// List<T> Function(int y, {core.List<core.int> x}) Function<B extends core.int>(int x)
  void testF15() {
    Expect.isTrue(f15 is F15<int>);
    Expect.isTrue(confuse(f15) is F15<int>);
    // In checked mode, verifies the type.
    List<T> Function(int y, {core.List<core.int> x})
        Function<B extends core.int>(int x) l15;
    // The static function f15 sets `T` to `int`.
    if (tIsInt) {
      x15 = f15 as dynamic;
      l15 = f15 as dynamic;
      x15 = confuse(f15);
      l15 = confuse(f15);
    }

    Expect.isTrue(m15 is F15<T>);
    Expect.isTrue(m15 is List<T> Function(int y, {core.List<core.int> x})
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m15) is F15<T>);
    // In checked mode, verifies the type.
    x15 = m15;
    l15 = m15;
    x15 = confuse(m15);
    l15 = confuse(m15);
    // The static function has its T always set to int.
    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>);
    if (tIsBool) {
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x15 = (f15 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        x15 = confuse(f15);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l15 = (f15 as dynamic);
      });
      Expect.throwsWhen(v.checkedImplicitDowncasts, () {
        l15 = confuse(f15);
      });
    }
    if (tIsInt || tIsBool) {
      Expect.equals(tIsInt, m15 is F15<int>);
      Expect.equals(tIsBool, m15 is F15<bool>);
      Expect.equals(tIsInt, confuse(m15) is F15<int>);
      Expect.equals(tIsBool, confuse(m15) is F15<bool>);
    }
  }

  /// Function([Function x]) Function<B extends core.int>(int x)
  void testF16() {
    Expect.isTrue(f16 is F16<int>);
    Expect.isTrue(confuse(f16) is F16<int>);
    // In checked mode, verifies the type.
    Function([Function x]) Function<B extends core.int>(int x) l16;
    // The static function f16 sets `T` to `int`.
    if (tIsInt) {
      x16 = f16 as dynamic;
      l16 = f16 as dynamic;
      x16 = confuse(f16);
      l16 = confuse(f16);
    }

    Expect.isTrue(m16 is F16<T>);
    Expect.isTrue(
        m16 is Function([Function x]) Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m16) is F16<T>);
    // In checked mode, verifies the type.
    x16 = m16;
    l16 = m16;
    x16 = confuse(m16);
    l16 = confuse(m16);
  }

  /// Function(core.List<core.int>) Function<B extends core.int>(int x)
  void testF17() {
    Expect.isTrue(f17 is F17<int>);
    Expect.isTrue(confuse(f17) is F17<int>);
    // In checked mode, verifies the type.
    Function(core.List<core.int>) Function<B extends core.int>(int x) l17;
    // The static function f17 sets `T` to `int`.
    if (tIsInt) {
      x17 = f17 as dynamic;
      l17 = f17 as dynamic;
      x17 = confuse(f17);
      l17 = confuse(f17);
    }

    Expect.isTrue(m17 is F17<T>);
    Expect.isTrue(m17 is Function(core.List<core.int>)
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m17) is F17<T>);
    // In checked mode, verifies the type.
    x17 = m17;
    l17 = m17;
    x17 = confuse(m17);
    l17 = confuse(m17);
  }

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

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

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

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

  /// int Function<A>(int x) Function<B extends core.int>(int x)
  void testF20() {
    Expect.isTrue(f20 is F20<int>);
    Expect.isTrue(confuse(f20) is F20<int>);
    // In checked mode, verifies the type.
    int Function<A>(int x) Function<B extends core.int>(int x) l20;
    // The static function f20 sets `T` to `int`.
    if (tIsInt) {
      x20 = f20 as dynamic;
      l20 = f20 as dynamic;
      x20 = confuse(f20);
      l20 = confuse(f20);
    }

    Expect.isTrue(m20 is F20<T>);
    Expect.isTrue(
        m20 is int Function<A>(int x) Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m20) is F20<T>);
    // In checked mode, verifies the type.
    x20 = m20;
    l20 = m20;
    x20 = confuse(m20);
    l20 = confuse(m20);
  }

  /// core.List<core.int> Function<A>(Function x) Function<B extends core.int>(int x)
  void testF21() {
    Expect.isTrue(f21 is F21<int>);
    Expect.isTrue(confuse(f21) is F21<int>);
    // In checked mode, verifies the type.
    core.List<core.int> Function<A>(Function x) Function<B extends core.int>(
        int x) l21;
    // The static function f21 sets `T` to `int`.
    if (tIsInt) {
      x21 = f21 as dynamic;
      l21 = f21 as dynamic;
      x21 = confuse(f21);
      l21 = confuse(f21);
    }

    Expect.isTrue(m21 is F21<T>);
    Expect.isTrue(m21 is core.List<core.int> Function<A>(Function x)
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m21) is F21<T>);
    // In checked mode, verifies the type.
    x21 = m21;
    l21 = m21;
    x21 = confuse(m21);
    l21 = confuse(m21);
  }

  /// A Function<A>(List<Function> x) Function<B extends core.int>(int x)
  void testF22() {
    Expect.isTrue(f22 is F22<int>);
    Expect.isTrue(confuse(f22) is F22<int>);
    // In checked mode, verifies the type.
    A Function<A>(List<Function> x) Function<B extends core.int>(int x) l22;
    // The static function f22 sets `T` to `int`.
    if (tIsInt) {
      x22 = f22 as dynamic;
      l22 = f22 as dynamic;
      x22 = confuse(f22);
      l22 = confuse(f22);
    }

    Expect.isTrue(m22 is F22<T>);
    Expect.isTrue(m22 is A Function<A>(List<Function> x)
        Function<B extends core.int>(int x));
    Expect.isTrue(confuse(m22) is F22<T>);
    // In checked mode, verifies the type.
    x22 = m22;
    l22 = m22;
    x22 = confuse(m22);
    l22 = confuse(m22);
  }

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

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

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