[vm/cfe] Elaborate for-in statements during async transform

This allows us TFA to analyze the iterator calls and we generate much tighter
code in AOT.

However, due to the increased inlining opportunities, we end up emitting 0.5%
more code. Inlining of the _GrowableList iterator specifically also includes the
concurrent modification check and error handling.

Calls to get:iterator, moveNext and get:current account for 7.12% of all InstanceCall
instructions in Flutter Gallery.

Fixes https://github.com/dart-lang/sdk/issues/39516
Issue https://github.com/dart-lang/sdk/issues/39566
Issue https://github.com/dart-lang/sdk/issues/39565

Change-Id: I8dcc08b7571137e869a16ceea8cc73539eb02a5a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/126381
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
diff --git a/DEPS b/DEPS
index 340260b..6b7e8af 100644
--- a/DEPS
+++ b/DEPS
@@ -476,7 +476,7 @@
     "packages": [
       {
         "package": "dart/cfe/dart2js_dills",
-        "version": "binary_version:29_36",
+        "version": "binary_version:29_37",
       }
     ],
     "dep_type": "cipd",
diff --git a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
index afff0fe..b6697d5 100644
--- a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
@@ -343,44 +343,50 @@
     try {
       #L6:
       {
-        for (final core::Function* #t26 in <core::Function*>[#C1, #C2]) {
-          final <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>* func = #t26 as{TypeError} <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>*;
-          assert {
-            [yield] let dynamic #t27 = asy::_awaitHelper(func.call<core::bool*>(true), :async_op_then, :async_op_error, :async_op) in null;
-            assert(_in::unsafeCast<core::bool*>(:result));
-          }
-          assert {
-            if(self::id<core::bool*>(true) as{TypeError} core::bool*)
-              ;
-            else {
-              [yield] let dynamic #t28 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
-              assert(false, _in::unsafeCast<core::String*>(:result));
-            }
-          }
-          assert {
-            [yield] let dynamic #t29 = asy::_awaitHelper(func.call<core::bool*>(true), :async_op_then, :async_op_error, :async_op) in null;
-            if(_in::unsafeCast<core::bool*>(:result))
-              ;
-            else {
-              [yield] let dynamic #t30 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
-              assert(false, _in::unsafeCast<core::String*>(:result));
-            }
-          }
-          try {
-            assert {
-              [yield] let dynamic #t31 = asy::_awaitHelper(func.call<core::bool*>(false), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool*>(:result))
-                ;
-              else {
-                [yield] let dynamic #t32 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
-                assert(false, _in::unsafeCast<core::String*>(:result));
+        {
+          core::Iterator<core::Function*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::Function*>*>(<core::Function*>[#C1, #C2]).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final core::Function* #t26 = :sync-for-iterator.{core::Iterator::current};
+            {
+              final <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>* func = #t26 as{TypeError} <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>*;
+              assert {
+                [yield] let dynamic #t27 = asy::_awaitHelper(func.call<core::bool*>(true), :async_op_then, :async_op_error, :async_op) in null;
+                assert(_in::unsafeCast<core::bool*>(:result));
+              }
+              assert {
+                if(self::id<core::bool*>(true) as{TypeError} core::bool*)
+                  ;
+                else {
+                  [yield] let dynamic #t28 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
+                  assert(false, _in::unsafeCast<core::String*>(:result));
+                }
+              }
+              assert {
+                [yield] let dynamic #t29 = asy::_awaitHelper(func.call<core::bool*>(true), :async_op_then, :async_op_error, :async_op) in null;
+                if(_in::unsafeCast<core::bool*>(:result))
+                  ;
+                else {
+                  [yield] let dynamic #t30 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
+                  assert(false, _in::unsafeCast<core::String*>(:result));
+                }
+              }
+              try {
+                assert {
+                  [yield] let dynamic #t31 = asy::_awaitHelper(func.call<core::bool*>(false), :async_op_then, :async_op_error, :async_op) in null;
+                  if(_in::unsafeCast<core::bool*>(:result))
+                    ;
+                  else {
+                    [yield] let dynamic #t32 = asy::_awaitHelper(func.call<core::String*>("message"), :async_op_then, :async_op_error, :async_op) in null;
+                    assert(false, _in::unsafeCast<core::String*>(:result));
+                  }
+                }
+                if(self::assertStatementsEnabled)
+                  throw "Didn't throw";
+              }
+              on core::AssertionError* catch(final core::AssertionError* e) {
+                self::expect("message", e.{core::AssertionError::message});
               }
             }
-            if(self::assertStatementsEnabled)
-              throw "Didn't throw";
-          }
-          on core::AssertionError* catch(final core::AssertionError* e) {
-            self::expect("message", e.{core::AssertionError::message});
           }
         }
       }
@@ -416,251 +422,257 @@
     try {
       #L7:
       {
-        for (final core::Function* #t33 in <core::Function*>[#C1, #C2]) {
-          final <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>* func = #t33 as{TypeError} <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>*;
-          core::int* c = 0;
-          {
-            dynamic #t34 = true;
-            core::int* #t35;
-            #L8:
-            while (true) {
-              core::int* i;
-              if(#t34) {
-                #t34 = false;
-                [yield] let dynamic #t36 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
-                i = _in::unsafeCast<core::int*>(:result);
+        {
+          core::Iterator<core::Function*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::Function*>*>(<core::Function*>[#C1, #C2]).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final core::Function* #t33 = :sync-for-iterator.{core::Iterator::current};
+            {
+              final <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>* func = #t33 as{TypeError} <T extends core::Object* = dynamic>(T*) →* asy::FutureOr<T*>*;
+              core::int* c = 0;
+              {
+                dynamic #t34 = true;
+                core::int* #t35;
+                #L8:
+                while (true) {
+                  core::int* i;
+                  if(#t34) {
+                    #t34 = false;
+                    [yield] let dynamic #t36 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
+                    i = _in::unsafeCast<core::int*>(:result);
+                  }
+                  else {
+                    i = #t35;
+                    [yield] let dynamic #t37 = asy::_awaitHelper(func.call<core::int*>(let final core::int* #t38 = i in let final core::int* #t39 = i = #t38.{core::num::+}(1) in #t38), :async_op_then, :async_op_error, :async_op) in null;
+                    _in::unsafeCast<core::int*>(:result);
+                  }
+                  [yield] let dynamic #t40 = asy::_awaitHelper(func.call<core::bool*>(i.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
+                  if(_in::unsafeCast<core::bool*>(:result)) {
+                    {
+                      c = c.{core::num::+}(1);
+                    }
+                    #t35 = i;
+                  }
+                  else
+                    break #L8;
+                }
+              }
+              self::expect(5, c);
+              c = 0;
+              #L9:
+              while (true) {
+                [yield] let dynamic #t41 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
+                if(_in::unsafeCast<core::bool*>(:result))
+                  c = c.{core::num::+}(1);
+                else
+                  break #L9;
+              }
+              self::expect(5, c);
+              c = 0;
+              do {
+                c = c.{core::num::+}(1);
+                [yield] let dynamic #t42 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
+              }
+              while (_in::unsafeCast<core::bool*>(:result))
+              self::expect(5, c);
+              [yield] let dynamic #t43 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::==}(5)), :async_op_then, :async_op_error, :async_op) in null;
+              if(_in::unsafeCast<core::bool*>(:result)) {
+                self::expect(5, c);
               }
               else {
-                i = #t35;
-                [yield] let dynamic #t37 = asy::_awaitHelper(func.call<core::int*>(let final core::int* #t38 = i in let final core::int* #t39 = i = #t38.{core::num::+}(1) in #t38), :async_op_then, :async_op_error, :async_op) in null;
-                _in::unsafeCast<core::int*>(:result);
+                throw "unreachable";
               }
-              [yield] let dynamic #t40 = asy::_awaitHelper(func.call<core::bool*>(i.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
-              if(_in::unsafeCast<core::bool*>(:result)) {
-                {
-                  c = c.{core::num::+}(1);
-                }
-                #t35 = i;
+              try {
+                [yield] let dynamic #t44 = asy::_awaitHelper(func.call<core::String*>("string"), :async_op_then, :async_op_error, :async_op) in null;
+                throw _in::unsafeCast<core::String*>(:result);
               }
-              else
-                break #L8;
-            }
-          }
-          self::expect(5, c);
-          c = 0;
-          #L9:
-          while (true) {
-            [yield] let dynamic #t41 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
-            if(_in::unsafeCast<core::bool*>(:result))
-              c = c.{core::num::+}(1);
-            else
-              break #L9;
-          }
-          self::expect(5, c);
-          c = 0;
-          do {
-            c = c.{core::num::+}(1);
-            [yield] let dynamic #t42 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::<}(5)), :async_op_then, :async_op_error, :async_op) in null;
-          }
-          while (_in::unsafeCast<core::bool*>(:result))
-          self::expect(5, c);
-          [yield] let dynamic #t43 = asy::_awaitHelper(func.call<core::bool*>(c.{core::num::==}(5)), :async_op_then, :async_op_error, :async_op) in null;
-          if(_in::unsafeCast<core::bool*>(:result)) {
-            self::expect(5, c);
-          }
-          else {
-            throw "unreachable";
-          }
-          try {
-            [yield] let dynamic #t44 = asy::_awaitHelper(func.call<core::String*>("string"), :async_op_then, :async_op_error, :async_op) in null;
-            throw _in::unsafeCast<core::String*>(:result);
-          }
-          on core::String* catch(no-exception-var) {
-          }
-          try {
-            [yield] let dynamic #t45 = asy::_awaitHelper(throw "string", :async_op_then, :async_op_error, :async_op) in null;
-            _in::unsafeCast<<BottomType>>(:result);
-          }
-          on core::String* catch(no-exception-var) {
-          }
-          try
-            try {
+              on core::String* catch(no-exception-var) {
+              }
+              try {
+                [yield] let dynamic #t45 = asy::_awaitHelper(throw "string", :async_op_then, :async_op_error, :async_op) in null;
+                _in::unsafeCast<<BottomType>>(:result);
+              }
+              on core::String* catch(no-exception-var) {
+              }
               try
                 try {
-                  throw "string";
+                  try
+                    try {
+                      throw "string";
+                    }
+                    on dynamic catch(final dynamic e) {
+                      self::expect("string", e);
+                      [yield] let dynamic #t46 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
+                      self::expect(0, _in::unsafeCast<core::int*>(:result));
+                      rethrow;
+                    }
+                  finally {
+                    [yield] let dynamic #t47 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
+                    self::expect(0, _in::unsafeCast<core::int*>(:result));
+                  }
                 }
                 on dynamic catch(final dynamic e) {
-                  self::expect("string", e);
-                  [yield] let dynamic #t46 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
+                  [yield] let dynamic #t48 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
                   self::expect(0, _in::unsafeCast<core::int*>(:result));
-                  rethrow;
+                  self::expect("string", e);
                 }
               finally {
-                [yield] let dynamic #t47 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
+                [yield] let dynamic #t49 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
                 self::expect(0, _in::unsafeCast<core::int*>(:result));
               }
-            }
-            on dynamic catch(final dynamic e) {
-              [yield] let dynamic #t48 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
-              self::expect(0, _in::unsafeCast<core::int*>(:result));
-              self::expect("string", e);
-            }
-          finally {
-            [yield] let dynamic #t49 = asy::_awaitHelper(func.call<core::int*>(0), :async_op_then, :async_op_error, :async_op) in null;
-            self::expect(0, _in::unsafeCast<core::int*>(:result));
-          }
-          #L10:
-          {
-            [yield] let dynamic #t50 = asy::_awaitHelper(func.call<core::int*>(2), :async_op_then, :async_op_error, :async_op) in null;
-            switch(_in::unsafeCast<core::int*>(:result)) {
-              #L11:
-              case #C3:
-                {
-                  break #L10;
+              #L10:
+              {
+                [yield] let dynamic #t50 = asy::_awaitHelper(func.call<core::int*>(2), :async_op_then, :async_op_error, :async_op) in null;
+                switch(_in::unsafeCast<core::int*>(:result)) {
+                  #L11:
+                  case #C3:
+                    {
+                      break #L10;
+                    }
+                  #L12:
+                  default:
+                    {
+                      throw "unreachable";
+                    }
                 }
-              #L12:
-              default:
-                {
-                  throw "unreachable";
-                }
-            }
-          }
-          [yield] let dynamic #t51 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-            final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-            asy::FutureOr<dynamic>* :return_value;
-            dynamic :async_stack_trace;
-            dynamic :async_op_then;
-            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 {
-                #L13:
-                {
-                  [yield] let dynamic #t52 = asy::_awaitHelper(func.call<dynamic>(42), :async_op_then, :async_op_error, :async_op) in null;
-                  :return_value = :result;
-                  break #L13;
-                }
-                asy::_completeOnAsyncReturn(:async_completer, :return_value);
-                return;
               }
-              on dynamic catch(dynamic :exception, dynamic :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.start(:async_op);
-            return :async_completer.{asy::Completer::future};
-          }).call(), :async_op_then, :async_op_error, :async_op) in null;
-          self::expect(42, :result);
-          [yield] let dynamic #t53 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-            final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-            asy::FutureOr<dynamic>* :return_value;
-            dynamic :async_stack_trace;
-            dynamic :async_op_then;
-            dynamic :async_op_error;
-            core::int* :await_jump_var = 0;
-            dynamic :await_ctx_var;
-            function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-              try {
-                #L14:
-                {
-                  :return_value = func.call<dynamic>(42);
-                  break #L14;
-                }
-                asy::_completeOnAsyncReturn(:async_completer, :return_value);
-                return;
-              }
-              on dynamic catch(dynamic :exception, dynamic :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.start(:async_op);
-            return :async_completer.{asy::Completer::future};
-          }).call(), :async_op_then, :async_op_error, :async_op) in null;
-          self::expect(42, :result);
-          function testStream1() → asy::Stream<core::int*>* /* originally async* */ {
-            asy::_AsyncStarStreamController<core::int*>* :controller;
-            dynamic :controller_stream;
-            dynamic :async_stack_trace;
-            dynamic :async_op_then;
-            dynamic :async_op_error;
-            core::int* :await_jump_var = 0;
-            dynamic :await_ctx_var;
-            dynamic :saved_try_context_var0;
-            dynamic :saved_try_context_var1;
-            function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-              try
-                try {
-                  #L15:
-                  {
-                    [yield] let dynamic #t54 = asy::_awaitHelper(func.call<core::int*>(42), :async_op_then, :async_op_error, :async_op) in null;
-                    if(:controller.{asy::_AsyncStarStreamController::add}(_in::unsafeCast<core::int*>(:result)))
-                      return null;
-                    else
-                      [yield] null;
+              [yield] let dynamic #t51 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
+                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                asy::FutureOr<dynamic>* :return_value;
+                dynamic :async_stack_trace;
+                dynamic :async_op_then;
+                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 {
+                    #L13:
+                    {
+                      [yield] let dynamic #t52 = asy::_awaitHelper(func.call<dynamic>(42), :async_op_then, :async_op_error, :async_op) in null;
+                      :return_value = :result;
+                      break #L13;
+                    }
+                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    return;
                   }
-                  return;
-                }
-                on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-                  :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-                }
-              finally {
-                :controller.{asy::_AsyncStarStreamController::close}();
-              }
-            :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-            :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-            :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-            :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
-            :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-            return :controller_stream;
-          }
-          :async_temporary_0 = <dynamic>[42];
-          [yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-          self::expectList(:async_temporary_0, _in::unsafeCast<core::List<core::int*>*>(:result));
-          function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
-            asy::_AsyncStarStreamController<core::int*>* :controller;
-            dynamic :controller_stream;
-            dynamic :async_stack_trace;
-            dynamic :async_op_then;
-            dynamic :async_op_error;
-            core::int* :await_jump_var = 0;
-            dynamic :await_ctx_var;
-            dynamic :saved_try_context_var0;
-            dynamic :saved_try_context_var1;
-            function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-              try
-                try {
-                  #L16:
-                  {
-                    [yield] let dynamic #t56 = asy::_awaitHelper(func.call<asy::Stream<core::int*>*>(self::intStream()), :async_op_then, :async_op_error, :async_op) in null;
-                    if(:controller.{asy::_AsyncStarStreamController::addStream}(_in::unsafeCast<asy::Stream<core::int*>*>(:result)))
-                      return null;
-                    else
-                      [yield] null;
+                  on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+                    :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
                   }
-                  return;
-                }
-                on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-                  :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-                }
-              finally {
-                :controller.{asy::_AsyncStarStreamController::close}();
+                :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+                :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+                :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+                :async_completer.start(:async_op);
+                return :async_completer.{asy::Completer::future};
+              }).call(), :async_op_then, :async_op_error, :async_op) in null;
+              self::expect(42, :result);
+              [yield] let dynamic #t53 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
+                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                asy::FutureOr<dynamic>* :return_value;
+                dynamic :async_stack_trace;
+                dynamic :async_op_then;
+                dynamic :async_op_error;
+                core::int* :await_jump_var = 0;
+                dynamic :await_ctx_var;
+                function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+                  try {
+                    #L14:
+                    {
+                      :return_value = func.call<dynamic>(42);
+                      break #L14;
+                    }
+                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    return;
+                  }
+                  on dynamic catch(dynamic :exception, dynamic :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.start(:async_op);
+                return :async_completer.{asy::Completer::future};
+              }).call(), :async_op_then, :async_op_error, :async_op) in null;
+              self::expect(42, :result);
+              function testStream1() → asy::Stream<core::int*>* /* originally async* */ {
+                asy::_AsyncStarStreamController<core::int*>* :controller;
+                dynamic :controller_stream;
+                dynamic :async_stack_trace;
+                dynamic :async_op_then;
+                dynamic :async_op_error;
+                core::int* :await_jump_var = 0;
+                dynamic :await_ctx_var;
+                dynamic :saved_try_context_var0;
+                dynamic :saved_try_context_var1;
+                function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+                  try
+                    try {
+                      #L15:
+                      {
+                        [yield] let dynamic #t54 = asy::_awaitHelper(func.call<core::int*>(42), :async_op_then, :async_op_error, :async_op) in null;
+                        if(:controller.{asy::_AsyncStarStreamController::add}(_in::unsafeCast<core::int*>(:result)))
+                          return null;
+                        else
+                          [yield] null;
+                      }
+                      return;
+                    }
+                    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+                      :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+                    }
+                  finally {
+                    :controller.{asy::_AsyncStarStreamController::close}();
+                  }
+                :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+                :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+                :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+                :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
+                :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+                return :controller_stream;
               }
-            :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-            :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-            :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-            :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
-            :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-            return :controller_stream;
+              :async_temporary_0 = <dynamic>[42];
+              [yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
+              self::expectList(:async_temporary_0, _in::unsafeCast<core::List<core::int*>*>(:result));
+              function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
+                asy::_AsyncStarStreamController<core::int*>* :controller;
+                dynamic :controller_stream;
+                dynamic :async_stack_trace;
+                dynamic :async_op_then;
+                dynamic :async_op_error;
+                core::int* :await_jump_var = 0;
+                dynamic :await_ctx_var;
+                dynamic :saved_try_context_var0;
+                dynamic :saved_try_context_var1;
+                function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+                  try
+                    try {
+                      #L16:
+                      {
+                        [yield] let dynamic #t56 = asy::_awaitHelper(func.call<asy::Stream<core::int*>*>(self::intStream()), :async_op_then, :async_op_error, :async_op) in null;
+                        if(:controller.{asy::_AsyncStarStreamController::addStream}(_in::unsafeCast<asy::Stream<core::int*>*>(:result)))
+                          return null;
+                        else
+                          [yield] null;
+                      }
+                      return;
+                    }
+                    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+                      :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+                    }
+                  finally {
+                    :controller.{asy::_AsyncStarStreamController::close}();
+                  }
+                :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+                :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+                :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+                :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
+                :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+                return :controller_stream;
+              }
+              :async_temporary_1 = <dynamic>[42];
+              [yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
+              self::expectList(:async_temporary_1, _in::unsafeCast<core::List<core::int*>*>(:result));
+            }
           }
-          :async_temporary_1 = <dynamic>[42];
-          [yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-          self::expectList(:async_temporary_1, _in::unsafeCast<core::List<core::int*>*>(:result));
         }
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
index f133a9d..ac4ad8d 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 import "dart:collection" as col;
 
 static method main() → dynamic {
@@ -16,11 +17,21 @@
     if(self::oracle() as{TypeError} core::bool*)
       if(self::oracle() as{TypeError} core::bool*)
         #t1.{core::List::add}(4);
-    for (core::int* i in <core::int*>[5, 6, 7])
-      #t1.{core::List::add}(i);
-    for (core::int* i in <core::int*>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool*)
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[5, 6, 7]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
         #t1.{core::List::add}(i);
+      }
+    }
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[8, 9, 10]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        if(self::oracle() as{TypeError} core::bool*)
+          #t1.{core::List::add}(i);
+      }
+    }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
       #t1.{core::List::add}(i);
   } =>#t1;
@@ -36,11 +47,21 @@
     if(self::oracle() as{TypeError} core::bool*)
       if(self::oracle() as{TypeError} core::bool*)
         #t2.{core::Set::add}(4);
-    for (core::int* i in <core::int*>[5, 6, 7])
-      #t2.{core::Set::add}(i);
-    for (core::int* i in <core::int*>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool*)
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[5, 6, 7]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
         #t2.{core::Set::add}(i);
+      }
+    }
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[8, 9, 10]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        if(self::oracle() as{TypeError} core::bool*)
+          #t2.{core::Set::add}(i);
+      }
+    }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
       #t2.{core::Set::add}(i);
   } =>#t2;
