dart-sdk/tests/language/await_type_error_test.dart
Lasse R.H. Nielsen 36a6b1b5ce Analyzer: Don't do recursive flattening of FutureOr in await.
The current behavior (removing all outer `FutureOr`s,
then calling *flatten* on the result) was never specified as correct behavior.

Since Dart 2.0, the await has not recursively flattened futures,
so the static analysis behavior did not match run-time behavior.


Change-Id: Ie1da323aedb4b0f51e2c1e3eebe84552576c5f37
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121846
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
2020-01-28 11:16:07 +00:00

55 lines
1.4 KiB
Dart

// 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.
import "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
main() async {
int i = 1;
Future<int> fi = Future<int>.value(i);
Future<Future<int>> ffi = Future<Future<int>>.value(fi);
Future<Future<Future<int>>> fffi = Future<Future<Future<int>>>.value(ffi);
String v1 = await i;
// ^
// [analyzer] unspecified
// [cfe] unspecified
String v2 = await fi;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
int v3 = await ffi;
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
Future<int> v4 = await fffi;
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
Future<int> v5 = await i;
// ^
// [analyzer] unspecified
// [cfe] unspecified
Future<int> v6 = await fi;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
Future<FutureOr<int>> v7 = await fi;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
Future<Future<int>> v8 = await ffi;
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
}