From 1ed7581898498d6a4baf2c4fb8c4ad1391bd08d5 Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Tue, 7 Jul 2020 08:55:09 +0000 Subject: [PATCH] [cfe] Add test for issue 42540 Closes #42540 Change-Id: I8ea8f03a2682a5b52867787144a2d81c7527ca11 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153340 Reviewed-by: Dmitry Stefantsov Commit-Queue: Johnni Winther --- pkg/front_end/testcases/nnbd/issue42540.dart | 12 ++++++ .../nnbd/issue42540.dart.outline.expect | 11 ++++++ .../nnbd/issue42540.dart.strong.expect | 12 ++++++ .../issue42540.dart.strong.transformed.expect | 39 +++++++++++++++++++ .../issue42540.dart.textual_outline.expect | 3 ++ ...42540.dart.textual_outline_modelled.expect | 3 ++ .../nnbd/issue42540.dart.weak.expect | 12 ++++++ .../issue42540.dart.weak.transformed.expect | 39 +++++++++++++++++++ 8 files changed, 131 insertions(+) create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.outline.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.strong.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline_modelled.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.weak.expect create mode 100644 pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart b/pkg/front_end/testcases/nnbd/issue42540.dart new file mode 100644 index 000000000000..92a2d7634095 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart @@ -0,0 +1,12 @@ +// 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. + +dynamic getNull() => null; + +Future fn() async { + Object o = await getNull(); + return await getNull(); +} + +main() {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.outline.expect new file mode 100644 index 000000000000..1e9688d70826 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.outline.expect @@ -0,0 +1,11 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:async" as asy; +import "dart:core" as core; + +static method getNull() → dynamic + ; +static method fn() → asy::Future + ; +static method main() → dynamic + ; diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.expect new file mode 100644 index 000000000000..aaf931d32d1d --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:async" as asy; +import "dart:core" as core; + +static method getNull() → dynamic + return null; +static method fn() → asy::Future async { + core::Object o = await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object; + return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr; +} +static method main() → dynamic {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect new file mode 100644 index 000000000000..5fbd65637489 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect @@ -0,0 +1,39 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:async" as asy; +import "dart:core" as core; + +static method getNull() → dynamic + return null; +static method fn() → asy::Future /* originally async */ { + final asy::_AsyncAwaitCompleter :async_completer = new asy::_AsyncAwaitCompleter::•(); + FutureOr? :return_value; + dynamic :async_stack_trace; + (dynamic) → dynamic :async_op_then; + (core::Object, core::StackTrace) → dynamic :async_op_error; + core::int :await_jump_var = 0; + dynamic :await_ctx_var; + dynamic :saved_try_context_var0; + function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding + try { + #L1: + { + [yield] let dynamic #t1 = asy::_awaitHelper(self::getNull(), :async_op_then, :async_op_error, :async_op) in null; + core::Object o = let dynamic #t2 = :result in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object : #t2{core::Object}; + [yield] let dynamic #t3 = asy::_awaitHelper(self::getNull(), :async_op_then, :async_op_error, :async_op) in null; + :return_value = let dynamic #t4 = :result in #t4.==(null) ?{FutureOr} #t4 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr : #t4{FutureOr}; + break #L1; + } + asy::_completeOnAsyncReturn(:async_completer, :return_value); + return; + } + on dynamic catch(dynamic exception, core::StackTrace stack_trace) { + :async_completer.{asy::Completer::completeError}(exception, stack_trace); + } + :async_stack_trace = asy::_asyncStackTraceHelper(:async_op); + :async_op_then = asy::_asyncThenWrapperHelper(:async_op); + :async_op_error = asy::_asyncErrorWrapperHelper(:async_op); + :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op); + return :async_completer.{asy::Completer::future}; +} +static method main() → dynamic {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline.expect new file mode 100644 index 000000000000..326ff563dc0b --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline.expect @@ -0,0 +1,3 @@ +dynamic getNull() => null; +Future fn() async {} +main() {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline_modelled.expect new file mode 100644 index 000000000000..a6184d92f893 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +Future fn() async {} +dynamic getNull() => null; +main() {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.expect new file mode 100644 index 000000000000..aaf931d32d1d --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.expect @@ -0,0 +1,12 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:async" as asy; +import "dart:core" as core; + +static method getNull() → dynamic + return null; +static method fn() → asy::Future async { + core::Object o = await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object; + return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr; +} +static method main() → dynamic {} diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect new file mode 100644 index 000000000000..ae9a451c8641 --- /dev/null +++ b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect @@ -0,0 +1,39 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:async" as asy; +import "dart:core" as core; + +static method getNull() → dynamic + return null; +static method fn() → asy::Future /* originally async */ { + final asy::_AsyncAwaitCompleter :async_completer = new asy::_AsyncAwaitCompleter::•(); + FutureOr? :return_value; + dynamic :async_stack_trace; + (dynamic) → dynamic :async_op_then; + (core::Object, core::StackTrace) → dynamic :async_op_error; + core::int :await_jump_var = 0; + dynamic :await_ctx_var; + dynamic :saved_try_context_var0; + function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding + try { + #L1: + { + [yield] let dynamic #t1 = asy::_awaitHelper(self::getNull(), :async_op_then, :async_op_error, :async_op) in null; + core::Object o = :result; + [yield] let dynamic #t2 = asy::_awaitHelper(self::getNull(), :async_op_then, :async_op_error, :async_op) in null; + :return_value = :result; + break #L1; + } + asy::_completeOnAsyncReturn(:async_completer, :return_value); + return; + } + on dynamic catch(dynamic exception, core::StackTrace stack_trace) { + :async_completer.{asy::Completer::completeError}(exception, stack_trace); + } + :async_stack_trace = asy::_asyncStackTraceHelper(:async_op); + :async_op_then = asy::_asyncThenWrapperHelper(:async_op); + :async_op_error = asy::_asyncErrorWrapperHelper(:async_op); + :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op); + return :async_completer.{asy::Completer::future}; +} +static method main() → dynamic {}