@@ -56,11 +77,21 @@
     if(self::oracle() as{TypeError} core::bool*)
       if(self::oracle() as{TypeError} core::bool*)
         #t3.{core::Map::[]=}(4, 4);
-    for (core::int* i in <core::int*>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i);
-    for (core::int* i in <core::int*>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool*)
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[5, 6, 7]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
         #t3.{core::Map::[]=}(i, i);
+      }
+    }
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[8, 9, 10]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        if(self::oracle() as{TypeError} core::bool*)
+          #t3.{core::Map::[]=}(i, i);
+      }
+    }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
       #t3.{core::Map::[]=}(i, i);
   } =>#t3;
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
index afb21c7..82dc289 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -424,8 +424,8 @@
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
-import "dart:async" as asy;
 import "dart:_internal" as _in;
+import "dart:async" as asy;
 
 class A extends core::Object {
   synthetic constructor •() → self::A*
@@ -495,144 +495,224 @@
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t11 in <core::int*>[42])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t11 = :sync-for-iterator.{core::Iterator::current};
         #t10.{core::List::add}(#t11);
+      }
+    }
   } =>#t10;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t13 in <core::int*>[42])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t13 = :sync-for-iterator.{core::Iterator::current};
         #t12.{core::Set::add}(#t13);
+      }
+    }
     #t12.{core::Set::add}(null);
   } =>#t12;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t15 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{"bar": 42}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t15 = :sync-for-iterator.{core::Iterator::current};
         #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+      }
+    }
     #t14.{core::Map::[]=}("baz", null);
   } =>#t14;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t16 = <dynamic>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t17 in <dynamic>[dynVar])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t17 = :sync-for-iterator.{core::Iterator::current};
         #t16.{core::List::add}(#t17);
+      }
+    }
   } =>#t16;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t19 in <dynamic>[dynVar])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t19 = :sync-for-iterator.{core::Iterator::current};
         #t18.{core::Set::add}(#t19);
+      }
+    }
     #t18.{core::Set::add}(null);
   } =>#t18;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, dynamic>* #t21 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, dynamic>*>*>(<core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, dynamic>* #t21 = :sync-for-iterator.{core::Iterator::current};
         #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+      }
+    }
     #t20.{core::Map::[]=}("baz", null);
   } =>#t20;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t23 in <core::List<core::int*>*>[<core::int*>[42]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t23 = :sync-for-iterator.{core::Iterator::current};
         #t22.{core::List::add}(#t23);
+      }
+    }
   } =>#t22;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t25 in <core::List<core::int*>*>[<core::int*>[42]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t25 = :sync-for-iterator.{core::Iterator::current};
         #t24.{core::Set::add}(#t25);
+      }
+    }
     #t24.{core::Set::add}(null);
   } =>#t24;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 = :sync-for-iterator.{core::Iterator::current};
         #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+      }
+    }
     #t26.{core::Map::[]=}("baz", null);
   } =>#t26;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t28 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t29 in <core::int*>[42])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
           #t28.{core::List::add}(#t29);
+        }
+      }
   } =>#t28;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t31 in <core::int*>[42])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t31 = :sync-for-iterator.{core::Iterator::current};
           #t30.{core::Set::add}(#t31);
+        }
+      }
     #t30.{core::Set::add}(null);
   } =>#t30;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t33 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{"bar": 42}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::int*>* #t33 = :sync-for-iterator.{core::Iterator::current};
           #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+        }
+      }
     #t32.{core::Map::[]=}("baz", null);
   } =>#t32;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t34 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t35 in <dynamic>[dynVar])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t35 = :sync-for-iterator.{core::Iterator::current};
           #t34.{core::List::add}(#t35);
+        }
+      }
   } =>#t34;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t37 in <dynamic>[dynVar])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t37 = :sync-for-iterator.{core::Iterator::current};
           #t36.{core::Set::add}(#t37);
+        }
+      }
     #t36.{core::Set::add}(null);
   } =>#t36;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, dynamic>* #t39 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, dynamic>*>*>(<core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, dynamic>* #t39 = :sync-for-iterator.{core::Iterator::current};
           #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+        }
+      }
     #t38.{core::Map::[]=}("baz", null);
   } =>#t38;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t41 in <core::List<core::int*>*>[<core::int*>[42]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t41 = :sync-for-iterator.{core::Iterator::current};
           #t40.{core::List::add}(#t41);
+        }
+      }
   } =>#t40;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t43 in <core::List<core::int*>*>[<core::int*>[42]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t43 = :sync-for-iterator.{core::Iterator::current};
           #t42.{core::Set::add}(#t43);
+        }
+      }
     #t42.{core::Set::add}(null);
   } =>#t42;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 = :sync-for-iterator.{core::Iterator::current};
           #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+        }
+      }
     #t44.{core::Map::[]=}("baz", null);
   } =>#t44;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t47 in <core::List<core::int*>*>[<core::int*>[]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t47 = :sync-for-iterator.{core::Iterator::current};
         #t46.{core::List::add}(#t47);
+      }
+    }
   } =>#t46;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t49 in <core::List<core::int*>*>[<core::int*>[]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t49 = :sync-for-iterator.{core::Iterator::current};
         #t48.{core::Set::add}(#t49);
+      }
+    }
     #t48.{core::Set::add}(null);
   } =>#t48;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
@@ -640,137 +720,213 @@
                                  ^";
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t51 in let final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t53 = #t52.{core::Set::add}(<core::int*>[]) in #t52)
-        #t50.{core::List::add}(#t51);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(let final core::Set<core::List<core::int*>*>* #t51 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
+        #t50.{core::List::add}(#t53);
+      }
+    }
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t55 in let final core::Set<core::List<core::int*>*>* #t56 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t57 = #t56.{core::Set::add}(<core::int*>[]) in #t56)
-        #t54.{core::Set::add}(#t55);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(let final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
+        #t54.{core::Set::add}(#t57);
+      }
+    }
     #t54.{core::Set::add}(null);
   } =>#t54;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t59 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
           #t58.{core::List::add}(#t59);
+        }
+      }
   } =>#t58;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t61 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t61 = :sync-for-iterator.{core::Iterator::current};
           #t60.{core::Set::add}(#t61);
+        }
+      }
     #t60.{core::Set::add}(null);
   } =>#t60;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 = :sync-for-iterator.{core::Iterator::current};
           #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+        }
+      }
     #t62.{core::Map::[]=}("baz", null);
   } =>#t62;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t64 = <core::int*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t65 in <core::int*>[])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t65 = :sync-for-iterator.{core::Iterator::current};
         #t64.{core::List::add}(#t65);
+      }
+    }
   } =>#t64;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t67 in <core::int*>[])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t67 = :sync-for-iterator.{core::Iterator::current};
         #t66.{core::Set::add}(#t67);
+      }
+    }
     #t66.{core::Set::add}(null);
   } =>#t66;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t69 in <core::String*, core::int*>{}.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t69 = :sync-for-iterator.{core::Iterator::current};
         #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+      }
+    }
     #t68.{core::Map::[]=}("baz", null);
   } =>#t68;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t70 = <core::int*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t71 in let final core::Set<core::int*>* #t72 = col::LinkedHashSet::•<core::int*>() in #t72)
