// Copyright (c) 2020, 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 type parameter of the generic function type
/// alias is treated as [Object?] statically. Typedef is in the form:
///    [typedef <type> <identifier> <formalParameterPart>].
///
/// @Issue 40367, 40368
/// @author iarkh@unipro.ru

 // Requirements=nnbd-weak

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

typedef T    Function1<T>( );
typedef void Function2<T>(T);
typedef T    Function3<T>(T);
typedef void Function4<T>( );

typedef T1 Function5<T1, T2, T3>(T2, T3);

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

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

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

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

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

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