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

// @dart = 2.9

import 'dart:async';

void vv = null;
dynamic vd = null;
Object vo = null;
Null vn = null;
int vi = null;
Future<void> fvv = null;
Future<dynamic> fvd = null;
Future<Object> fvo = null;
Future<Null> fvn = null;
Future<int> fvi = null;
FutureOr<void> fovv = null;
FutureOr<dynamic> fovd = null;
FutureOr<Object> fovo = null;
FutureOr<Null> fovn = null;
FutureOr<int> fovi = null;

/* Test the cases where expression bodied functions are more permissive
 * than block bodied functions (places where they behave the same
 * are tested below).

A synchronous expression bodied function with return type `T` and return expression
`e` has a valid return if:
  * `T` is `void`
  * or `return exp;` is a valid return for an equivalent block bodied function
  with return type `T` as defined below.
*/
void sync_int_to_void_e() => vi;
void sync_Object_to_void_e() => vo;
void sync_Future_int__to_void_e() => fvi;
void sync_FutureOr_int__to_void_e() => fovi;
void sync_Future_Object__to_void_e() => fvo;
void sync_FutureOr_Object__to_void_e() => fovo;

/* Test the cases that apply only to block bodied  functions
 */

/*
* `return;` is a valid return if any of the following are true:
  * `T` is `void`
  * `T` is `dynamic`
  * `T` is `Null`.
*/
void sync_empty_to_void() {
  return;
}

dynamic sync_empty_to_dynamic() {
  return;
}

Null sync_empty_to_Null() {
  return;
}

/* Test the cases that apply to both expression bodied and block bodied
 * functions
 */

/*
* `return exp;` where `exp` has static type `S` is a valid return if:
  * `S` is `void`
  * and `T` is `void` or `dynamic` or `Null`
*/
void sync_void_to_void_e() => vv;
void sync_void_to_void() {
  return vv;
}

dynamic sync_void_to_dynamic_e() => vv;
dynamic sync_void_to_dynamic() {
  return vv;
}

Null sync_void_to_Null_e() => vv;
Null sync_void_to_Null() {
  return vv;
}

/*
* `return exp;` where `exp` has static type `S` is a valid return if:
  * `T` is `void`
  * and `S` is `void` or `dynamic` or `Null`

*/
void sync_dynamic_to_void_e() => vd;
void sync_dynamic_to_void() {
  return vd;
}

void sync_Null_to_void_e() => vn;
void sync_Null_to_void() {
  return vn;
}

/*
* `return exp;` where `exp` has static type `S` is a valid return if:
  * `T` is not `void`
  * and `S` is not `void`
  * and `S` is assignable to `T`
*/
int sync_int_to_int_e() => vi;
int sync_int_to_int() {
  return vi;
}

int sync_Object_to_int_e() => vo;
int sync_Object_to_int() {
  return vo;
}

int sync_FutureOr_int__to_int_e() => fovi;
int sync_FutureOr_int__to_int() {
  return fovi;
}

void main() {
  sync_int_to_void_e();
  sync_Object_to_void_e();
  sync_Future_int__to_void_e();
  sync_FutureOr_int__to_void_e();
  sync_Future_Object__to_void_e();
  sync_FutureOr_Object__to_void_e();
  sync_empty_to_void();
  sync_empty_to_dynamic();
  sync_empty_to_Null();
  sync_void_to_void_e();
  sync_void_to_void();
  sync_void_to_dynamic_e();
  sync_void_to_dynamic();
  sync_void_to_Null_e();
  sync_void_to_Null();
  sync_dynamic_to_void_e();
  sync_dynamic_to_void();
  sync_Null_to_void_e();
  sync_Null_to_void();
  sync_int_to_int_e();
  sync_int_to_int();
  sync_Object_to_int_e();
  sync_Object_to_int();
  sync_FutureOr_int__to_int_e();
  sync_FutureOr_int__to_int();
}