-        #t70.{core::List::add}(#t71);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(let final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::List::add}(#t72);
+      }
+    }
   } =>#t70;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t74 in let final core::Set<core::int*>* #t75 = col::LinkedHashSet::•<core::int*>() in #t75)
-        #t73.{core::Set::add}(#t74);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(let final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
+        #t73.{core::Set::add}(#t75);
+      }
+    }
     #t73.{core::Set::add}(null);
   } =>#t73;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t76 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t77 in <core::int*>[])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t77 = :sync-for-iterator.{core::Iterator::current};
           #t76.{core::List::add}(#t77);
+        }
+      }
   } =>#t76;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t79 in <core::int*>[])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t79 = :sync-for-iterator.{core::Iterator::current};
           #t78.{core::Set::add}(#t79);
+        }
+      }
     #t78.{core::Set::add}(null);
   } =>#t78;
   core::Map<core::String*, core::int*>* map52 = block {
     final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t81 in <core::String*, core::int*>{}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
           #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+        }
+      }
     #t80.{core::Map::[]=}("baz", null);
   } =>#t80;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t83 in <core::List<core::int*>*>[<core::int*>[]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t83 = :sync-for-iterator.{core::Iterator::current};
         #t82.{core::List::add}(#t83);
+      }
+    }
   } =>#t82;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::List<core::int*>* #t85 in <core::List<core::int*>*>[<core::int*>[]])
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
         #t84.{core::Set::add}(#t85);
+      }
+    }
     #t84.{core::Set::add}(null);
   } =>#t84;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 = :sync-for-iterator.{core::Iterator::current};
         #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+      }
+    }
     #t86.{core::Map::[]=}("baz", null);
   } =>#t86;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t89 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t89 = :sync-for-iterator.{core::Iterator::current};
           #t88.{core::List::add}(#t89);
+        }
+      }
   } =>#t88;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t91 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t91 = :sync-for-iterator.{core::Iterator::current};
           #t90.{core::Set::add}(#t91);
+        }
+      }
     #t90.{core::Set::add}(null);
   } =>#t90;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 = :sync-for-iterator.{core::Iterator::current};
           #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+        }
+      }
     #t92.{core::Map::[]=}("baz", null);
   } =>#t92;
   core::List<core::List<core::int*>*>* list70 = block {
@@ -822,50 +978,90 @@
   } =>#t100;
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t101 = <core::num*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::num* #t102 in listInt)
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t102 = :sync-for-iterator.{core::Iterator::current};
         #t101.{core::List::add}(#t102);
-    else
-      for (final core::num* #t103 in listDouble)
+      }
+    }
+    else {
+      core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t103 = :sync-for-iterator.{core::Iterator::current};
         #t101.{core::List::add}(#t103);
+      }
+    }
   } =>#t101;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::num* #t105 in listInt)
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t105 = :sync-for-iterator.{core::Iterator::current};
         #t104.{core::Set::add}(#t105);
-    else
-      for (final core::num* #t106 in listDouble)
+      }
+    }
+    else {
+      core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t106 = :sync-for-iterator.{core::Iterator::current};
         #t104.{core::Set::add}(#t106);
+      }
+    }
     #t104.{core::Set::add}(null);
   } =>#t104;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t108 in mapToInt.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapToInt.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::num*>* #t108 = :sync-for-iterator.{core::Iterator::current};
         #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
-    else
-      for (final core::MapEntry<core::String*, core::num*>* #t109 in mapToDouble.{core::Map::entries})
+      }
+    }
+    else {
+      core::Iterator<core::MapEntry<core::String*, core::double*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::double*>*>*>(mapToDouble.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::num*>* #t109 = :sync-for-iterator.{core::Iterator::current};
         #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+      }
+    }
     #t107.{core::Map::[]=}("baz", null);
   } =>#t107;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t110 = <dynamic>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t111 in listInt)
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t111 = :sync-for-iterator.{core::Iterator::current};
         #t110.{core::List::add}(#t111);
-    else
-      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>*)
+      }
+    }
+    else {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t112 = :sync-for-iterator.{core::Iterator::current};
         #t110.{core::List::add}(#t112);
+      }
+    }
   } =>#t110;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t114 in listInt)
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t114 = :sync-for-iterator.{core::Iterator::current};
         #t113.{core::Set::add}(#t114);
-    else
-      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>*)
+      }
+    }
+    else {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
         #t113.{core::Set::add}(#t115);
+      }
+    }
     #t113.{core::Set::add}(null);
   } =>#t113;
   core::Set<dynamic>* map82 = block {
@@ -875,33 +1071,49 @@
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^");
-    else
-      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>*)
+    else {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t117 = :sync-for-iterator.{core::Iterator::current};
         #t116.{core::Set::add}(#t117);
+      }
+    }
     #t116.{core::Set::add}(null);
   } =>#t116;
   core::List<core::num*>* list83 = block {
     final core::List<core::num*>* #t118 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
       #t118.{core::List::add}(42);
-    else
-      for (final core::num* #t119 in listDouble)
+    else {
+      core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
         #t118.{core::List::add}(#t119);
+      }
+    }
   } =>#t118;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::num* #t121 in listInt)
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t121 = :sync-for-iterator.{core::Iterator::current};
         #t120.{core::Set::add}(#t121);
+      }
+    }
     else
       #t120.{core::Set::add}(3.14);
     #t120.{core::Set::add}(null);
   } =>#t120;
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t123 in mapToInt.{core::Map::entries})
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapToInt.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::num*>* #t123 = :sync-for-iterator.{core::Iterator::current};
         #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+      }
+    }
     else
       #t122.{core::Map::[]=}("bar", 3.14);
     #t122.{core::Map::[]=}("baz", null);
@@ -925,29 +1137,44 @@
   } =>#t126;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t127 = <core::int*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>*) {
-        final core::int* #t129 = #t128 as{TypeError} core::int*;
-        #t127.{core::List::add}(#t129);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t128 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t129 = #t128 as{TypeError} core::int*;
+          #t127.{core::List::add}(#t129);
+        }
       }
+    }
   } =>#t127;
   core::Set<core::int*>* set91 = block {
     final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>*) {
-        final core::int* #t132 = #t131 as{TypeError} core::int*;
-        #t130.{core::Set::add}(#t132);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t131 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t132 = #t131 as{TypeError} core::int*;
+          #t130.{core::Set::add}(#t132);
+        }
       }
+    }
     #t130.{core::Set::add}(null);
   } =>#t130;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<dynamic, dynamic>* #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
-        #t133.{core::Map::[]=}(#t135, #t136);
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>((dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t134 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
+          #t133.{core::Map::[]=}(#t135, #t136);
+        }
       }
+    }
     #t133.{core::Map::[]=}("baz", null);
   } =>#t133;
   core::List<core::int*>* list100 = block {
@@ -992,28 +1219,40 @@
   } =>#t144;
   block {
     final core::List<core::int*>* #t146 = <core::int*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
-                               ^" in "bar" as{TypeError} core::int*])
-        #t146.{core::List::add}(#t147);
+                               ^" in "bar" as{TypeError} core::int*]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t148 = :sync-for-iterator.{core::Iterator::current};
+        #t146.{core::List::add}(#t148);
+      }
+    }
   } =>#t146;
   block {
     final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
-                               ^" in "bar" as{TypeError} core::int*])
-        #t149.{core::Set::add}(#t150);
+                               ^" in "bar" as{TypeError} core::int*]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t151 = :sync-for-iterator.{core::Iterator::current};
+        #t149.{core::Set::add}(#t151);
+      }
+    }
     #t149.{core::Set::add}(null);
   } =>#t149;
   block {
     final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
-    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{"bar": let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
+                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t154 = :sync-for-iterator.{core::Iterator::current};
+        #t152.{core::Map::[]=}(#t154.{core::MapEntry::key}, #t154.{core::MapEntry::value});
+      }
+    }
     #t152.{core::Map::[]=}("baz", null);
   } =>#t152;
   block {
@@ -1269,278 +1508,434 @@
   } =>#t196;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t197 = <core::int*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t198 in <core::int*>[42])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t198 = :sync-for-iterator.{core::Iterator::current};
         #t197.{core::List::add}(#t198);
+      }
+    }
   } =>#t197;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t200 in <core::int*>[42])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t200 = :sync-for-iterator.{core::Iterator::current};
         #t199.{core::Set::add}(#t200);
+      }
+    }
     #t199.{core::Set::add}(null);
   } =>#t199;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t202 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{"bar": 42}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t202 = :sync-for-iterator.{core::Iterator::current};
         #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+      }
+    }
     #t201.{core::Map::[]=}("baz", null);
   } =>#t201;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t203 = <dynamic>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t204 in <dynamic>[dynVar])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t204 = :sync-for-iterator.{core::Iterator::current};
         #t203.{core::List::add}(#t204);
+      }
+    }
   } =>#t203;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t206 in <dynamic>[dynVar])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t206 = :sync-for-iterator.{core::Iterator::current};
         #t205.{core::Set::add}(#t206);
+      }
+    }
     #t205.{core::Set::add}(null);
   } =>#t205;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, dynamic>* #t208 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, dynamic>*>*>(<core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, dynamic>* #t208 = :sync-for-iterator.{core::Iterator::current};
         #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+      }
+    }
     #t207.{core::Map::[]=}("baz", null);
   } =>#t207;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t210 in <core::List<core::int*>*>[<core::int*>[42]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t210 = :sync-for-iterator.{core::Iterator::current};
         #t209.{core::List::add}(#t210);
+      }
+    }
   } =>#t209;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t212 in <core::List<core::int*>*>[<core::int*>[42]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t212 = :sync-for-iterator.{core::Iterator::current};
         #t211.{core::Set::add}(#t212);
+      }
+    }
     #t211.{core::Set::add}(null);
   } =>#t211;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 = :sync-for-iterator.{core::Iterator::current};
         #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+      }
+    }
     #t213.{core::Map::[]=}("baz", null);
   } =>#t213;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t215 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t216 in <core::int*>[42])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t216 = :sync-for-iterator.{core::Iterator::current};
           #t215.{core::List::add}(#t216);
+        }
+      }
   } =>#t215;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t218 in <core::int*>[42])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[42]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t218 = :sync-for-iterator.{core::Iterator::current};
           #t217.{core::Set::add}(#t218);
+        }
+      }
     #t217.{core::Set::add}(null);
   } =>#t217;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t220 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{"bar": 42}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::int*>* #t220 = :sync-for-iterator.{core::Iterator::current};
           #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+        }
+      }
     #t219.{core::Map::[]=}("baz", null);
   } =>#t219;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t221 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t222 in <dynamic>[dynVar])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t222 = :sync-for-iterator.{core::Iterator::current};
           #t221.{core::List::add}(#t222);
+        }
+      }
   } =>#t221;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t224 in <dynamic>[dynVar])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[dynVar]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t224 = :sync-for-iterator.{core::Iterator::current};
           #t223.{core::Set::add}(#t224);
+        }
+      }
     #t223.{core::Set::add}(null);
   } =>#t223;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, dynamic>* #t226 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, dynamic>*>*>(<core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, dynamic>* #t226 = :sync-for-iterator.{core::Iterator::current};
           #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+        }
+      }
     #t225.{core::Map::[]=}("baz", null);
   } =>#t225;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t228 in <core::List<core::int*>*>[<core::int*>[42]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t228 = :sync-for-iterator.{core::Iterator::current};
           #t227.{core::List::add}(#t228);
+        }
+      }
   } =>#t227;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t230 in <core::List<core::int*>*>[<core::int*>[42]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[42]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t230 = :sync-for-iterator.{core::Iterator::current};
           #t229.{core::Set::add}(#t230);
+        }
+      }
     #t229.{core::Set::add}(null);
   } =>#t229;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 = :sync-for-iterator.{core::Iterator::current};
           #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+        }
+      }
     #t231.{core::Map::[]=}("baz", null);
   } =>#t231;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t234 in <core::List<core::int*>*>[<core::int*>[]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t234 = :sync-for-iterator.{core::Iterator::current};
         #t233.{core::List::add}(#t234);
+      }
+    }
   } =>#t233;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t236 in <core::List<core::int*>*>[<core::int*>[]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t236 = :sync-for-iterator.{core::Iterator::current};
         #t235.{core::Set::add}(#t236);
+      }
+    }
     #t235.{core::Set::add}(null);
   } =>#t235;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 = :sync-for-iterator.{core::Iterator::current};
         #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+      }
+    }
     #t237.{core::Map::[]=}("baz", null);
   } =>#t237;
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t240 in let final core::Set<core::List<core::int*>*>* #t241 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t242 = #t241.{core::Set::add}(<core::int*>[]) in #t241)
-        #t239.{core::List::add}(#t240);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(let final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
+        #t239.{core::List::add}(#t242);
+      }
+    }
   } =>#t239;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t244 in let final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t246 = #t245.{core::Set::add}(<core::int*>[]) in #t245)
-        #t243.{core::Set::add}(#t244);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(let final core::Set<core::List<core::int*>*>* #t244 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
+        #t243.{core::Set::add}(#t246);
+      }
+    }
     #t243.{core::Set::add}(null);
   } =>#t243;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t248 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t248 = :sync-for-iterator.{core::Iterator::current};
           #t247.{core::List::add}(#t248);
+        }
+      }
   } =>#t247;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t250 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t250 = :sync-for-iterator.{core::Iterator::current};
           #t249.{core::Set::add}(#t250);
+        }
+      }
     #t249.{core::Set::add}(null);
   } =>#t249;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 = :sync-for-iterator.{core::Iterator::current};
           #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+        }
+      }
     #t251.{core::Map::[]=}("baz", null);
   } =>#t251;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t253 = <core::int*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t254 in <core::int*>[])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t254 = :sync-for-iterator.{core::Iterator::current};
         #t253.{core::List::add}(#t254);
+      }
+    }
   } =>#t253;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t256 in <core::int*>[])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t256 = :sync-for-iterator.{core::Iterator::current};
         #t255.{core::Set::add}(#t256);
+      }
+    }
     #t255.{core::Set::add}(null);
   } =>#t255;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t258 in <core::String*, core::int*>{}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t258 = :sync-for-iterator.{core::Iterator::current};
         #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+      }
+    }
     #t257.{core::Map::[]=}("baz", null);
   } =>#t257;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t259 = <core::int*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t260 in let final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>() in #t261)
