blob: ba3842d3c3f38a54cc600afb5fc63cfad0167779 [file] [log] [blame]
// 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.
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();
}