/*
 * Copyright (c) 2019, 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.
 */
/**
 * @assertion The default bound of generic type parameters is treated as
 * [Object?].
 *
 * @description Check that default generic function typedef type parameter is
 * treated as [Object?] statically.
 * Typedef is in the form:
 *    [typedef <typeIdentifier> <typeParameters> = <functionType>].
 *
 * @Issue 40367, 40368
 * @author iarkh@unipro.ru
 */
// Requirements=nnbd-strong

import "../../Utils/expect.dart";

typedef G1<T> = T Function();
typedef G2<T> = void Function(T);
typedef G3<T> = T Function<T1 extends T>();
typedef G4<T1, T2, T3> = T1 Function(T2, T3);

typedef G5<T> = void Function();
typedef G6<T1, T2, T3> = void Function();

F<G1<Object?>>? test1(G1 source) {
  var fsource = toF(source);
  return fsource;
}

F<G2<Object?>>? test2(G2 source) {
  var fsource = toF(source);
  return fsource;
}

F<G4<Object?, Object?, Object?>>? test3(G4 source) {
  var fsource = toF(source);
  return fsource;
}

F<G5<Object?>>? test4(G5 source) {
  var fsource = toF(source);
  return fsource;
}

F<G6<Object?, Object?, Object?> >? test5(G6 source) {
  var fsource = toF(source);
  return fsource;
}

void main() {
  print(test1);
  print(test2);
  print(test3);
  print(test4);
  print(test5);
}