-        #t259.{core::List::add}(#t260);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(let final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
+        #t259.{core::List::add}(#t261);
+      }
+    }
   } =>#t259;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t263 in let final core::Set<core::int*>* #t264 = col::LinkedHashSet::•<core::int*>() in #t264)
-        #t262.{core::Set::add}(#t263);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(let final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
+        #t262.{core::Set::add}(#t264);
+      }
+    }
     #t262.{core::Set::add}(null);
   } =>#t262;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t265 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t266 in <core::int*>[])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t266 = :sync-for-iterator.{core::Iterator::current};
           #t265.{core::List::add}(#t266);
+        }
+      }
   } =>#t265;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::int* #t268 in <core::int*>[])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t268 = :sync-for-iterator.{core::Iterator::current};
           #t267.{core::Set::add}(#t268);
+        }
+      }
     #t267.{core::Set::add}(null);
   } =>#t267;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t270 in <core::List<core::int*>*>[<core::int*>[]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t270 = :sync-for-iterator.{core::Iterator::current};
         #t269.{core::List::add}(#t270);
+      }
+    }
   } =>#t269;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t272 = :sync-for-iterator.{core::Iterator::current};
         #t271.{core::Set::add}(#t272);
+      }
+    }
     #t271.{core::Set::add}(null);
   } =>#t271;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 = :sync-for-iterator.{core::Iterator::current};
         #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+      }
+    }
     #t273.{core::Map::[]=}("baz", null);
   } =>#t273;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t276 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t276 = :sync-for-iterator.{core::Iterator::current};
           #t275.{core::List::add}(#t276);
+        }
+      }
   } =>#t275;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::List<core::int*>* #t278 in <core::List<core::int*>*>[<core::int*>[]])
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t278 = :sync-for-iterator.{core::Iterator::current};
           #t277.{core::Set::add}(#t278);
+        }
+      }
     #t277.{core::Set::add}(null);
   } =>#t277;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 = :sync-for-iterator.{core::Iterator::current};
           #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+        }
+      }
     #t279.{core::Map::[]=}("baz", null);
   } =>#t279;
   core::List<core::List<core::int*>*>* list70 = block {
@@ -1609,65 +2004,113 @@
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t290 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::num* #t291 in listInt)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t291 = :sync-for-iterator.{core::Iterator::current};
           #t290.{core::List::add}(#t291);
-      else
-        for (final core::num* #t292 in listDouble)
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t292 = :sync-for-iterator.{core::Iterator::current};
           #t290.{core::List::add}(#t292);
+        }
+      }
   } =>#t290;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::num* #t294 in listInt)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t294 = :sync-for-iterator.{core::Iterator::current};
           #t293.{core::Set::add}(#t294);
-      else
-        for (final core::num* #t295 in listDouble)
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t295 = :sync-for-iterator.{core::Iterator::current};
           #t293.{core::Set::add}(#t295);
+        }
+      }
     #t293.{core::Set::add}(null);
   } =>#t293;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t297 in mapStringInt.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapStringInt.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::num*>* #t297 = :sync-for-iterator.{core::Iterator::current};
           #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<core::String*, core::num*>* #t298 in mapStringDouble.{core::Map::entries})
+        }
+      }
+      else {
+        core::Iterator<core::MapEntry<core::String*, core::double*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::double*>*>*>(mapStringDouble.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::num*>* #t298 = :sync-for-iterator.{core::Iterator::current};
           #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+        }
+      }
     #t296.{core::Map::[]=}("baz", null);
   } =>#t296;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t299 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t300 in listInt)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t300 = :sync-for-iterator.{core::Iterator::current};
           #t299.{core::List::add}(#t300);
-      else
-        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t301 = :sync-for-iterator.{core::Iterator::current};
           #t299.{core::List::add}(#t301);
+        }
+      }
   } =>#t299;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final dynamic #t303 in listInt)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t303 = :sync-for-iterator.{core::Iterator::current};
           #t302.{core::Set::add}(#t303);
-      else
-        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t304 = :sync-for-iterator.{core::Iterator::current};
           #t302.{core::Set::add}(#t304);
+        }
+      }
     #t302.{core::Set::add}(null);
   } =>#t302;
   core::Map<dynamic, dynamic>* map82 = block {
     final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<dynamic, dynamic>* #t306 in mapStringInt.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapStringInt.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<dynamic, dynamic>* #t306 = :sync-for-iterator.{core::Iterator::current};
           #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<dynamic, dynamic>* #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
+        }
+      }
+      else {
+        core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>((dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<dynamic, dynamic>* #t307 = :sync-for-iterator.{core::Iterator::current};
           #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+        }
+      }
     #t305.{core::Map::[]=}("baz", null);
   } =>#t305;
   core::List<core::num*>* list83 = block {
@@ -1675,16 +2118,24 @@
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError} core::bool*)
         #t308.{core::List::add}(42);
-      else
-        for (final core::num* #t309 in listDouble)
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(listDouble).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t309 = :sync-for-iterator.{core::Iterator::current};
           #t308.{core::List::add}(#t309);
+        }
+      }
   } =>#t308;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::num* #t311 in listInt)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(listInt).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t311 = :sync-for-iterator.{core::Iterator::current};
           #t310.{core::Set::add}(#t311);
+        }
+      }
       else
         #t310.{core::Set::add}(3.14);
     #t310.{core::Set::add}(null);
@@ -1692,9 +2143,13 @@
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t313 in mapStringInt.{core::Map::entries})
+      if(self::oracle<dynamic>() as{TypeError} core::bool*) {
+        core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapStringInt.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<core::String*, core::num*>* #t313 = :sync-for-iterator.{core::Iterator::current};
           #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+        }
+      }
       else
         #t312.{core::Map::[]=}("bar", 3.14);
     #t312.{core::Map::[]=}("baz", null);
@@ -1718,29 +2173,44 @@
   } =>#t316;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t317 = <core::int*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>*) {
-        final core::int* #t319 = #t318 as{TypeError} core::int*;
-        #t317.{core::List::add}(#t319);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t318 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t319 = #t318 as{TypeError} core::int*;
+          #t317.{core::List::add}(#t319);
+        }
       }
+    }
   } =>#t317;
   core::Set<core::int*>* set91 = block {
     final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>*) {
-        final core::int* #t322 = #t321 as{TypeError} core::int*;
-        #t320.{core::Set::add}(#t322);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t321 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t322 = #t321 as{TypeError} core::int*;
+          #t320.{core::Set::add}(#t322);
+        }
       }
+    }
     #t320.{core::Set::add}(null);
   } =>#t320;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, dynamic>* #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
-        #t323.{core::Map::[]=}(#t325, #t326);
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>((dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t324 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
+          #t323.{core::Map::[]=}(#t325, #t326);
+        }
       }
+    }
     #t323.{core::Map::[]=}("baz", null);
   } =>#t323;
   core::List<core::int*>* list100 = block {
@@ -1760,36 +2230,66 @@
   } =>#t331;
   core::List<core::int*>* list110 = block {
     final core::List<core::int*>* #t333 = <core::int*>[];
-    for (core::int* i in <core::int*>[1, 2, 3])
-      #t333.{core::List::add}(i);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        #t333.{core::List::add}(i);
+      }
+    }
   } =>#t333;
   core::Set<core::int*>* set110 = block {
     final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i in <core::int*>[1, 2, 3])
-      #t334.{core::Set::add}(i);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        #t334.{core::Set::add}(i);
+      }
+    }
     #t334.{core::Set::add}(null);
   } =>#t334;
   core::Map<core::String*, core::int*>* map110 = block {
     final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
-    for (core::int* i in <core::int*>[1, 2, 3])
-      #t335.{core::Map::[]=}("bar", i);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::int* i = :sync-for-iterator.{core::Iterator::current};
+        #t335.{core::Map::[]=}("bar", i);
+      }
+    }
     #t335.{core::Map::[]=}("baz", null);
   } =>#t335;
   core::List<core::int*>* list120 = block {
     final core::List<core::int*>* #t336 = <core::int*>[];
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
-      #t336.{core::List::add}(i as{TypeError} core::int*);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        dynamic i = :sync-for-iterator.{core::Iterator::current};
+        #t336.{core::List::add}(i as{TypeError} core::int*);
+      }
+    }
   } =>#t336;
   core::Set<core::int*>* set120 = block {
     final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
-      #t337.{core::Set::add}(i as{TypeError} core::int*);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        dynamic i = :sync-for-iterator.{core::Iterator::current};
+        #t337.{core::Set::add}(i as{TypeError} core::int*);
+      }
+    }
     #t337.{core::Set::add}(null);
   } =>#t337;
   core::Map<core::String*, core::int*>* map120 = block {
     final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
-      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int*);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        dynamic i = :sync-for-iterator.{core::Iterator::current};
+        #t338.{core::Map::[]=}("bar", i as{TypeError} core::int*);
+      }
+    }
     #t338.{core::Map::[]=}("baz", null);
   } =>#t338;
   core::List<core::int*>* list130 = block {
@@ -1853,30 +2353,42 @@
         } =>#t346;
         block {
           final core::List<core::int*>* #t350 = <core::int*>[];
-          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-            for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t351 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
-                                                ^" in "bar" as{TypeError} core::int*])
-              #t350.{core::List::add}(#t351);
+                                                ^" in "bar" as{TypeError} core::int*]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t352 = :sync-for-iterator.{core::Iterator::current};
+              #t350.{core::List::add}(#t352);
+            }
+          }
         } =>#t350;
         block {
           final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
-          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-            for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
-                                                ^" in "bar" as{TypeError} core::int*])
-              #t353.{core::Set::add}(#t354);
+                                                ^" in "bar" as{TypeError} core::int*]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t355 = :sync-for-iterator.{core::Iterator::current};
+              #t353.{core::Set::add}(#t355);
+            }
+          }
           #t353.{core::Set::add}(null);
         } =>#t353;
         block {
           final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
-          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
-            for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
+            core::Iterator<core::MapEntry<core::int*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::int*, core::int*>*>*>(<core::int*, core::int*>{let final<BottomType> #t357 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-              #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
+                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::MapEntry<core::int*, core::int*>* #t359 = :sync-for-iterator.{core::Iterator::current};
+              #t356.{core::Map::[]=}(#t359.{core::MapEntry::key}, #t359.{core::MapEntry::value});
+            }
+          }
           #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null);
@@ -2006,86 +2518,134 @@
         final core::int* i = 0;
         block {
           final core::List<core::int*>* #t376 = <core::int*>[];
-          for (final core::int* #t377 in <core::int*>[1]) {
-            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t377 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
   <int>[for (i in <int>[1]) i];
              ^";
-            #t376.{core::List::add}(i);
+                #t376.{core::List::add}(i);
+              }
+            }
           }
         } =>#t376;
         block {
           final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
-          for (final core::int* #t379 in <core::int*>[1]) {
-            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t379 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
   <int>{for (i in <int>[1]) i, null};
              ^";
-            #t378.{core::Set::add}(i);
+                #t378.{core::Set::add}(i);
+              }
+            }
           }
           #t378.{core::Set::add}(null);
         } =>#t378;
         block {
           final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
-          for (final core::int* #t381 in <core::int*>[1]) {
-            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t381 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-            #t380.{core::Map::[]=}("bar", i);
+                #t380.{core::Map::[]=}("bar", i);
+              }
+            }
           }
           #t380.{core::Map::[]=}("baz", null);
         } =>#t380;
         core::List<dynamic>* list10 = block {
           final core::List<dynamic>* #t382 = <dynamic>[];
-          for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+          {
+            core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
-                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-            #t382.{core::List::add}(i);
+                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              dynamic i = :sync-for-iterator.{core::Iterator::current};
+              #t382.{core::List::add}(i);
+            }
+          }
         } =>#t382;
         core::Set<dynamic>* set10 = block {
           final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
-          for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+          {
+            core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
-                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-            #t384.{core::Set::add}(i);
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              dynamic i = :sync-for-iterator.{core::Iterator::current};
+              #t384.{core::Set::add}(i);
+            }
+          }
           #t384.{core::Set::add}(null);
         } =>#t384;
         core::Map<core::String*, dynamic>* map10 = block {
           final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
-          for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+          {
+            core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
-                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-            #t386.{core::Map::[]=}("bar", i);
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              dynamic i = :sync-for-iterator.{core::Iterator::current};
+              #t386.{core::Map::[]=}("bar", i);
+            }
+          }
           #t386.{core::Map::[]=}("baz", null);
         } =>#t386;
         core::List<core::int*>* list20 = block {
           final core::List<core::int*>* #t388 = <core::int*>[];
-          for (core::int* i in <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
-                                      ^" in "int" as{TypeError} core::int*])
-            #t388.{core::List::add}(i);
+                                      ^" in "int" as{TypeError} core::int*]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              core::int* i = :sync-for-iterator.{core::Iterator::current};
+              #t388.{core::List::add}(i);
+            }
+          }
         } =>#t388;
         core::Set<core::int*>* set20 = block {
           final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
-          for (core::int* i in <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                                     ^" in "int" as{TypeError} core::int*])
-            #t391.{core::Set::add}(i);
+                                     ^" in "int" as{TypeError} core::int*]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              core::int* i = :sync-for-iterator.{core::Iterator::current};
+              #t391.{core::Set::add}(i);
+            }
+          }
           #t391.{core::Set::add}(null);
         } =>#t391;
         core::Map<core::String*, core::int*>* map20 = block {
           final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
-          for (core::int* i in <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                                     ^" in "int" as{TypeError} core::int*])
-            #t394.{core::Map::[]=}("bar", i);
+                                     ^" in "int" as{TypeError} core::int*]).{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              core::int* i = :sync-for-iterator.{core::Iterator::current};
+              #t394.{core::Map::[]=}("bar", i);
+            }
+          }
           #t394.{core::Map::[]=}("baz", null);
         } =>#t394;
         final core::List<dynamic>* #t397 = <dynamic>[];
diff --git a/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.expect
index 78f359e..cb9a540 100644
--- a/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.expect
@@ -1,9 +1,16 @@
 library;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 static method main(core::List<core::String*>* arguments) → dynamic {
-  for (core::String* arguments in arguments) {
-    core::print(arguments);
+  {
+    core::Iterator<core::String*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::String*>*>(arguments).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      core::String* arguments = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::print(arguments);
+      }
+    }
   }
 }
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
index 6916586..0571257 100644
--- a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
@@ -66,6 +66,7 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class Super extends core::Object {
   field core::int* superInstanceField = null;
@@ -85,93 +86,201 @@
   method m() → dynamic {
     core::String* local;
     dynamic untypedLocal;
-    for (final core::String* #t1 in <core::String*>[]) {
-      local = #t1;
+    {
+      core::Iterator<core::String*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::String*>*>(<core::String*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::String* #t1 = :sync-for-iterator.{core::Iterator::current};
+        {
+          local = #t1;
+        }
+      }
     }
-    for (final dynamic #t2 in <dynamic>[]) {
-      untypedLocal = #t2;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+        {
+          untypedLocal = #t2;
+        }
+      }
     }
-    for (final core::int* #t3 in <core::int*>[]) {
-      this.{self::C::instanceField} = #t3;
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t3 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::instanceField} = #t3;
+        }
+      }
     }
