[vm/kernel] In async transformation check if strongMode is on.

It seems we are still using non-strong mode targets in few
places (e.g. when training front-end server we by accident
train it in legacy mode).

A separate bug is filed to clean that up https://github.com/dart-lang/sdk/issues/34468

For now to unbreak the build we simply check if we are in the
legacy mode and then avoid using getStaticType in async
transformation.

This is followup to eec96f9076c552112ccb0b8ff3f8aa36523e9377.

Bug: https://github.com/dart-lang/sdk/issues/34463
Change-Id: Ib693fddfb9abbf89599ae646cb408d4a9c93f1b6
Reviewed-on: https://dart-review.googlesource.com/75061
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
index 6638f7c..d09ecec 100644
--- a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "dart:_internal" as _in;
 
 static field core::List<core::String> stringList = <dynamic>["bar"];
 static method asyncString() → asy::Future<core::String> /* originally async */ {
@@ -119,7 +118,7 @@
           else
             [yield] null;
           [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(_in::unsafeCast<core::String>(:result)))
+          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
             return null;
           else
             [yield] null;
@@ -188,7 +187,7 @@
       #L5:
       {
         [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String str = _in::unsafeCast<core::String>(:result);
+        core::String str = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
index 1d8ba8f..da3a56f 100644
--- a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class Node extends core::Object {
   final field core::List<self::Node> nested;
@@ -44,7 +43,7 @@
         [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = :result;
         [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node node = new self::Node::•("1", <dynamic>[_in::unsafeCast<self::Node>(:async_temporary_2), :async_temporary_0, :result]);
+        self::Node node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
         core::String actual = node.toSimpleString();
         core::print(actual);
         if(!actual.==(expected)) {
diff --git a/pkg/front_end/testcases/await.dart.direct.transformed.expect b/pkg/front_end/testcases/await.dart.direct.transformed.expect
index 655215a..7693f8c 100644
--- a/pkg/front_end/testcases/await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/await.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "dart:_internal" as _in;
 
 static method main() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
@@ -18,7 +17,7 @@
       #L1:
       {
         [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
-        core::print(_in::unsafeCast<core::String>(:result));
+        core::print(:result);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
index b27bff7..b5f9c88 100644
--- a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class X extends core::Object {
   final field dynamic x;
@@ -90,10 +89,10 @@
       {
         final dynamic #t1 = new self::Y::•();
         [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final dynamic #t3 = #t1.f(_in::unsafeCast<core::List<core::Object>>(:result));
+        final dynamic #t3 = #t1.f(:result);
         final dynamic #t4 = #t1.f(self::f2());
         [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, _in::unsafeCast<core::Object>(:result));
+        :return_value = new self::X::•(#t1, :result);
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -122,7 +121,7 @@
       #L4:
       {
         [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
-        core::print(_in::unsafeCast<self::X>(:result));
+        core::print(:result);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
index a358731..d797b5d 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 abstract class MyFuture extends core::Object implements asy::Future<core::int> {
   synthetic constructor •() → void
@@ -303,25 +302,25 @@
           return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y0 = _in::unsafeCast<core::int>(:result);
+        dynamic y0 = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(x1, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y1 = _in::unsafeCast<core::int>(:result);
+        dynamic y1 = :result;
         [yield] let dynamic #t3 = asy::_awaitHelper(x2, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y2 = _in::unsafeCast<asy::Future<core::int>>(:result);
+        dynamic y2 = :result;
         [yield] let dynamic #t4 = asy::_awaitHelper(x3, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y3 = _in::unsafeCast<asy::FutureOr<core::int>>(:result);
+        dynamic y3 = :result;
         [yield] let dynamic #t5 = asy::_awaitHelper(x4, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y4 = _in::unsafeCast<self::MyFuture>(:result);
+        dynamic y4 = :result;
         [yield] let dynamic #t6 = asy::_awaitHelper(x5, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y5 = _in::unsafeCast<core::int>(:result);
+        dynamic y5 = :result;
         [yield] let dynamic #t7 = asy::_awaitHelper(x6, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y6 = _in::unsafeCast<asy::Future<core::int>>(:result);
+        dynamic y6 = :result;
         [yield] let dynamic #t8 = asy::_awaitHelper(x7, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y7 = _in::unsafeCast<asy::FutureOr<core::int>>(:result);
+        dynamic y7 = :result;
         [yield] let dynamic #t9 = asy::_awaitHelper(x8, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y8 = _in::unsafeCast<self::MyFuture>(:result);
+        dynamic y8 = :result;
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y9 = _in::unsafeCast<core::int>(:result);
+        dynamic y9 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
index 8e76657..af02e87 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "dart:_internal" as _in;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
   final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
@@ -19,7 +18,7 @@
       {
         dynamic d;
         [yield] let dynamic #t1 = asy::_awaitHelper(<dynamic>[d], :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l0 = _in::unsafeCast<core::List<dynamic>>(:result);
+        core::List<core::int> l0 = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int> l1 = :result;
       }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
index 8bbd33f..c6a2b38 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
   static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
@@ -50,7 +49,7 @@
             while (true) {
               dynamic #t3 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -73,7 +72,7 @@
             while (true) {
               dynamic #t6 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -96,7 +95,7 @@
             while (true) {
               dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 core::Object x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -119,7 +118,7 @@
             while (true) {
               dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   d = #t14;
@@ -144,7 +143,7 @@
             while (true) {
               dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   o = #t18;
@@ -204,7 +203,7 @@
             while (true) {
               dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 core::int x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -227,7 +226,7 @@
             while (true) {
               dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
index 8ac230e..46d4a06 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
@@ -33,7 +32,7 @@
             while (true) {
               dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -60,7 +59,7 @@
             while (true) {
               dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   y = #t7;
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index 6159047..f27ed38 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index d395a35..20ee8d1 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index 9131ddc..c6d3766 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index 9fc9fc2..8f4e8ca 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index c6b8288..a617678 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 8a90334..925090f 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
   constructor •() → void
@@ -38,7 +37,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -67,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = _in::unsafeCast<core::int>(:result);
+          :return_value = :result;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
index 4461a83..89b8af9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class A extends core::Object {
   synthetic constructor •() → void
@@ -25,7 +24,7 @@
         asy::Future<core::List<self::A>> f1 = null;
         asy::Future<core::List<self::A>> f2 = null;
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::List<self::A>> merged = _in::unsafeCast<core::List<dynamic>>(:result);
+        core::List<core::List<self::A>> merged = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
index ebe93d9..7bc149c 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class A extends core::Object {
   synthetic constructor •() → void
@@ -36,9 +35,9 @@
         dynamic c = asy::Future::value<self::C>(new self::C::•());
         dynamic lll = <dynamic>[b, c];
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(lll), :async_op_then, :async_op_error, :async_op) in null;
-        dynamic result = _in::unsafeCast<core::List<dynamic>>(:result);
+        dynamic result = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
-        dynamic result2 = _in::unsafeCast<core::List<dynamic>>(:result);
+        dynamic result2 = :result;
         core::List<self::A> list = result;
         list = result2;
       }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index dfe5531..8c8c294 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class Foo extends core::Object {
   field core::int bar = 42;
@@ -40,7 +39,7 @@
               while (true) {
                 dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-                if(_in::unsafeCast<core::bool>(:result)) {
+                if(:result) {
                   dynamic i = :for-iterator.{asy::_StreamIterator::current};
                   {
                     core::int x = i;
@@ -99,7 +98,7 @@
               while (true) {
                 dynamic #t4 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-                if(_in::unsafeCast<core::bool>(:result)) {
+                if(:result) {
                   dynamic i = :for-iterator.{asy::_StreamIterator::current};
                   {
                     core::int x = i;
@@ -160,7 +159,7 @@
             while (true) {
               dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   core::String y = x;
@@ -185,7 +184,7 @@
             while (true) {
               dynamic #t10 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   core::String y = x;
@@ -210,7 +209,7 @@
             while (true) {
               dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 core::String x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   core::String y = x;
@@ -236,7 +235,7 @@
             while (true) {
               dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   z = #t18;
@@ -263,7 +262,7 @@
             while (true) {
               dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 self::Foo x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   dynamic y = x;
@@ -289,7 +288,7 @@
             while (true) {
               dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 self::Foo x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   dynamic y = x;
@@ -315,7 +314,7 @@
             while (true) {
               dynamic #t26 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t27 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   core::String y = x;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
index 547f641..3eefc91 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
   final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
@@ -33,7 +32,7 @@
             while (true) {
               dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 core::int x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
@@ -60,7 +59,7 @@
             while (true) {
               dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   y = #t7;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index c914a79..1c7200b 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
-import "dart:_internal" as _in;
 
 class A extends core::Object {
   synthetic constructor •() → void
@@ -50,7 +49,7 @@
             while (true) {
               dynamic #t2 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final self::A #t4 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   a = #t4;
@@ -78,7 +77,7 @@
             while (true) {
               dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final self::A #t9 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   b = #t9;
@@ -106,7 +105,7 @@
             while (true) {
               dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final self::A #t14 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   i = #t14;
@@ -134,7 +133,7 @@
             while (true) {
               dynamic #t17 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t18 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool>(:result)) {
+              if(:result) {
                 final dynamic #t19 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   a = #t19;
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index e3db3b5..d04dda3 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -86,8 +86,8 @@
   final hierarchy = new ClassHierarchy(component);
   switch (options['transformation']) {
     case 'continuation':
-      component =
-          cont.transformComponent(coreTypes, hierarchy, component, syncAsync);
+      component = cont.transformComponent(
+          coreTypes, hierarchy, component, syncAsync, true);
       break;
     case 'resolve-mixins':
       mix.transformLibraries(
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 4050e07..0d29e7e 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -115,7 +115,12 @@
   // expression [to] would have the same static type by wrapping it into
   // an appropriate unsafeCast.
   Expression assignType(Expression to, Expression from) {
-    final fromType = from.getStaticType(continuationRewriter.helper.env);
+    final env = continuationRewriter.helper.env;
+    if (!env.strongMode) {
+      return to;
+    }
+
+    final fromType = from.getStaticType(env);
     if (fromType == null || fromType == const DynamicType()) {
       return to;
     }
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index fd06825..56c03a9 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -26,8 +26,8 @@
 }
 
 void transformLibraries(CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<Library> libraries, bool syncAsync) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy);
+    List<Library> libraries, bool syncAsync, bool strongMode) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy, strongMode);
   var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
   for (var library in libraries) {
     rewriter.rewriteLibrary(library);
@@ -35,15 +35,15 @@
 }
 
 Component transformComponent(CoreTypes coreTypes, ClassHierarchy hierarchy,
-    Component component, bool syncAsync) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy);
+    Component component, bool syncAsync, bool strongMode) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy, strongMode);
   var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
   return rewriter.rewriteComponent(component);
 }
 
 Procedure transformProcedure(CoreTypes coreTypes, ClassHierarchy hierarchy,
-    Procedure procedure, bool syncAsync) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy);
+    Procedure procedure, bool syncAsync, bool strongMode) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, hierarchy, strongMode);
   var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
   return rewriter.visitProcedure(procedure);
 }
@@ -1249,7 +1249,7 @@
       this.env);
 
   factory HelperNodes.fromCoreTypes(
-      CoreTypes coreTypes, ClassHierarchy hierarchy) {
+      CoreTypes coreTypes, ClassHierarchy hierarchy, bool strongMode) {
     return new HelperNodes._(
         coreTypes.asyncErrorWrapperHelperProcedure,
         coreTypes.asyncLibrary,
@@ -1294,6 +1294,6 @@
         coreTypes.boolClass,
         coreTypes.boolFromEnvironment,
         coreTypes.unsafeCast,
-        new TypeEnvironment(coreTypes, hierarchy, strongMode: true));
+        new TypeEnvironment(coreTypes, hierarchy, strongMode: strongMode));
   }
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index f67260e..71b799a 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -67,7 +67,7 @@
 
     // TODO(kmillikin): Make this run on a per-method basis.
     transformAsync.transformLibraries(
-        coreTypes, hierarchy, libraries, flags.syncAsync);
+        coreTypes, hierarchy, libraries, flags.syncAsync, strongMode);
     logger?.call("Transformed async methods");
 
     callSiteAnnotator.transformLibraries(
@@ -80,7 +80,7 @@
       CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
       {void logger(String msg)}) {
     transformAsync.transformProcedure(
-        coreTypes, hierarchy, procedure, flags.syncAsync);
+        coreTypes, hierarchy, procedure, flags.syncAsync, strongMode);
     logger?.call("Transformed async functions");
   }