// Copyright (c) 2021, 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.

void Function<T>() unboundedUnused = <T>() {};

void Function<T>(T) unboundedArg = <T>(T t) {};

T Function<T>() unboundedReturn = <T>() => throw '';

T Function<T>(T) unboundedReturnArg = <T>(T t) => t;

void Function<T extends num>() extendsNumUnused = <T extends num>() {};

void Function<T extends num>(T) extendsNumArg = <T extends num>(T t) {};

T Function<T extends num>() extendsNumReturn = <T extends num>() => throw '';

T Function<T extends num>(T) extendsNumReturnArg = <T extends num>(T t) => t;

void Function<T, U, S>(T, S, U) multipleArgs = (T t, S s, U u) {};

functionInvocations() {
  unboundedUnused /*<dynamic>*/ ();
  unboundedUnused<int>();

  unboundedArg /*<Null>*/ (null);
  unboundedArg /*<int>*/ (0);
  unboundedArg /*<String>*/ ("");
  unboundedArg<num>(0);

  unboundedReturn /*<dynamic>*/ ();
  unboundedReturn<int>();
  var unboundedReturn1 = unboundedReturn /*<dynamic>*/ ();
  int unboundedReturn2 = unboundedReturn /*<int>*/ ();
  num unboundedReturn3 = unboundedReturn<int>();

  unboundedReturnArg /*<Null>*/ (null);
  unboundedReturnArg /*<int>*/ (0);
  unboundedReturnArg /*<String>*/ ("");
  unboundedReturnArg<num>(0);
  var unboundedReturnArg1 = unboundedReturnArg /*<int>*/ (0);
  var unboundedReturnArg2 = unboundedReturnArg /*<String>*/ ("");
  num unboundedReturnArg3 = unboundedReturnArg /*<num>*/ (0);
  int unboundedReturnArg4 = unboundedReturnArg /*<int>*/ (0);
  int unboundedReturnArg5 = unboundedReturnArg /*<int>*/ (0.5);
  int unboundedReturnArg6 = unboundedReturnArg /*<int>*/ ("");
  int unboundedReturnArg7 = unboundedReturnArg<num>(0);

  extendsNumUnused /*<num>*/ ();
  extendsNumUnused<int>();

  // TODO(45660): extendsNumArg<Null>(null);
  extendsNumArg /*<int>*/ (0);
  // TODO(45660): extendsNumArg<String>("");
  extendsNumArg<num>(0);

  extendsNumReturn /*<num>*/ ();
  extendsNumReturn<int>();
  var extendsNumReturn1 = extendsNumReturn /*<num>*/ ();
  int extendsNumReturn2 = extendsNumReturn /*<int>*/ ();
  num extendsNumReturn3 = extendsNumReturn<int>();

  // TODO(45660): extendsNumReturnArg(null);
  extendsNumReturnArg /*<int>*/ (0);
  // TODO(45660): extendsNumReturnArg("");
  extendsNumReturnArg<num>(0);
  var extendsNumReturnArg1 = extendsNumReturnArg /*<int>*/ (0);
  // TODO(45660): var extendsNumReturnArg2 = extendsNumReturnArg("");
  num extendsNumReturnArg3 = extendsNumReturnArg /*<num>*/ (0);
  int extendsNumReturnArg4 = extendsNumReturnArg /*<int>*/ (0);
  int extendsNumReturnArg5 = extendsNumReturnArg /*<int>*/ (0.5);
  int extendsNumReturnArg6 = extendsNumReturnArg /*<int>*/ ("");
  int extendsNumReturnArg7 = extendsNumReturnArg<num>(0);

  multipleArgs /*<dynamic,dynamic,dynamic>*/ ();
  multipleArgs /*<int,String,bool>*/ (0, true, "");
  multipleArgs<int, bool, String>(0, true, "");
}