-    for (final dynamic #t4 in <dynamic>[]) {
-      this.{self::C::untypedInstanceField} = #t4;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::untypedInstanceField} = #t4;
+        }
+      }
     }
-    for (final core::double* #t5 in <core::double*>[]) {
-      self::C::staticField = #t5;
+    {
+      core::Iterator<core::double*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::double*>*>(<core::double*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::double* #t5 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::C::staticField = #t5;
+        }
+      }
     }
-    for (final dynamic #t6 in <dynamic>[]) {
-      self::C::untypedStaticField = #t6;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::C::untypedStaticField = #t6;
+        }
+      }
     }
-    for (final core::bool* #t7 in <core::bool*>[]) {
-      self::topLevelField = #t7;
+    {
+      core::Iterator<core::bool*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::bool*>*>(<core::bool*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::bool* #t7 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::topLevelField = #t7;
+        }
+      }
     }
-    for (final dynamic #t8 in <dynamic>[]) {
-      self::untypedTopLevelField = #t8;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::untypedTopLevelField = #t8;
+        }
+      }
     }
-    for (final core::int* #t9 in <core::int*>[]) {
-      super.{self::Super::superInstanceField} = #t9;
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t9 = :sync-for-iterator.{core::Iterator::current};
+        {
+          super.{self::Super::superInstanceField} = #t9;
+        }
+      }
     }
-    for (final dynamic #t10 in <dynamic>[]) {
-      super.{self::Super::untypedSuperInstanceField} = #t10;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
+        {
+          super.{self::Super::untypedSuperInstanceField} = #t10;
+        }
+      }
     }
     self::C* c = new self::C::•();
-    for (final core::int* #t11 in <core::int*>[]) {
-      c.{self::C::instanceField} = #t11;
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t11 = :sync-for-iterator.{core::Iterator::current};
+        {
+          c.{self::C::instanceField} = #t11;
+        }
+      }
     }
-    for (final dynamic #t12 in <dynamic>[]) {
-      c.{self::Super::untypedSuperInstanceField} = #t12;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t12 = :sync-for-iterator.{core::Iterator::current};
+        {
+          c.{self::Super::untypedSuperInstanceField} = #t12;
+        }
+      }
     }
-    for (final dynamic #t13 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t13 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
     for (unresolved in []) {}
          ^^^^^^^^^^";
+        }
+      }
     }
-    for (final dynamic #t14 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the class 'C'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
     for (unresolved.foo in []) {}
          ^^^^^^^^^^".foo = #t14;
+        }
+      }
     }
-    for (final dynamic #t15 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t15 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
     for (c.unresolved in []) {}
            ^^^^^^^^^^";
+        }
+      }
     }
     {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (main() in []) {}
          ^^^^";
-      for (final dynamic #t16 in <dynamic>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+      {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
+          {
+            invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (main() in []) {}
          ^^^^";
-        self::main();
+            self::main();
+          }
+        }
       }
     }
     {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
     for (var x, y in <int>[]) {
          ^^^";
-      for (final core::int* #t17 in <core::int*>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+      {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t17 = :sync-for-iterator.{core::Iterator::current};
+          {
+            invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
     for (var x, y in <int>[]) {
          ^^^";
-        dynamic x;
-        dynamic y;
-        core::print(x);
-        core::print(y);
+            dynamic x;
+            dynamic y;
+            core::print(x);
+            core::print(y);
+          }
+        }
       }
     }
-    for (final dynamic #t18 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t18 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
     for (constant in []) {}
          ^^^^^^^^";
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
index 4789444..606d3a0 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
@@ -2,15 +2,21 @@
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
+import "dart:_internal" as _in;
 
 class C extends core::Object {
   final field core::Set<core::int*>* s;
   constructor •(core::List<core::int*>* ell) → self::C*
     : self::C::s = block {
       final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
-      for (core::int* e in ell)
-        if(e.{core::int::isOdd})
-          #t1.{core::Set::add}(2.{core::num::*}(e));
+      {
+        core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(ell).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          core::int* e = :sync-for-iterator.{core::Iterator::current};
+          if(e.{core::int::isOdd})
+            #t1.{core::Set::add}(2.{core::num::*}(e));
+        }
+      }
     } =>#t1, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/general/null_aware_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_aware_for_in.dart.strong.transformed.expect
index 18203ab..f6157cd7 100644
--- a/pkg/front_end/testcases/general/null_aware_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_aware_for_in.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class Class extends core::Object {
   synthetic constructor •() → self::Class*
@@ -10,8 +11,14 @@
 static method main() → dynamic {
   dynamic o;
   if(false) {
-    for (final dynamic #t1 in (let final dynamic #t2 = o in #t2.{core::Object::==}(null) ?{dynamic} null : #t2.iterable) as{TypeError} core::Iterable<dynamic>*) {
-      self::Class* c = #t1 as{TypeError} self::Class*;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>((let final dynamic #t1 = o in #t1.{core::Object::==}(null) ?{dynamic} null : #t1.iterable) as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::Class* c = #t2 as{TypeError} self::Class*;
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
index eb0c3cc..4d80567b 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
@@ -9,38 +9,66 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 import "dart:collection" as col;
 
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     #t1.{core::List::add}(1);
-    for (final core::int* #t2 in <core::int*>[2])
-      #t1.{core::List::add}(#t2);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[2]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t2 = :sync-for-iterator.{core::Iterator::current};
+        #t1.{core::List::add}(#t2);
+      }
+    }
     final dynamic #t3 = <core::int*>[3];
-    if(!#t3.{core::Object::==}(null))
-      for (final core::int* #t4 in #t3)
+    if(!#t3.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(#t3).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t4 = :sync-for-iterator.{core::Iterator::current};
         #t1.{core::List::add}(#t4);
+      }
+    }
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
     #t5.{core::Map::[]=}(1, 1);
-    for (final core::MapEntry<core::int*, core::int*>* #t6 in <core::int*, core::int*>{2: 2}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::int*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::int*, core::int*>*>*>(<core::int*, core::int*>{2: 2}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::int*, core::int*>* #t6 = :sync-for-iterator.{core::Iterator::current};
+        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      }
+    }
     final core::Map<dynamic, dynamic>* #t7 = <core::int*, core::int*>{3: 3};
-    if(!#t7.{core::Object::==}(null))
-      for (final core::MapEntry<core::int*, core::int*>* #t8 in #t7.{core::Map::entries})
+    if(!#t7.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(#t7.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::int*, core::int*>* #t8 = :sync-for-iterator.{core::Iterator::current};
         #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+      }
+    }
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
     #t9.{core::Set::add}(1);
-    for (final core::int* #t10 in <core::int*>[2])
-      #t9.{core::Set::add}(#t10);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[2]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
+        #t9.{core::Set::add}(#t10);
+      }
+    }
     final dynamic #t11 = <core::int*>[3];
-    if(!#t11.{core::Object::==}(null))
-      for (final core::int* #t12 in #t11)
+    if(!#t11.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(#t11).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
         #t9.{core::Set::add}(#t12);
+      }
+    }
   } =>#t9;
   final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/general/spread_collection.dart:21:21: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index 3a6b58b..24aaf98 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -98,6 +98,7 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 import "dart:collection" as col;
 
 static method bar<K extends core::Object* = dynamic, V extends core::Object* = dynamic>() → core::Map<self::bar::K*, self::bar::V*>*
@@ -111,68 +112,129 @@
   core::List<core::num*>* listNum = <core::num*>[42];
   core::List<dynamic>* lhs10 = block {
     final core::List<dynamic>* #t1 = <dynamic>[];
-    for (final dynamic #t2 in <dynamic>[])
-      #t1.{core::List::add}(#t2);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+        #t1.{core::List::add}(#t2);
+      }
+    }
   } =>#t1;
   core::Set<dynamic>* set10 = block {
     final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t4 in <dynamic>[])
-      #t3.{core::Set::add}(#t4);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
+        #t3.{core::Set::add}(#t4);
+      }
+    }
   } =>#t3;
   core::Map<dynamic, dynamic>* map10 = block {
     final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(<dynamic, dynamic>{}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
+        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      }
+    }
   } =>#t5;
   core::Map<dynamic, dynamic>* map10ambiguous = block {
     final core::Map<dynamic, dynamic>* #t7 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t8 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(<dynamic, dynamic>{}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t8 = :sync-for-iterator.{core::Iterator::current};
+        #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+      }
+    }
   } =>#t7;
   core::List<core::int*>* lhs20 = block {
     final core::List<core::int*>* #t9 = <core::int*>[];
-    for (final core::int* #t10 in spread)
-      #t9.{core::List::add}(#t10);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
+        #t9.{core::List::add}(#t10);
+      }
+    }
   } =>#t9;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t12 in spread)
-      #t11.{core::Set::add}(#t12);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
+        #t11.{core::Set::add}(#t12);
+      }
+    }
     #t11.{core::Set::add}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
-    for (final dynamic #t14 in spread) {
-      final core::int* #t15 = #t14 as{TypeError} core::int*;
-      #t13.{core::Set::add}(#t15);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t15 = #t14 as{TypeError} core::int*;
+          #t13.{core::Set::add}(#t15);
+        }
+      }
     }
   } =>#t13;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t16 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t17 in mapSpread.{core::Map::entries})
-      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapSpread.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
+        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+      }
+    }
     #t16.{core::Map::[]=}("baz", 42);
   } =>#t16;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t19 in mapSpread.{core::Map::entries})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapSpread.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
+        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+      }
+    }
   } =>#t18;
   core::List<dynamic>* lhs21 = block {
     final core::List<dynamic>* #t20 = <dynamic>[];
-    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
-      #t20.{core::List::add}(#t21);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>((spread as dynamic) as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
+        #t20.{core::List::add}(#t21);
+      }
+    }
   } =>#t20;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
-      #t22.{core::Set::add}(#t23);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>((spread as dynamic) as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t23 = :sync-for-iterator.{core::Iterator::current};
+        #t22.{core::Set::add}(#t23);
+      }
+    }
     #t22.{core::Set::add}(42);
   } =>#t22;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
-      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t25 = :sync-for-iterator.{core::Iterator::current};
+        #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+      }
+    }
     #t24.{core::Map::[]=}("baz", 42);
   } =>#t24;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
@@ -181,49 +243,91 @@
                            ^";
   core::List<core::int*>* lhs22 = block {
     final core::List<core::int*>* #t26 = <core::int*>[];
-    for (final core::int* #t27 in <core::int*>[])
-      #t26.{core::List::add}(#t27);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t27 = :sync-for-iterator.{core::Iterator::current};
+        #t26.{core::List::add}(#t27);
+      }
+    }
   } =>#t26;
   core::Set<core::int*>* set22 = block {
     final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t29 in <core::int*>[])
-      #t28.{core::Set::add}(#t29);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
+        #t28.{core::Set::add}(#t29);
+      }
+    }
     #t28.{core::Set::add}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
-    for (final dynamic #t31 in <core::int*>[]) {
-      final core::int* #t32 = #t31 as{TypeError} core::int*;
-      #t30.{core::Set::add}(#t32);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t31 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t32 = #t31 as{TypeError} core::int*;
+          #t30.{core::Set::add}(#t32);
+        }
+      }
     }
   } =>#t30;
   core::Map<core::String*, core::int*>* map22 = block {
     final core::Map<core::String*, core::int*>* #t33 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t34 in <core::String*, core::int*>{}.{core::Map::entries})
-      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(<core::String*, core::int*>{}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t34 = :sync-for-iterator.{core::Iterator::current};
+        #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+      }
+    }
   } =>#t33;
   core::List<core::List<core::int*>*>* lhs23 = block {
     final core::List<core::List<core::int*>*>* #t35 = <core::List<core::int*>*>[];
-    for (final core::List<core::int*>* #t36 in <core::List<core::int*>*>[<core::int*>[]])
-      #t35.{core::List::add}(#t36);
+    {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t36 = :sync-for-iterator.{core::Iterator::current};
+        #t35.{core::List::add}(#t36);
+      }
+    }
   } =>#t35;
   core::Set<core::List<core::int*>*>* set23 = block {
     final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (final core::List<core::int*>* #t38 in <core::List<core::int*>*>[<core::int*>[]])
-      #t37.{core::Set::add}(#t38);
+    {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t38 = :sync-for-iterator.{core::Iterator::current};
+        #t37.{core::Set::add}(#t38);
+      }
+    }
     #t37.{core::Set::add}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (final dynamic #t40 in <core::List<core::int*>*>[<core::int*>[]]) {
-      final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
-      #t39.{core::Set::add}(#t41);
+    {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::List<core::int*>*>*>(<core::List<core::int*>*>[<core::int*>[]]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t40 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
+          #t39.{core::Set::add}(#t41);
+        }
+      }
     }
   } =>#t39;
   core::Map<core::String*, core::List<core::int*>*>* map23 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
-    for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries})
-      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>*>*>(<core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 = :sync-for-iterator.{core::Iterator::current};
+        #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+      }
+    }
   } =>#t42;
   dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:96:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   dynamic map24ambiguous = {...spread, ...mapSpread};
@@ -233,16 +337,26 @@
   int lhs30 = /*@ typeArgs=int* */ [...spread];
                                    ^" in ( block {
     final core::List<core::int*>* #t45 = <core::int*>[];
-    for (final core::int* #t46 in spread)
-      #t45.{core::List::add}(#t46);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t46 = :sync-for-iterator.{core::Iterator::current};
+        #t45.{core::List::add}(#t46);
+      }
+    }
   } =>#t45) as{TypeError} core::int*;
   core::int* set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
   int set30 = /*@ typeArgs=int* */ {...spread, 42};
                                    ^" in ( block {
     final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t49 in spread)
