// 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.

/// @assertion At this location about an asynchronous non-generator function with
/// future value type $T_v$, the text is changed as follows:
///
///  It is a compile-time error if $s$ is \code{\RETURN{};},
///  unless $T_v$
///  is \VOID, \DYNAMIC, or \code{Null}.
///  %
///  It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
///  $T_v$ is \VOID,
///  and \flatten{S} is neither \VOID, \DYNAMIC, \code{Null}.
///  %
///  It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
///  $T_v$ is neither \VOID{} nor \DYNAMIC,
///  and \flatten{S} is \VOID.
///  %
///  It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
///  \flatten{S} is not \VOID,
///  $S$ is not assignable to $T_v$,
///  and flatten{S} is not a subtype of $T_v$.
///  Comparing to Dart before null-safety, this means that it is no longer
///  allowed to return an expression whose flattened static type is void in an
///  async function with future value type Null; nor is it allowed, in an async
///  function with future value type void, to return an expression whose
///  flattened static type is not void, void*, dynamic, or Null. Conversely, it
///  is allowed to return a future when the future value type is a suitable
///  future; for instance, we can have return Future<int>.value(42) in an async
///  function with declared return type Future<Future<int>>. Finally, let S be
///  Future<dynamic> or FutureOr<dynamic>; it is then no longer allowed to return
///  an expression with static type S, unless the future value type is a
///  supertype of S. This differs from Dart before null-safety in that it was
///  allowed to return an expression of these types with a declared return type
///  of the form Future<T> for any T.
///
/// @description Check that it is a compile-time error to return an expression
/// whose flattened static type is void in an async function with future value
/// type Null
/// @author sgrekhov@unipro.ru

Future<void> g1() async {}
void g2() async {}

Future<Null> foo1() async {
  return g1();
//       ^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

Future<Null> foo2() async {
  return g2();
//       ^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

Future<Null> foo3() async => g1();
//                           ^^^^
// [analyzer] unspecified
// [cfe] unspecified
Future<Null> foo4() async => g2();
//                           ^^^^
// [analyzer] unspecified
// [cfe] unspecified

main() {
  foo1();
  foo2();
  foo3();
  foo4();
}