-      #t48.{core::Set::add}(#t49);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t49 = :sync-for-iterator.{core::Iterator::current};
+        #t48.{core::Set::add}(#t49);
+      }
+    }
     #t48.{core::Set::add}(42);
   } =>#t48) as{TypeError} core::int*;
   core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
@@ -250,9 +364,15 @@
       {...spread};
       ^" in ( block {
     final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
-    for (final dynamic #t52 in spread) {
-      final core::int* #t53 = #t52 as{TypeError} core::int*;
-      #t51.{core::Set::add}(#t53);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(spread).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t52 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t53 = #t52 as{TypeError} core::int*;
+          #t51.{core::Set::add}(#t53);
+        }
+      }
     }
   } =>#t51) as{TypeError} core::int*;
   core::int* map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
@@ -260,8 +380,13 @@
       {...mapSpread, \"baz\": 42};
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t56 in mapSpread.{core::Map::entries})
-      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapSpread.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t56 = :sync-for-iterator.{core::Iterator::current};
+        #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+      }
+    }
     #t55.{core::Map::[]=}("baz", 42);
   } =>#t55) as{TypeError} core::int*;
   core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
@@ -269,8 +394,13 @@
       {...mapSpread};
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t59 in mapSpread.{core::Map::entries})
-      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(mapSpread.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
+        #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+      }
+    }
   } =>#t58) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
@@ -313,9 +443,15 @@
     #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
     ...null,
        ^");
-    for (final dynamic #t69 in <dynamic>[]) {
-      final dynamic #t70 = #t69 as{TypeError} dynamic;
-      #t68.{core::Set::add}(#t70);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t69 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final dynamic #t70 = #t69 as{TypeError} dynamic;
+          #t68.{core::Set::add}(#t70);
+        }
+      }
     }
   } =>#t68;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
@@ -324,70 +460,122 @@
   core::List<core::int*>* lhs80 = block {
     final core::List<core::int*>* #t71 = <core::int*>[];
     final dynamic #t72 = null;
-    if(!#t72.{core::Object::==}(null))
-      for (final core::int* #t73 in #t72)
+    if(!#t72.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(#t72).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
         #t71.{core::List::add}(#t73);
+      }
+    }
   } =>#t71;
   core::Set<core::int*>* set80 = block {
     final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
     final dynamic #t75 = null;
-    if(!#t75.{core::Object::==}(null))
-      for (final core::int* #t76 in #t75)
+    if(!#t75.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(#t75).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t76 = :sync-for-iterator.{core::Iterator::current};
         #t74.{core::Set::add}(#t76);
+      }
+    }
   } =>#t74;
   core::Set<dynamic>* set81ambiguous = block {
     final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
     final dynamic #t78 = null;
-    if(!#t78.{core::Object::==}(null))
-      for (final dynamic #t79 in #t78) {
-        final dynamic #t80 = #t79 as{TypeError} dynamic;
-        #t77.{core::Set::add}(#t80);
+    if(!#t78.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(#t78).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t79 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final dynamic #t80 = #t79 as{TypeError} dynamic;
+          #t77.{core::Set::add}(#t80);
+        }
       }
-    for (final dynamic #t81 in <dynamic>[]) {
-      final dynamic #t82 = #t81 as{TypeError} dynamic;
-      #t77.{core::Set::add}(#t82);
+    }
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t81 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final dynamic #t82 = #t81 as{TypeError} dynamic;
+          #t77.{core::Set::add}(#t82);
+        }
+      }
     }
   } =>#t77;
   core::Map<core::String*, core::int*>* map80 = block {
     final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
     final core::Map<dynamic, dynamic>* #t84 = null;
-    if(!#t84.{core::Object::==}(null))
-      for (final core::MapEntry<core::String*, core::int*>* #t85 in #t84.{core::Map::entries})
+    if(!#t84.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(#t84.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
         #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+      }
+    }
   } =>#t83;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t87 in self::bar<core::String*, core::int*>().{core::Map::entries})
-      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+    {
+      core::Iterator<core::MapEntry<core::String*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::String*, core::int*>*>*>(self::bar<core::String*, core::int*>().{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::String*, core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
+        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+      }
+    }
   } =>#t86;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t88 = <core::int*>[];
-    for (final dynamic #t89 in listNum) {
-      final core::int* #t90 = #t89 as{TypeError} core::int*;
-      #t88.{core::List::add}(#t90);
+    {
+      core::Iterator<core::num*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::num*>*>(listNum).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t89 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t90 = #t89 as{TypeError} core::int*;
+          #t88.{core::List::add}(#t90);
+        }
+      }
     }
   } =>#t88;
   core::Map<core::num*, core::int*>* map100 = block {
     final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t92 in mapIntNum.{core::Map::entries}) {
-      final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
-      #t91.{core::Map::[]=}(#t93, #t94);
+    {
+      core::Iterator<core::MapEntry<core::int*, core::num*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::int*, core::num*>*>*>(mapIntNum.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t92 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
+          #t91.{core::Map::[]=}(#t93, #t94);
+        }
+      }
     }
   } =>#t91;
   core::List<core::int*>* list110 = block {
     final core::List<core::int*>* #t95 = <core::int*>[];
-    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>*) {
-      final core::int* #t97 = #t96 as{TypeError} core::int*;
-      #t95.{core::List::add}(#t97);
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(dynVar as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t96 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t97 = #t96 as{TypeError} core::int*;
+          #t95.{core::List::add}(#t97);
+        }
+      }
     }
   } =>#t95;
   core::Map<core::num*, core::int*>* map110 = block {
     final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-      final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
-      #t98.{core::Map::[]=}(#t100, #t101);
+    {
+      core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>((dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t99 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
+          #t98.{core::Map::[]=}(#t100, #t101);
+        }
+      }
     }
   } =>#t98;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
index 2a1ae24..7d1a7f3 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class Foo extends core::Object {
   const constructor •(core::List<core::String*>* l) → self::Foo*
@@ -10,7 +11,12 @@
 static method test() → void {
   for (@#C1 core::int* i = 0; i.{core::num::<}(1); i = i.{core::num::+}(1)) {
   }
-  for (@#C1 core::int* i in <core::int*>[0]) {
+  {
+    core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[0]).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      @#C1 core::int* i = :sync-for-iterator.{core::Iterator::current};
+      {}
+    }
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 95bdb47..f95b190 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -30,17 +30,44 @@
       {
         dynamic d;
         core::Object* o;
-        for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::F<core::Iterable<dynamic>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            dynamic x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
-        for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::F<core::Iterable<dynamic>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            dynamic x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
-        for (core::Object* x in self::F<core::Iterable<core::Object*>*>()) {
+        {
+          core::Iterator<core::Object*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::Object*>*>(self::F<core::Iterable<core::Object*>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            core::Object* x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
-        for (final dynamic #t1 in self::F<core::Iterable<dynamic>*>()) {
-          d = #t1;
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::F<core::Iterable<dynamic>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
+            {
+              d = #t1;
+            }
+          }
         }
-        for (final core::Object* #t2 in self::F<core::Iterable<core::Object*>*>()) {
-          o = #t2;
+        {
+          core::Iterator<core::Object*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::Object*>*>(self::F<core::Iterable<core::Object*>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final core::Object* #t2 = :sync-for-iterator.{core::Iterator::current};
+            {
+              o = #t2;
+            }
+          }
         }
         {
           dynamic :stream = self::F<asy::Stream<dynamic>*>();
@@ -185,11 +212,26 @@
     try {
       #L7:
       {
-        for (core::int* x in <core::int*>[1, 2, 3]) {
+        {
+          core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3]).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            core::int* x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
-        for (core::num* x in <core::num*>[1, 2, 3]) {
+        {
+          core::Iterator<core::num*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::num*>*>(<core::num*>[1, 2, 3]).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            core::num* x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
-        for (core::int* x in <core::int*>[1, 2, 3]) {
+        {
+          core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3]).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            core::int* x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
         {
           dynamic :stream = self::MyStream::•<core::int*>();
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 1e3cd61..6d20b98 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -21,7 +21,12 @@
       #L1:
       {
         core::Object* o;
-        for (dynamic x in o as{TypeError} core::Iterable<dynamic>*) {
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            dynamic x = :sync-for-iterator.{core::Iterator::current};
+            {}
+          }
         }
         {
           dynamic :stream = o as{TypeError} asy::Stream<dynamic>*;
@@ -46,8 +51,14 @@
             }
         }
         core::int* y;
-        for (final dynamic #t4 in o as{TypeError} core::Iterable<dynamic>*) {
-          y = #t4 as{TypeError} core::int*;
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
+            {
+              y = #t4 as{TypeError} core::int*;
+            }
+          }
         }
         {
           dynamic :stream = o as{TypeError} asy::Stream<dynamic>*;
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
index f98e42e..a5c5985 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
@@ -1,11 +1,18 @@
 library test;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 static method test(core::List<core::num*>* nums) → void {
-  for (core::num* x in nums) {
-    if(x is core::int*) {
-      core::int* y = x{core::int*};
+  {
+    core::Iterator<core::num*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::num*>*>(nums).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      core::num* x = :sync-for-iterator.{core::Iterator::current};
+      {
+        if(x is core::int*) {
+          core::int* y = x{core::int*};
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index 12a0f49..67247a8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -30,6 +30,7 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class Foo extends core::Object {
   field core::int* bar = 42;
@@ -42,10 +43,16 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → void {
-    for (core::String* i in t) {
-      core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(t).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        core::String* i = :sync-for-iterator.{core::Iterator::current};
+        {
+          core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int*;
+        }
+      }
     }
   }
 }
@@ -54,59 +61,113 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Baz::S* t) → void {
-    for (self::Baz::T* i in t) {
-      core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(t).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        self::Baz::T* i = :sync-for-iterator.{core::Iterator::current};
+        {
+          core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int*;
-      self::Baz::T* y = i;
+          self::Baz::T* y = i;
+        }
+      }
     }
   }
 }
 static method test() → dynamic {
   core::List<self::Foo*>* list = <self::Foo*>[];
-  for (self::Foo* x in list) {
-    core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+  {
+    core::Iterator<self::Foo*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::Foo*>*>(list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      self::Foo* x = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in x as{TypeError} core::String*;
+      }
+    }
   }
-  for (dynamic x in list) {
-    core::String* y = x as{TypeError} core::String*;
+  {
+    core::Iterator<self::Foo*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::Foo*>*>(list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic x = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::String* y = x as{TypeError} core::String*;
+      }
+    }
   }
-  for (final self::Foo* #t4 in list) {
-    core::String* x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+  {
+    core::Iterator<self::Foo*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::Foo*>*>(list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::Foo* #t4 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::String* x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
 Try changing the type of the variable.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in #t4 as{TypeError} core::String*;
-    core::String* y = x;
+        core::String* y = x;
+      }
+    }
   }
   dynamic z;
-  for (final self::Foo* #t6 in list) {
-    z = #t6;
-    core::String* y = z as{TypeError} core::String*;
+  {
+    core::Iterator<self::Foo*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::Foo*>*>(list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::Foo* #t6 = :sync-for-iterator.{core::Iterator::current};
+      {
+        z = #t6;
+        core::String* y = z as{TypeError} core::String*;
+      }
+    }
   }
   core::Iterable<dynamic>* iter = list;
-  for (final dynamic #t7 in iter) {
-    self::Foo* x = #t7 as{TypeError} self::Foo*;
-    self::Foo* y = x;
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(iter).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::Foo* x = #t7 as{TypeError} self::Foo*;
+        self::Foo* y = x;
+      }
+    }
   }
   dynamic iter2 = list;
-  for (final dynamic #t8 in iter2 as{TypeError} core::Iterable<dynamic>*) {
-    self::Foo* x = #t8 as{TypeError} self::Foo*;
-    self::Foo* y = x;
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(iter2 as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::Foo* x = #t8 as{TypeError} self::Foo*;
+        self::Foo* y = x;
+      }
+    }
   }
   core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
-  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:70: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:70: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Map' is from 'dart:core'.
  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
  - 'Iterable' is from 'dart:core'.
   for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
-                                                                     ^" in map as{TypeError} core::Iterable<dynamic>*) {
-    core::String* y = x as{TypeError} core::String*;
+                                                                     ^" in map as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic x = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::String* y = x as{TypeError} core::String*;
+      }
+    }
   }
-  for (core::String* x in map.{core::Map::keys}) {
-    core::String* y = x;
+  {
+    core::Iterator<core::String*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::String*>*>(map.{core::Map::keys}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      core::String* x = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::String* y = x;
+      }
+    }
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
index b48f3df..6bbfddf 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class A extends core::Object {
   synthetic constructor •() → self::A*
@@ -15,20 +16,50 @@
   set aSetter(self::A* value) → void {}
   method test() → void {
     self::A* aLocal;
-    for (final self::A* #t1 in self::f<core::Iterable<self::A*>*>()) {
-      aLocal = #t1;
+    {
+      core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::A* #t1 = :sync-for-iterator.{core::Iterator::current};
+        {
+          aLocal = #t1;
+        }
+      }
     }
-    for (final self::A* #t2 in self::f<core::Iterable<self::A*>*>()) {
-      this.{self::C::aField} = #t2;
+    {
+      core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::A* #t2 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::aField} = #t2;
+        }
+      }
     }
-    for (final self::A* #t3 in self::f<core::Iterable<self::A*>*>()) {
-      this.{self::C::aSetter} = #t3;
+    {
+      core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::A* #t3 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::aSetter} = #t3;
+        }
+      }
     }
-    for (final self::A* #t4 in self::f<core::Iterable<self::A*>*>()) {
-      self::aTopLevel = #t4;
+    {
+      core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::A* #t4 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::aTopLevel = #t4;
+        }
+      }
     }
-    for (final self::A* #t5 in self::f<core::Iterable<self::A*>*>()) {
-      self::aTopLevelSetter = #t5;
+    {
+      core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::A* #t5 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::aTopLevelSetter = #t5;
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index ee4302e..367cb2e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -44,11 +44,17 @@
       #L1:
       {
         core::String* s;
-        for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   for (int x in s) {}
-                ^" in s as{TypeError} core::Iterable<dynamic>*) {
-          core::int* x = #t1 as{TypeError} core::int*;
+                ^" in s as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+            {
+              core::int* x = #t2 as{TypeError} core::int*;
+            }
+          }
         }
         {
           dynamic :stream = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
@@ -78,11 +84,17 @@
             }
         }
         core::int* y;
-        for (final dynamic #t8 in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   for (y in s) {}
-            ^" in s as{TypeError} core::Iterable<dynamic>*) {
-          y = #t8 as{TypeError} core::int*;
+            ^" in s as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
+            {
+              y = #t9 as{TypeError} core::int*;
+            }
+          }
         }
         {
           dynamic :stream = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index 649f649..480adea 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -54,8 +54,14 @@
         self::A* a;
         self::B* b;
         core::int* i;
-        for (final self::A* #t1 in iterable) {
-          a = #t1;
+        {
+          core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(iterable).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final self::A* #t1 = :sync-for-iterator.{core::Iterator::current};
+            {
+              a = #t1;
+            }
+          }
         }
         {
           dynamic :stream = stream;
@@ -81,8 +87,14 @@
               :result;
             }
         }
-        for (final self::A* #t6 in iterable) {
-          b = #t6 as{TypeError} self::B*;
+        {
+          core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(iterable).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final self::A* #t6 = :sync-for-iterator.{core::Iterator::current};
+            {
+              b = #t6 as{TypeError} self::B*;
+            }
+          }
         }
         {
           dynamic :stream = stream;
@@ -108,12 +120,18 @@
               :result;
             }
         }
-        for (final self::A* #t11 in iterable) {
-          i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+        {
+          core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(iterable).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final self::A* #t11 = :sync-for-iterator.{core::Iterator::current};
+            {
+              i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
   for (i in iterable) {}
          ^" in #t11 as{TypeError} core::int*;
+            }
+          }
         }
         {
           dynamic :stream = stream;
@@ -143,8 +161,14 @@
               :result;
             }
         }
-        for (final self::A* #t18 in self::f<core::Iterable<self::A*>*>()) {
-          a = #t18;
+        {
+          core::Iterator<self::A*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<self::A*>*>(self::f<core::Iterable<self::A*>*>()).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            final self::A* #t18 = :sync-for-iterator.{core::Iterator::current};
+            {
+              a = #t18;
+            }
+          }
         }
         {
           dynamic :stream = self::f<asy::Stream<self::A*>*>();
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
index ee3a0ca..024a770 100644
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 import "package:expect/expect.dart" as exp;
 
 import "package:expect/expect.dart";
@@ -8,25 +9,43 @@
 static field dynamic global;
 static method fact4() → dynamic {
   core::int* f = 1;
-  for (core::int* n in <core::int*>[1, 2, 3, 4]) {
-    f = f.{core::num::*}(n);
+  {
+    core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2, 3, 4]).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      core::int* n = :sync-for-iterator.{core::Iterator::current};
+      {
+        f = f.{core::num::*}(n);
+      }
+    }
   }
   return f;
 }
 static method fact5() → dynamic {
   core::int* f = 1;
   dynamic n;
-  for (final dynamic #t1 in <dynamic>[1, 2, 3, 4, 5]) {
-    n = #t1;
-    f = f.{core::num::*}(n as{TypeError} core::num*) as{TypeError} core::int*;
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[1, 2, 3, 4, 5]).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
+      {
+        n = #t1;
+        f = f.{core::num::*}(n as{TypeError} core::num*) as{TypeError} core::int*;
+      }
+    }
   }
   return f;
 }
 static method fact6() → dynamic {
   core::int* f = 1;
-  for (final dynamic #t2 in <dynamic>[1, 2, 3, 4, 5, 6]) {
-    self::global = #t2;
-    f = f.{core::num::*}(self::global as{TypeError} core::num*) as{TypeError} core::int*;
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[1, 2, 3, 4, 5, 6]).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::global = #t2;
+        f = f.{core::num::*}(self::global as{TypeError} core::num*) as{TypeError} core::int*;
+      }
+    }
   }
   return f;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
index 2abfb5d..e81f7fc 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
@@ -22,18 +22,25 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 static method main() → dynamic {
   {
     invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
   for (var x, y in []) {}
        ^^^";
-    for (final dynamic #t1 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
   for (var x, y in []) {}
        ^^^";
-      dynamic x;
-      dynamic y;
+          dynamic x;
+          dynamic y;
+        }
+      }
     }
   }
   #L1:
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
index c41f760..e5f407f 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -82,6 +82,7 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 import "dart:collection" as collection;
 
@@ -91,98 +92,158 @@
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
-    for (final dynamic #t1 in x as{TypeError} core::Iterable<dynamic>*) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(x as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
     for (key in x) {
          ^^^";
-      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+          core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
       print(key);
             ^^^");
+        }
+      }
     }
-    for (final dynamic #t2 in x as{TypeError} core::Iterable<dynamic>*) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(x as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
     for (Fisk in x) {
          ^^^^";
-      core::print(self::Fisk*);
+          core::print(self::Fisk*);
+        }
+      }
     }
-    for (final dynamic #t3 in x as{TypeError} core::Iterable<dynamic>*) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(x as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
     for (collection in x) {
          ^^^^^^^^^^";
-      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+          core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
       print(collection);
             ^^^^^^^^^^");
+        }
+      }
     }
-    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>*) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(x as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
     for (VoidFunction in x) {
          ^^^^^^^^^^^^";
-      core::print(() →* void);
+          core::print(() →* void);
+        }
+      }
     }
     {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (1 in x) {
          ^";
-      for (final dynamic #t5 in x as{TypeError} core::Iterable<dynamic>*) {
-        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+      {
+        core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(x as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
+          {
+            invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (1 in x) {
          ^";
-        1;
-        core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+            1;
+            core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
       print(key);
             ^^^");
+          }
+        }
       }
     }
   }
 }
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
-  for (final dynamic #t6 in arguments as{TypeError} core::Iterable<dynamic>*) {
-    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(arguments as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+      {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
   for (key in arguments) {
        ^^^";
-    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Getter not found: 'key'.
+        core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Getter not found: 'key'.
     print(key);
           ^^^");
+      }
+    }
   }
-  for (final dynamic #t7 in arguments as{TypeError} core::Iterable<dynamic>*) {
-    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(arguments as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
+      {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
   for (Fisk in arguments) {
        ^^^^";
-    core::print(self::Fisk*);
+        core::print(self::Fisk*);
+      }
+    }
   }
-  for (final dynamic #t8 in arguments as{TypeError} core::Iterable<dynamic>*) {
-    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(arguments as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+      {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
   for (collection in arguments) {
        ^^^^^^^^^^";
-    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+        core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
     print(collection);
           ^^^^^^^^^^");
+      }
+    }
   }
-  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>*) {
-    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(arguments as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
+      {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
   for (VoidFunction in arguments) {
        ^^^^^^^^^^^^";
-    core::print(() →* void);
+        core::print(() →* void);
+      }
+    }
   }
   {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
   for (1 in arguments) {
        ^";
-    for (final dynamic #t10 in arguments as{TypeError} core::Iterable<dynamic>*) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(arguments as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
+        {
+          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
   for (1 in arguments) {
        ^";
-      1;
-      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Getter not found: 'key'.
+          1;
+          core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Getter not found: 'key'.
     print(key);
           ^^^");
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
index 519cf0e..12c970e 100644
--- a/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
@@ -137,8 +137,14 @@
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op);
         }
-        for (dynamic x in (f_sync_star.call() as dynamic) as{TypeError} core::Iterable<dynamic>*) {
-          core::print(x);
+        {
+          core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>((f_sync_star.call() as dynamic) as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
+          for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+            dynamic x = :sync-for-iterator.{core::Iterator::current};
+            {
+              core::print(x);
+            }
+          }
         }
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
index 7c5b3c9..5ae1f55 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class C extends core::Object {
   static field dynamic staticField = null;
@@ -12,26 +13,68 @@
   set instanceSetter(dynamic x) → void {}
   method test() → void {
     dynamic localVar;
-    for (final dynamic #t1 in <dynamic>[]) {
-      self::topLevel = #t1;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t1 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::topLevel = #t1;
+        }
+      }
     }
-    for (final dynamic #t2 in <dynamic>[]) {
-      self::topLevelSetter = #t2;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::topLevelSetter = #t2;
+        }
+      }
     }
-    for (final dynamic #t3 in <dynamic>[]) {
-      self::C::staticField = #t3;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::C::staticField = #t3;
+        }
+      }
     }
-    for (final dynamic #t4 in <dynamic>[]) {
-      self::C::staticSetter = #t4;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
+        {
+          self::C::staticSetter = #t4;
+        }
+      }
     }
-    for (final dynamic #t5 in <dynamic>[]) {
-      this.{self::C::instanceField} = #t5;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::instanceField} = #t5;
+        }
+      }
     }
-    for (final dynamic #t6 in <dynamic>[]) {
-      this.{self::C::instanceSetter} = #t6;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+        {
+          this.{self::C::instanceSetter} = #t6;
+        }
+      }
     }
-    for (final dynamic #t7 in <dynamic>[]) {
-      localVar = #t7;
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(<dynamic>[]).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
+        {
+          localVar = #t7;
+        }
+      }
     }
   }
 }
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
index 6852242..083afec 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
@@ -40,6 +40,7 @@
 //
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 static field core::bool* b = false;
 static field core::List<dynamic>* list = <dynamic>[];
@@ -48,40 +49,64 @@
   final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
   if(self::b)
     #t1.{core::Map::[]=}(0, 1);
-  else
-    for (final core::MapEntry<dynamic, dynamic>* #t2 in self::map0.{core::Map::entries})
+  else {
+    core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(self::map0.{core::Map::entries}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic>* #t2 = :sync-for-iterator.{core::Iterator::current};
       #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+    }
+  }
 } =>#t1;
 static field core::Map<dynamic, dynamic>* map2 = block {
   final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
-  if(self::b)
-    for (final core::MapEntry<dynamic, dynamic>* #t4 in self::map0.{core::Map::entries})
+  if(self::b) {
+    core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(self::map0.{core::Map::entries}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic>* #t4 = :sync-for-iterator.{core::Iterator::current};
       #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
+    }
+  }
   else
     #t3.{core::Map::[]=}(0, 1);
 } =>#t3;
 static field core::Map<dynamic, dynamic>* map3 = block {
   final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
-  if(self::b)
-    for (final core::MapEntry<dynamic, dynamic>* #t6 in self::map0.{core::Map::entries})
+  if(self::b) {
+    core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(self::map0.{core::Map::entries}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
       #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-  else
-    for (final core::MapEntry<dynamic, dynamic>* #t7 in self::map0.{core::Map::entries})
+    }
+  }
+  else {
+    core::Iterator<core::MapEntry<dynamic, dynamic>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, dynamic>*>*>(self::map0.{core::Map::entries}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic>* #t7 = :sync-for-iterator.{core::Iterator::current};
       #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
+    }
+  }
 } =>#t5;
 static field core::Map<dynamic, core::int*>* map4 = block {
   final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
   if(self::b)
     #t8.{core::Map::[]=}(0, 1);
-  else
-    for (dynamic a in self::list)
+  else {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic a = :sync-for-iterator.{core::Iterator::current};
       #t8.{core::Map::[]=}(a, 1);
+    }
+  }
 } =>#t8;
 static field core::Map<dynamic, core::int*>* map5 = block {
   final core::Map<dynamic, core::int*>* #t9 = <dynamic, core::int*>{};
-  if(self::b)
-    for (dynamic a in self::list)
+  if(self::b) {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic a = :sync-for-iterator.{core::Iterator::current};
       #t9.{core::Map::[]=}(a, 1);
+    }
+  }
   else
     #t9.{core::Map::[]=}(0, 1);
 } =>#t9;
@@ -89,17 +114,35 @@
   final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
   if(self::b)
     #t10.{core::Map::[]=}(0, 1);
-  else
-    for (dynamic a in self::list)
-      for (final core::MapEntry<dynamic, core::int*>* #t11 in <dynamic, core::int*>{a: 1}.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+  else {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic a = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::Iterator<core::MapEntry<dynamic, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, core::int*>*>*>(<dynamic, core::int*>{a: 1}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<dynamic, core::int*>* #t11 = :sync-for-iterator.{core::Iterator::current};
+          #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        }
+      }
+    }
+  }
 } =>#t10;
 static field core::Map<dynamic, core::int*>* map7 = block {
   final core::Map<dynamic, core::int*>* #t12 = <dynamic, core::int*>{};
-  if(self::b)
-    for (dynamic a in self::list)
-      for (final core::MapEntry<dynamic, core::int*>* #t13 in <dynamic, core::int*>{a: 1}.{core::Map::entries})
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
+  if(self::b) {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(self::list).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      dynamic a = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::Iterator<core::MapEntry<dynamic, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, core::int*>*>*>(<dynamic, core::int*>{a: 1}.{core::Map::entries}).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::MapEntry<dynamic, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current};
+          #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
+        }
+      }
+    }
+  }
   else
     #t12.{core::Map::[]=}(0, 1);
 } =>#t12;
@@ -124,16 +167,24 @@
   if(self::b)
     #t16.{core::Map::[]=}(0, 1);
   else
-    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, core::int*>* #t17 in <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries})
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<dynamic, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, core::int*>*>*>(<dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
         #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+      }
+    }
 } =>#t16;
 static field core::Map<dynamic, core::int*>* map11 = block {
   final core::Map<dynamic, core::int*>* #t18 = <dynamic, core::int*>{};
   if(self::b)
-    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, core::int*>* #t19 in <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries})
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1)) {
+      core::Iterator<core::MapEntry<dynamic, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<dynamic, core::int*>*>*>(<dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
         #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+      }
+    }
   else
     #t18.{core::Map::[]=}(0, 1);
 } =>#t18;
@@ -142,9 +193,13 @@
   if(self::b)
     #t20.{core::Map::[]=}(0, 1);
   else
-    if(self::b)
-      for (final core::MapEntry<core::int*, core::int*>* #t21 in <core::int*, core::int*>{0: 1}.{core::Map::entries})
+    if(self::b) {
+      core::Iterator<core::MapEntry<core::int*, core::int*>*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::MapEntry<core::int*, core::int*>*>*>(<core::int*, core::int*>{0: 1}.{core::Map::entries}).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::int*, core::int*>* #t21 = :sync-for-iterator.{core::Iterator::current};
         #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+      }
+    }
 } =>#t20;
 static field core::Map<dynamic, core::Null?>* error4 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 40f1ea1..e86f789 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -143,7 +143,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 36;
+  UInt32 formatVersion = 37;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
   UriSource sourceMap;
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 00e609f..9ed4051 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -149,7 +149,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 36;
+  static const int BinaryFormatVersion = 37;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 059e579..a7adeed 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -64,6 +64,9 @@
   Constructor _fallThroughErrorUrlAndLineConstructor;
   Procedure _objectEquals;
   Procedure _mapUnmodifiable;
+  Procedure _iterableGetIterator;
+  Procedure _iteratorMoveNext;
+  Procedure _iteratorGetCurrent;
 
   Class _internalSymbolClass;
 
@@ -322,10 +325,25 @@
     return _iterableClass ??= index.getClass('dart:core', 'Iterable');
   }
 
+  Procedure get iterableGetIterator {
+    return _iterableGetIterator ??=
+        index.getMember('dart:core', 'Iterable', 'get:iterator');
+  }
+
   Class get iteratorClass {
     return _iteratorClass ??= index.getClass('dart:core', 'Iterator');
   }
 
+  Procedure get iteratorMoveNext {
+    return _iteratorMoveNext ??=
+        index.getMember('dart:core', 'Iterator', 'moveNext');
+  }
+
+  Procedure get iteratorGetCurrent {
+    return _iteratorGetCurrent ??=
+        index.getMember('dart:core', 'Iterator', 'get:current');
+  }
+
   Class get listClass {
     return _listClass ??= index.getClass('dart:core', 'List');
   }
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 367e1e7..20219ac 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -131,6 +131,65 @@
         return null;
     }
   }
+
+  @override
+  TreeNode visitForInStatement(ForInStatement stmt) {
+    if (stmt.isAsync) {
+      return super.visitForInStatement(stmt);
+    }
+
+    // Transform
+    //
+    //   for ({var/final} T <variable> in <iterable>) { ... }
+    //
+    // Into
+    //
+    //  {
+    //    final Iterator<T> :sync-for-iterator = <iterable>.iterator;
+    //    for (; :sync-for-iterator.moveNext() ;) {
+    //        {var/final} T variable = :iterator.current;
+    //        ...
+    //      }
+    //    }
+    //  }
+    final CoreTypes coreTypes = staticTypeContext.typeEnvironment.coreTypes;
+
+    // TODO(39565): We should be able to use forInElementType.
+    helper.unsafeCast;
+    final DartType iterableType =
+        stmt.iterable.getStaticType(staticTypeContext);
+    final DartType iterationType = iterableType is InterfaceType
+        ? staticTypeContext.typeEnvironment.forInElementType(stmt, iterableType)
+        : DynamicType();
+    final expectedIterableType = InterfaceType(
+        coreTypes.iterableClass, Nullability.legacy, [iterationType]);
+    final iteratorType = InterfaceType(
+        coreTypes.iteratorClass, Nullability.legacy, [iterationType]);
+
+    // TODO(39566): Iterable expression is not always well typed in the AST.
+    final typedIterable = StaticInvocation(helper.unsafeCast,
+        Arguments([stmt.iterable], types: [expectedIterableType]));
+    final iterator = VariableDeclaration(':sync-for-iterator',
+        initializer: PropertyGet(
+            typedIterable, Name('iterator'), coreTypes.iterableGetIterator)
+          ..fileOffset = stmt.iterable.fileOffset,
+        type: iteratorType)
+      ..fileOffset = stmt.iterable.fileOffset;
+
+    final condition = MethodInvocation(VariableGet(iterator), Name('moveNext'),
+        Arguments([]), coreTypes.iteratorMoveNext)
+      ..fileOffset = stmt.iterable.fileOffset;
+
+    final variable = stmt.variable
+      ..initializer = (PropertyGet(
+          VariableGet(iterator), Name('current'), coreTypes.iteratorGetCurrent)
+        ..fileOffset = stmt.bodyOffset);
+
+    final Block body = Block([variable, stmt.body]);
+
+    return Block([iterator, ForStatement([], condition, [], body)])
+        .accept<TreeNode>(this);
+  }
 }
 
 abstract class ContinuationRewriterBase extends RecursiveContinuationRewriter {
@@ -864,13 +923,11 @@
         tryFinally
       ]);
       block.accept<TreeNode>(this);
+      return null;
     } else {
-      stmt.iterable = expressionRewriter.rewrite(stmt.iterable, statements)
-        ..parent = stmt;
-      stmt.body = visitDelimited(stmt.body)..parent = stmt;
-      statements.add(stmt);
+      super.visitForInStatement(stmt);
+      return null;
     }
-    return null;
   }
 
   TreeNode visitSwitchStatement(SwitchStatement stmt) {
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index c10bc7d..200f1d7 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -99,6 +99,9 @@
   DartType forInElementType(ForInStatement node, DartType iterableType) {
     // TODO(johnniwinther): Update this to use the type of
     //  `iterable.iterator.current` if inference is updated accordingly.
+    while (iterableType is TypeParameterType) {
+      iterableType = (iterableType as TypeParameterType).bound;
+    }
     if (node.isAsync) {
       InterfaceType type =
           getTypeAsInstanceOf(iterableType, coreTypes.streamClass);
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 0d6cf3d..2abb4bd 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -4014,71 +4014,8 @@
 
   @override
   visitForInStatement(ForInStatement node) {
-    _generateNode(node.iterable);
-
-    // Front-end inserts implicit cast (type check) which ensures that
-    // result of iterable expression is Iterable<dynamic>.
-    _recordSourcePosition(node.iterable.fileOffset);
-    asm.emitInterfaceCall(
-        cp.addInterfaceCall(InvocationKind.getter, iterableIterator,
-            objectTable.getArgDescHandle(1)),
-        1);
-
-    final iteratorTemp = locals.tempIndexInFrame(node);
-    asm.emitPopLocal(iteratorTemp);
-
-    final capturedIteratorVar = locals.capturedIteratorVar(node);
-    if (capturedIteratorVar != null) {
-      _genPushContextForVariable(capturedIteratorVar);
-      asm.emitPush(iteratorTemp);
-      _genStoreVar(capturedIteratorVar);
-    }
-
-    if (asm.isUnreachable) {
-      // Bail out before binding a label which allows backward jumps,
-      // as it is not handled by local unreachable code elimination.
-      return;
-    }
-
-    final Label done = new Label();
-    final Label join = new Label(allowsBackwardJumps: true);
-
-    asm.bind(join);
-    asm.emitCheckStack(++currentLoopDepth);
-
-    if (capturedIteratorVar != null) {
-      _genLoadVar(capturedIteratorVar);
-      asm.emitStoreLocal(iteratorTemp);
-    } else {
-      asm.emitPush(iteratorTemp);
-    }
-
-    asm.emitInterfaceCall(
-        cp.addInterfaceCall(InvocationKind.method, iteratorMoveNext,
-            objectTable.getArgDescHandle(1)),
-        1);
-    asm.emitJumpIfFalse(done);
-
-    _enterScope(node);
-    _recordSourcePosition(node.bodyOffset);
-
-    _genPushContextIfCaptured(node.variable);
-
-    asm.emitPush(iteratorTemp);
-    asm.emitInterfaceCall(
-        cp.addInterfaceCall(InvocationKind.getter, iteratorCurrent,
-            objectTable.getArgDescHandle(1)),
-        1);
-
-    _genStoreVar(node.variable);
-
-    _generateNode(node.body);
-
-    _leaveScope();
-    asm.emitJump(join);
-
-    asm.bind(done);
-    --currentLoopDepth;
+    // Should be lowered by the async transformation.
+    throw "unreachable";
   }
 
   @override
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index a3c5fb5..831596f 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -715,7 +715,7 @@
   LoadConstant         r1, CP#5
   LoadConstant         r2, CP#5
   LoadConstant         r3, CP#5
-  Frame                7
+  Frame                6
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
@@ -755,20 +755,18 @@
   CompareIntLt
   JumpIfFalse          L2
   Push                 r4
+  Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextVar       0, 2
   InterfaceCall        CP#8, 1
-  PopLocal             r8
-  Push                 r4
-  Push                 r8
   StoreContextVar      2, 1
 L5:
   CheckStack           2
   Push                 r4
   LoadContextVar       2, 1
-  StoreLocal           r8
   InterfaceCall        CP#10, 1
+  AssertBoolean        0
   JumpIfFalse          L3
   AllocateContext      3, 1
   StoreLocal           r5
@@ -777,7 +775,9 @@
   StoreContextParent
   PopLocal             r4
   Push                 r4
-  Push                 r8
+  Push                 r4
+  LoadContextParent
+  LoadContextVar       2, 1
   InterfaceCall        CP#12, 1
   StoreContextVar      3, 0
   Push                 r4
@@ -829,7 +829,7 @@
   LoadContextParent
   LoadContextVar       0, 10
   DirectCall           CP#16, 4
-  PopLocal             r10
+  PopLocal             r9
   PushNull
   ReturnTOS
 L11:
@@ -919,7 +919,7 @@
   ReturnTOS
 Try #0 end:
 Try #0 handler:
-  SetFrame             11
+  SetFrame             10
   Push                 r0
   LoadFieldTOS         CP#6
   PopLocal             r4
@@ -2100,11 +2100,17 @@
         {
           dart.core::int* sum = 0;
           for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-            for (dart.core::int* j in list) {
-              :async_temporary_1 = sum;
-              :async_temporary_0 = i.{dart.core::num::+}(j);
-              [yield] let dynamic #t4 = dart.async::_awaitHelper(#lib::foo(), :async_op_then, :async_op_error, :async_op) in null;
-              sum = :async_temporary_1.{dart.core::num::+}(:async_temporary_0.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result)));
+            {
+              dart.core::Iterator<dart.core::int*>* :sync-for-iterator = dart._internal::unsafeCast<dart.core::Iterable<dart.core::int*>*>(list).{dart.core::Iterable::iterator};
+              for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
+                dart.core::int* j = :sync-for-iterator.{dart.core::Iterator::current};
+                {
+                  :async_temporary_1 = sum;
+                  :async_temporary_0 = i.{dart.core::num::+}(j);
+                  [yield] let dynamic #t4 = dart.async::_awaitHelper(#lib::foo(), :async_op_then, :async_op_error, :async_op) in null;
+                  sum = :async_temporary_1.{dart.core::num::+}(:async_temporary_0.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result)));
+                }
+              }
             }
           }
           for (dart.core::int* k = 0; k.{dart.core::num::<}(10); k = k.{dart.core::num::+}(1)) {
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 383b1c0..5207c3e 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -1301,6 +1301,7 @@
   CheckStack           1
   Push                 r2
   InterfaceCall        CP#2, 1
+  AssertBoolean        0
   JumpIfFalse          L1
   AllocateContext      0, 1
   PopLocal             r0
@@ -1840,12 +1841,18 @@
       }
     }
     method testForInLoop(dart.core::List<dart.core::int*>* list) → void {
-      for (dart.core::int* i in list) {
-        () →* dart.core::Null? inc = () → dart.core::Null? {
-          i = i.{dart.core::num::+}(1);
-        };
-        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inc.call();
-        dart.core::print(i);
+      {
+        dart.core::Iterator<dart.core::int*>* :sync-for-iterator = dart._internal::unsafeCast<dart.core::Iterable<dart.core::int*>*>(list).{dart.core::Iterable::iterator};
+        for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
+          dart.core::int* i = :sync-for-iterator.{dart.core::Iterator::current};
+          {
+            () →* dart.core::Null? inc = () → dart.core::Null? {
+              i = i.{dart.core::num::+}(1);
+            };
+            [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inc.call();
+            dart.core::print(i);
+          }
+        }
       }
     }
   }
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index 2985990..cb40ac2 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -249,6 +249,7 @@
   CheckStack           1
   Push                 r1
   InterfaceCall        CP#2, 1
+  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r1
   InterfaceCall        CP#4, 1
@@ -290,6 +291,7 @@
   CheckStack           1
   Push                 r2
   InterfaceCall        CP#2, 1
+  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r2
   InterfaceCall        CP#4, 1
@@ -382,17 +384,29 @@
   }
   static method test_for_in(dart.core::List<dart.core::int*>* list) → dart.core::int* {
     dart.core::int* sum = 0;
-    for (dart.core::int* e in list) {
-      sum = sum.{dart.core::num::+}(e);
+    {
+      dart.core::Iterator<dart.core::int*>* :sync-for-iterator = dart._internal::unsafeCast<dart.core::Iterable<dart.core::int*>*>(list).{dart.core::Iterable::iterator};
+      for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
+        dart.core::int* e = :sync-for-iterator.{dart.core::Iterator::current};
+        {
+          sum = sum.{dart.core::num::+}(e);
+        }
+      }
     }
     return sum;
   }
   static method test_for_in_with_outer_var(dart.core::List<dart.core::int*>* list) → dart.core::int* {
     dart.core::int* sum = 0;
     dart.core::int* e = 42;
-    for (final dart.core::int* #t3 in list) {
-      e = #t3;
-      sum = sum.{dart.core::num::+}(e);
+    {
+      dart.core::Iterator<dart.core::int*>* :sync-for-iterator = dart._internal::unsafeCast<dart.core::Iterable<dart.core::int*>*>(list).{dart.core::Iterable::iterator};
+      for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
+        final dart.core::int* #t3 = :sync-for-iterator.{dart.core::Iterator::current};
+        {
+          e = #t3;
+          sum = sum.{dart.core::num::+}(e);
+        }
+      }
     }
     return sum;
   }
diff --git a/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart.expect b/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart.expect
index 075f92e..bea1e0c 100644
--- a/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart.expect
+++ b/pkg/vm/testcases/transformations/unreachable_code_elimination/uce_testcases.dart.expect
@@ -1,6 +1,7 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class TestAssertInitializer extends core::Object {
   constructor •() → self::TestAssertInitializer*
@@ -56,7 +57,11 @@
   while (self::foo())
   for (; ; ) {
   }
-  for (core::int* i in <core::int*>[1, 2]) {
+  {
+    core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(<core::int*>[1, 2]).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      core::int* i = :sync-for-iterator.{core::Iterator::current};
+    }
   }
   try {
   }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 66258fe..b0de882 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -4249,6 +4249,12 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) {
+  // For-in statements are lowered after kernel version 37.
+  if (translation_helper_.GetKernelProgramInfo().kernel_binary_version() >=
+      37) {
+    UNREACHABLE();
+  }
+
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
   const TokenPosition position = ReadPosition();  // read position.
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index d739365..2061521 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,7 +20,7 @@
 
 // Both version numbers are inclusive.
 static const uint32_t kMinSupportedKernelFormatVersion = 29;
-static const uint32_t kMaxSupportedKernelFormatVersion = 36;
+static const uint32_t kMaxSupportedKernelFormatVersion = 37;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \