library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
//                                  ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
//                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:44: Error: Expected ':' after this.
//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
//                                            ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
//                                                     ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:61: Error: Expected ':' after this.
//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
//                                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
//                                   ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
//                                                    ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   <int>[if (oracle("foo")) "bar"];
//                            ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   <int>{if (oracle("foo")) "bar", null};
//                            ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: 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};
//                                           ^
//
// 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"]];
//                                ^
//
// 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};
//                                ^
//
// 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};
//                                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[if (oracle("foo")) ...map];
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{if (oracle("foo")) ...map, null};
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
//                                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String>[if (oracle("foo")) 42 else 3.14];
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String>[if (oracle("foo")) 42 else 3.14];
//                                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String>{if (oracle("foo")) 42 else 3.14, null};
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String>{if (oracle("foo")) 42 else 3.14, null};
//                                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
//                                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
//                                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[if (oracle("foo")) ...map else 42];
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{if (oracle("foo")) ...map else 42, null};
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
//                                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[if (oracle("foo")) 42 else ...map];
//                                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{if (oracle("foo")) ...map else 42, null};
//                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
//                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
//                        ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
//                        ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
//   List<int> list20 = [if (42) 42];
//                           ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
//   Set<int> set20 = {if (42) 42};
//                         ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
//   Map<int, int> map30 = {if (42) 42: 42};
//                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
//                                                     ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
//                                                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
//                                                   ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
//                                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
//                                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
//                                                                           ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
//                                                                 ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
//                                                                               ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
//   <int>[for (i in <int>[1]) i];
//              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
//   <int>{for (i in <int>[1]) i, null};
//              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
// 	                   ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
// Try removing the keyword, or use a for-each statement.
//   var list50 = [await for (;;) 42];
//                 ^^^^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
// Try removing the keyword, or use a for-each statement.
//   var set50 = {await for (;;) 42, null};
//                ^^^^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
// Try removing the keyword, or use a for-each statement.
//   var map50 = {await for (;;) "bar": 42, "baz": null};
//                ^^^^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: 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"];
//                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: 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};
//                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: 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};
//                                                  ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: 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};
//                                                         ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: 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};
//                                                                ^
//
// 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"]];
//                                                 ^
//
// 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};
//                                                 ^
//
// 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};
//                                                      ^
//
// 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};
//                                                             ^
//
// 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};
//                                                                     ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
//                                                ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
//                                                ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
//                                                     ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
//                                                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
//                                                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
//                                                                             ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
//                                                                                            ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
//                                                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
//                                                              ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
//  - 'Map' is from 'dart:core'.
//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
//                                                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
//  - 'List' is from 'dart:core'.
//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
//                                                                                     ^
//
// 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];
//                               ^
//
// 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};
//                              ^
//
// 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};
//                              ^
//
// 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];
//                                ^
//
// 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];
//                                       ^
//
// 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};
//                               ^
//
// 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};
//                                      ^
//
// 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};
//                               ^
//
// 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};
//                                      ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'Stream' is from 'dart:async'.
//   var list30 = [await for (var i in "not stream") i];
//                                     ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'Stream' is from 'dart:async'.
//   var set30 = {await for (var i in "not stream") i, null};
//                                    ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'Stream' is from 'dart:async'.
//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
//                                    ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
//                                                          ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
//                                                                 ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
//                                                         ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
//                                                                ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
//                                                         ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
//                                                                ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
//   var list60 = [for (; "not bool";) 42];
//                        ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
//   var set60 = {for (; "not bool";) 42, null};
//                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
//                       ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
//   <int>[await for (int i in stream) i];
//                          ^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
//   <int>{await for (int i in stream) i};
//                          ^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
//   <String, int>{await for (int i in stream) "bar": i};
//                                  ^^
//
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:async" as asy;
import "dart:_internal" as _in;

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends self::A {
  synthetic constructor •() → self::B*
    : super self::A::•()
    ;
  get foo() → core::int*
    return 42;
}
static method oracle<T extends core::Object* = dynamic>([self::oracle::T* t = #C1]) → dynamic
  return true;
static method testIfElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::Map<core::String*, core::int*>* mapToInt, core::Map<core::String*, core::double*>* mapToDouble) → dynamic {
  core::List<core::int*>* list10 = block {
    final core::List<core::int*>* #t1 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t1.{core::List::add}{Invariant}(42);
  } =>#t1;
  core::Set<core::int*>* set10 = block {
    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t2.{core::Set::add}{Invariant}(42);
    #t2.{core::Set::add}{Invariant}(null);
  } =>#t2;
  core::Map<core::String*, core::int*>* map10 = block {
    final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t3.{core::Map::[]=}{Invariant}("bar", 42);
    #t3.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t3;
  core::List<dynamic>* list11 = block {
    final core::List<dynamic>* #t4 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t4.{core::List::add}{Invariant}(dynVar);
  } =>#t4;
  core::Set<dynamic>* set11 = block {
    final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t5.{core::Set::add}{Invariant}(dynVar);
    #t5.{core::Set::add}{Invariant}(null);
  } =>#t5;
  core::Map<core::String*, dynamic>* map11 = block {
    final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t6.{core::Map::[]=}{Invariant}("bar", dynVar);
    #t6.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t6;
  core::List<core::List<core::int*>*>* list12 = block {
    final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t7.{core::List::add}{Invariant}(<core::int*>[42]);
  } =>#t7;
  core::Set<core::List<core::int*>*>* set12 = block {
    final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t8.{core::Set::add}{Invariant}(<core::int*>[42]);
    #t8.{core::Set::add}{Invariant}(null);
  } =>#t8;
  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
    #t9.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t9;
  core::List<core::int*>* list20 = block {
    final core::List<core::int*>* #t10 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <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}{Invariant}(#t11);
      }
    }
  } =>#t10;
  core::Set<core::int*>* set20 = block {
    final core::Set<core::int*>* #t12 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <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}{Invariant}(#t13);
      }
    }
    #t12.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <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::[]=}{Invariant}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
      }
    }
    #t14.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t14;
  core::List<dynamic>* list21 = block {
    final core::List<dynamic>* #t16 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<dynamic>* :sync-for-iterator = <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}{Invariant}(#t17);
      }
    }
  } =>#t16;
  core::Set<dynamic>* set21 = block {
    final core::Set<dynamic>* #t18 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<dynamic>* :sync-for-iterator = <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}{Invariant}(#t19);
      }
    }
    #t18.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <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::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
      }
    }
    #t20.{core::Map::[]=}{Invariant}("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,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t23);
      }
    }
  } =>#t22;
  core::Set<core::List<core::int*>*>* set22 = block {
    final core::Set<core::List<core::int*>*>* #t24 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t25);
      }
    }
    #t24.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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::[]=}{Invariant}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
      }
    }
    #t26.{core::Map::[]=}{Invariant}("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,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <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}{Invariant}(#t29);
        }
      }
  } =>#t28;
  core::Set<core::int*>* set30 = block {
    final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <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}{Invariant}(#t31);
        }
      }
    #t30.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <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::[]=}{Invariant}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
        }
      }
    #t32.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t32;
  core::List<dynamic>* list31 = block {
    final core::List<dynamic>* #t34 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<dynamic>* :sync-for-iterator = <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}{Invariant}(#t35);
        }
      }
  } =>#t34;
  core::Set<dynamic>* set31 = block {
    final core::Set<dynamic>* #t36 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<dynamic>* :sync-for-iterator = <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}{Invariant}(#t37);
        }
      }
    #t36.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <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::[]=}{Invariant}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
        }
      }
    #t38.{core::Map::[]=}{Invariant}("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,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t41);
        }
      }
  } =>#t40;
  core::Set<core::List<core::int*>*>* set33 = block {
    final core::Set<core::List<core::int*>*>* #t42 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t43);
        }
      }
    #t42.{core::Set::add}{Invariant}(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,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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::[]=}{Invariant}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
        }
      }
    #t44.{core::Map::[]=}{Invariant}("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,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t47);
      }
    }
  } =>#t46;
  core::Set<core::List<core::int*>*>* set40 = block {
    final core::Set<core::List<core::int*>*>* #t48 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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}{Invariant}(#t49);
      }
    }
    #t48.{core::Set::add}{Invariant}(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.
  Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
                                 ^";
  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,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
        final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
        #t51.{core::Set::add}{Invariant}(<core::int*>[]);
      } =>#t51).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t52 = :sync-for-iterator.{core::Iterator::current};
        #t50.{core::List::add}{Invariant}(#t52);
      }
    }
  } =>#t50;
  core::Set<core::List<core::int*>*>* set41 = block {
    final core::Set<core::List<core::int*>*>* #t53 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
        final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
        #t54.{core::Set::add}{Invariant}(<core::int*>[]);
      } =>#t54).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t55 = :sync-for-iterator.{core::Iterator::current};
        #t53.{core::Set::add}{Invariant}(#t55);
      }
    }
    #t53.{core::Set::add}{Invariant}(null);
  } =>#t53;
  core::List<core::List<core::int*>*>* list42 = block {
    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
          #t56.{core::List::add}{Invariant}(#t57);
        }
      }
  } =>#t56;
  core::Set<core::List<core::int*>*>* set42 = block {
    final core::Set<core::List<core::int*>*>* #t58 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t59);
        }
      }
    #t58.{core::Set::add}{Invariant}(null);
  } =>#t58;
  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t60 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t61 = :sync-for-iterator.{core::Iterator::current};
          #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
        }
      }
    #t60.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t60;
  core::List<core::int*>* list50 = block {
    final core::List<core::int*>* #t62 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t63 = :sync-for-iterator.{core::Iterator::current};
        #t62.{core::List::add}{Invariant}(#t63);
      }
    }
  } =>#t62;
  core::Set<core::int*>* set50 = block {
    final core::Set<core::int*>* #t64 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t65 = :sync-for-iterator.{core::Iterator::current};
        #t64.{core::Set::add}{Invariant}(#t65);
      }
    }
    #t64.{core::Set::add}{Invariant}(null);
  } =>#t64;
  core::Map<core::String*, core::int*>* map50 = block {
    final core::Map<core::String*, core::int*>* #t66 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::int*>* #t67 = :sync-for-iterator.{core::Iterator::current};
        #t66.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
      }
    }
    #t66.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t66;
  core::List<core::int*>* list51 = block {
    final core::List<core::int*>* #t68 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = ( block {
        final core::Set<core::int*>* #t69 = new col::_CompactLinkedHashSet::•<core::int*>();
      } =>#t69).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t70 = :sync-for-iterator.{core::Iterator::current};
        #t68.{core::List::add}{Invariant}(#t70);
      }
    }
  } =>#t68;
  core::Set<core::int*>* set51 = block {
    final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = ( block {
        final core::Set<core::int*>* #t72 = new col::_CompactLinkedHashSet::•<core::int*>();
      } =>#t72).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
        #t71.{core::Set::add}{Invariant}(#t73);
      }
    }
    #t71.{core::Set::add}{Invariant}(null);
  } =>#t71;
  core::List<core::int*>* list52 = block {
    final core::List<core::int*>* #t74 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
          #t74.{core::List::add}{Invariant}(#t75);
        }
      }
  } =>#t74;
  core::Set<core::int*>* set52 = block {
    final core::Set<core::int*>* #t76 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::int* #t77 = :sync-for-iterator.{core::Iterator::current};
          #t76.{core::Set::add}{Invariant}(#t77);
        }
      }
    #t76.{core::Set::add}{Invariant}(null);
  } =>#t76;
  core::Map<core::String*, core::int*>* map52 = block {
    final core::Map<core::String*, core::int*>* #t78 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<core::String*, core::int*>* #t79 = :sync-for-iterator.{core::Iterator::current};
          #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}, #t79.{core::MapEntry::value});
        }
      }
    #t78.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t78;
  core::List<core::List<core::int*>*>* list60 = block {
    final core::List<core::List<core::int*>*>* #t80 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
        #t80.{core::List::add}{Invariant}(#t81);
      }
    }
  } =>#t80;
  core::Set<core::List<core::int*>*>* set60 = block {
    final core::Set<core::List<core::int*>*>* #t82 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t83);
      }
    }
    #t82.{core::Set::add}{Invariant}(null);
  } =>#t82;
  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t84 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t85 = :sync-for-iterator.{core::Iterator::current};
        #t84.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
      }
    }
    #t84.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t84;
  core::List<core::List<core::int*>*>* list61 = block {
    final core::List<core::List<core::int*>*>* #t86 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
          #t86.{core::List::add}{Invariant}(#t87);
        }
      }
  } =>#t86;
  core::Set<core::List<core::int*>*>* set61 = block {
    final core::Set<core::List<core::int*>*>* #t88 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t89);
        }
      }
    #t88.{core::Set::add}{Invariant}(null);
  } =>#t88;
  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t90 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t91 = :sync-for-iterator.{core::Iterator::current};
          #t90.{core::Map::[]=}{Invariant}(#t91.{core::MapEntry::key}, #t91.{core::MapEntry::value});
        }
      }
    #t90.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t90;
  core::List<core::List<core::int*>*>* list70 = block {
    final core::List<core::List<core::int*>*>* #t92 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t92.{core::List::add}{Invariant}(<core::int*>[]);
  } =>#t92;
  core::Set<core::List<core::int*>*>* set70 = block {
    final core::Set<core::List<core::int*>*>* #t93 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t93.{core::Set::add}{Invariant}(<core::int*>[]);
    #t93.{core::Set::add}{Invariant}(null);
  } =>#t93;
  core::List<core::List<core::int*>*>* list71 = block {
    final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t94.{core::List::add}{Invariant}(<core::int*>[]);
  } =>#t94;
  core::Set<core::List<core::int*>*>* set71 = block {
    final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t95.{core::Set::add}{Invariant}(<core::int*>[]);
    #t95.{core::Set::add}{Invariant}(null);
  } =>#t95;
  core::List<core::num*>* list80 = block {
    final core::List<core::num*>* #t96 = <core::num*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t96.{core::List::add}{Invariant}(42);
    else
      #t96.{core::List::add}{Invariant}(3.14);
  } =>#t96;
  core::Set<core::num*>* set80 = block {
    final core::Set<core::num*>* #t97 = new col::_CompactLinkedHashSet::•<core::num*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t97.{core::Set::add}{Invariant}(42);
    else
      #t97.{core::Set::add}{Invariant}(3.14);
    #t97.{core::Set::add}{Invariant}(null);
  } =>#t97;
  core::Map<core::String*, core::num*>* map80 = block {
    final core::Map<core::String*, core::num*>* #t98 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t98.{core::Map::[]=}{Invariant}("bar", 42);
    else
      #t98.{core::Map::[]=}{Invariant}("bar", 3.14);
    #t98.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t98;
  core::List<core::num*>* list81 = block {
    final core::List<core::num*>* #t99 = <core::num*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t100 = :sync-for-iterator.{core::Iterator::current};
        #t99.{core::List::add}{Invariant}(#t100);
      }
    }
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t101 = :sync-for-iterator.{core::Iterator::current};
        #t99.{core::List::add}{Invariant}(#t101);
      }
    }
  } =>#t99;
  core::Set<core::num*>* set81 = block {
    final core::Set<core::num*>* #t102 = new col::_CompactLinkedHashSet::•<core::num*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t103 = :sync-for-iterator.{core::Iterator::current};
        #t102.{core::Set::add}{Invariant}(#t103);
      }
    }
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t104 = :sync-for-iterator.{core::Iterator::current};
        #t102.{core::Set::add}{Invariant}(#t104);
      }
    }
    #t102.{core::Set::add}{Invariant}(null);
  } =>#t102;
  core::Map<core::String*, core::num*>* map81 = block {
    final core::Map<core::String*, core::num*>* #t105 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::num*>* #t106 = :sync-for-iterator.{core::Iterator::current};
        #t105.{core::Map::[]=}{Invariant}(#t106.{core::MapEntry::key}, #t106.{core::MapEntry::value});
      }
    }
    else {
      core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapToDouble.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::num*>* #t107 = :sync-for-iterator.{core::Iterator::current};
        #t105.{core::Map::[]=}{Invariant}(#t107.{core::MapEntry::key}, #t107.{core::MapEntry::value});
      }
    }
    #t105.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t105;
  core::List<dynamic>* list82 = block {
    final core::List<dynamic>* #t108 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t109 = :sync-for-iterator.{core::Iterator::current};
        #t108.{core::List::add}{Invariant}(#t109);
      }
    }
    else {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t110 = :sync-for-iterator.{core::Iterator::current};
        #t108.{core::List::add}{Invariant}(#t110);
      }
    }
  } =>#t108;
  core::Set<dynamic>* set82 = block {
    final core::Set<dynamic>* #t111 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t112 = :sync-for-iterator.{core::Iterator::current};
        #t111.{core::Set::add}{Invariant}(#t112);
      }
    }
    else {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t113 = :sync-for-iterator.{core::Iterator::current};
        #t111.{core::Set::add}{Invariant}(#t113);
      }
    }
    #t111.{core::Set::add}{Invariant}(null);
  } =>#t111;
  core::Set<dynamic>* map82 = block {
    final core::Set<dynamic>* #t114 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                     ^");
    else {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
        #t114.{core::Set::add}{Invariant}(#t115);
      }
    }
    #t114.{core::Set::add}{Invariant}(null);
  } =>#t114;
  core::List<core::num*>* list83 = block {
    final core::List<core::num*>* #t116 = <core::num*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t116.{core::List::add}{Invariant}(42);
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t117 = :sync-for-iterator.{core::Iterator::current};
        #t116.{core::List::add}{Invariant}(#t117);
      }
    }
  } =>#t116;
  core::Set<core::num*>* set83 = block {
    final core::Set<core::num*>* #t118 = new col::_CompactLinkedHashSet::•<core::num*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
        #t118.{core::Set::add}{Invariant}(#t119);
      }
    }
    else
      #t118.{core::Set::add}{Invariant}(3.14);
    #t118.{core::Set::add}{Invariant}(null);
  } =>#t118;
  core::Map<core::String*, core::num*>* map83 = block {
    final core::Map<core::String*, core::num*>* #t120 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::num*>* #t121 = :sync-for-iterator.{core::Iterator::current};
        #t120.{core::Map::[]=}{Invariant}(#t121.{core::MapEntry::key}, #t121.{core::MapEntry::value});
      }
    }
    else
      #t120.{core::Map::[]=}{Invariant}("bar", 3.14);
    #t120.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t120;
  core::List<core::int*>* list90 = block {
    final core::List<core::int*>* #t122 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t122.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
  } =>#t122;
  core::Set<core::int*>* set90 = block {
    final core::Set<core::int*>* #t123 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t123.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
    #t123.{core::Set::add}{Invariant}(null);
  } =>#t123;
  core::Map<core::String*, core::int*>* map90 = block {
    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t124.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
    #t124.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t124;
  core::List<core::int*>* list91 = block {
    final core::List<core::int*>* #t125 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t126 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t127 = #t126 as{TypeError} core::int*;
          #t125.{core::List::add}{Invariant}(#t127);
        }
      }
    }
  } =>#t125;
  core::Set<core::int*>* set91 = block {
    final core::Set<core::int*>* #t128 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t129 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t130 = #t129 as{TypeError} core::int*;
          #t128.{core::Set::add}{Invariant}(#t130);
        }
      }
    }
    #t128.{core::Set::add}{Invariant}(null);
  } =>#t128;
  core::Map<core::String*, core::int*>* map91 = block {
    final core::Map<core::String*, core::int*>* #t131 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, dynamic>* #t132 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::String* #t133 = #t132.{core::MapEntry::key} as{TypeError} core::String*;
          final core::int* #t134 = #t132.{core::MapEntry::value} as{TypeError} core::int*;
          #t131.{core::Map::[]=}{Invariant}(#t133, #t134);
        }
      }
    }
    #t131.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t131;
  core::List<core::int*>* list100 = block {
    final core::List<core::int*>* #t135 = <core::int*>[];
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t135.{core::List::add}{Invariant}(42);
  } =>#t135;
  core::Set<core::int*>* set100 = block {
    final core::Set<core::int*>* #t136 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t136.{core::Set::add}{Invariant}(42);
  } =>#t136;
  core::Map<core::int*, core::int*>* map100 = block {
    final core::Map<core::int*, core::int*>* #t137 = <core::int*, core::int*>{};
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t137.{core::Map::[]=}{Invariant}(42, 42);
  } =>#t137;
}
static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
  block {
    final core::List<core::int*>* #t138 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t138.{core::List::add}{Invariant}(let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: 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*);
  } =>#t138;
  block {
    final core::Set<core::int*>* #t140 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t140.{core::Set::add}{Invariant}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: 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*);
    #t140.{core::Set::add}{Invariant}(null);
  } =>#t140;
  block {
    final core::Map<core::String*, core::int*>* #t142 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t142.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: 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*);
    #t142.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t142;
  block {
    final core::List<core::int*>* #t144 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t145 = 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*].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t146 = :sync-for-iterator.{core::Iterator::current};
        #t144.{core::List::add}{Invariant}(#t146);
      }
    }
  } =>#t144;
  block {
    final core::Set<core::int*>* #t147 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t148 = 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*].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t149 = :sync-for-iterator.{core::Iterator::current};
        #t147.{core::Set::add}{Invariant}(#t149);
      }
    }
    #t147.{core::Set::add}{Invariant}(null);
  } =>#t147;
  block {
    final core::Map<core::String*, core::int*>* #t150 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t151 = 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}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::int*>* #t152 = :sync-for-iterator.{core::Iterator::current};
        #t150.{core::Map::[]=}{Invariant}(#t152.{core::MapEntry::key}, #t152.{core::MapEntry::value});
      }
    }
    #t150.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t150;
  block {
    final core::List<core::int*>* #t153 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t153.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[if (oracle(\"foo\")) ...map];
                              ^");
  } =>#t153;
  block {
    final core::Set<core::int*>* #t154 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t154.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{if (oracle(\"foo\")) ...map, null};
                              ^");
    #t154.{core::Set::add}{Invariant}(null);
  } =>#t154;
  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                      ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                      ^": null};
  block {
    final core::List<core::String*>* #t155 = <core::String*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t155.{core::List::add}{Invariant}(let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String>[if (oracle(\"foo\")) 42 else 3.14];
                              ^" in 42 as{TypeError} core::String*);
    else
      #t155.{core::List::add}{Invariant}(let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String>[if (oracle(\"foo\")) 42 else 3.14];
                                      ^" in 3.14 as{TypeError} core::String*);
  } =>#t155;
  block {
    final core::Set<core::String*>* #t158 = new col::_CompactLinkedHashSet::•<core::String*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                              ^" in 42 as{TypeError} core::String*);
    else
      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                      ^" in 3.14 as{TypeError} core::String*);
    #t158.{core::Set::add}{Invariant}(null);
  } =>#t158;
  block {
    final core::Map<core::String*, core::String*>* #t161 = <core::String*, core::String*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t161.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                             ^" in 42 as{TypeError} core::String*);
    else
      #t161.{core::Map::[]=}{Invariant}("baz", let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                            ^" in 3.14 as{TypeError} core::String*);
    #t161.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t161;
  block {
    final core::List<core::int*>* #t164 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t164.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[if (oracle(\"foo\")) ...map else 42];
                              ^");
    else
      #t164.{core::List::add}{Invariant}(42);
  } =>#t164;
  block {
    final core::Set<core::int*>* #t165 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t165.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{if (oracle(\"foo\")) ...map else 42, null};
                              ^");
    else
      #t165.{core::Set::add}{Invariant}(42);
    #t165.{core::Set::add}{Invariant}(null);
  } =>#t165;
  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                      ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                      ^": null};
  block {
    final core::List<core::int*>* #t166 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t166.{core::List::add}{Invariant}(42);
    else
      #t166.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[if (oracle(\"foo\")) 42 else ...map];
                                      ^");
  } =>#t166;
  block {
    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t167.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{if (oracle(\"foo\")) ...map else 42, null};
                              ^");
    else
      #t167.{core::Set::add}{Invariant}(42);
    #t167.{core::Set::add}{Invariant}(null);
  } =>#t167;
  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
                                                     ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
                                                     ^": null};
  core::Set<dynamic>* set10 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
  Set<dynamic> set10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                       ^";
  core::Map<dynamic, dynamic>* map10 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
  Map<dynamic, dynamic> map10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                                    ^": null};
  core::Set<dynamic>* set11 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
  Set<dynamic> set11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                       ^";
  core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
  Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                     ^": null};
  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                  ^": null};
  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
  var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                   ^": null};
  core::List<core::int*>* list20 = block {
    final core::List<core::int*>* #t168 = <core::int*>[];
    if(let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
  List<int> list20 = [if (42) 42];
                          ^" in 42 as{TypeError} core::bool*)
      #t168.{core::List::add}{Invariant}(42);
  } =>#t168;
  core::Set<core::int*>* set20 = block {
    final core::Set<core::int*>* #t170 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
  Set<int> set20 = {if (42) 42};
                        ^" in 42 as{TypeError} core::bool*)
      #t170.{core::Set::add}{Invariant}(42);
  } =>#t170;
  core::Map<core::int*, core::int*>* map30 = block {
    final core::Map<core::int*, core::int*>* #t172 = <core::int*, core::int*>{};
    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
  Map<int, int> map30 = {if (42) 42: 42};
                             ^" in 42 as{TypeError} core::bool*)
      #t172.{core::Map::[]=}{Invariant}(42, 42);
  } =>#t172;
  core::List<core::String*>* list40 = block {
    final core::List<core::String*>* #t174 = <core::String*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t174.{core::List::add}{Invariant}(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                    ^" in true as{TypeError} core::String*);
    else
      #t174.{core::List::add}{Invariant}(let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                              ^" in 42 as{TypeError} core::String*);
  } =>#t174;
  core::Set<core::String*>* set40 = block {
    final core::Set<core::String*>* #t177 = new col::_CompactLinkedHashSet::•<core::String*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                  ^" in true as{TypeError} core::String*);
    else
      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                            ^" in 42 as{TypeError} core::String*);
  } =>#t177;
  core::Map<core::String*, core::int*>* map40 = block {
    final core::Map<core::String*, core::int*>* #t180 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                            ^" in true as{TypeError} core::String*, 42);
    else
      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                          ^" in 42 as{TypeError} core::String*, 42);
  } =>#t180;
  core::Map<core::int*, core::String*>* map41 = block {
    final core::Map<core::int*, core::String*>* #t183 = <core::int*, core::String*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                ^" in true as{TypeError} core::String*);
    else
      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                              ^" in 42 as{TypeError} core::String*);
  } =>#t183;
}
static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
  core::List<core::int*>* list10 = block {
    final core::List<core::int*>* #t186 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t186.{core::List::add}{Invariant}(42);
  } =>#t186;
  core::Set<core::int*>* set10 = block {
    final core::Set<core::int*>* #t187 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t187.{core::Set::add}{Invariant}(42);
    #t187.{core::Set::add}{Invariant}(null);
  } =>#t187;
  core::Map<core::String*, core::int*>* map10 = block {
    final core::Map<core::String*, core::int*>* #t188 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t188.{core::Map::[]=}{Invariant}("bar", 42);
    #t188.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t188;
  core::List<dynamic>* list11 = block {
    final core::List<dynamic>* #t189 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t189.{core::List::add}{Invariant}(dynVar);
  } =>#t189;
  core::Set<dynamic>* set11 = block {
    final core::Set<dynamic>* #t190 = new col::_CompactLinkedHashSet::•<dynamic>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t190.{core::Set::add}{Invariant}(dynVar);
    #t190.{core::Set::add}{Invariant}(null);
  } =>#t190;
  core::Map<core::String*, dynamic>* map11 = block {
    final core::Map<core::String*, dynamic>* #t191 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t191.{core::Map::[]=}{Invariant}("bar", dynVar);
    #t191.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t191;
  core::List<core::List<core::int*>*>* list12 = block {
    final core::List<core::List<core::int*>*>* #t192 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t192.{core::List::add}{Invariant}(<core::int*>[42]);
  } =>#t192;
  core::Set<core::List<core::int*>*>* set12 = block {
    final core::Set<core::List<core::int*>*>* #t193 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t193.{core::Set::add}{Invariant}(<core::int*>[42]);
    #t193.{core::Set::add}{Invariant}(null);
  } =>#t193;
  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t194 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t194.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
    #t194.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t194;
  core::List<core::int*>* list20 = block {
    final core::List<core::int*>* #t195 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t196 = :sync-for-iterator.{core::Iterator::current};
        #t195.{core::List::add}{Invariant}(#t196);
      }
    }
  } =>#t195;
  core::Set<core::int*>* set20 = block {
    final core::Set<core::int*>* #t197 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t198);
      }
    }
    #t197.{core::Set::add}{Invariant}(null);
  } =>#t197;
  core::Map<core::String*, core::int*>* map20 = block {
    final core::Map<core::String*, core::int*>* #t199 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <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*>* #t200 = :sync-for-iterator.{core::Iterator::current};
        #t199.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
      }
    }
    #t199.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t199;
  core::List<dynamic>* list21 = block {
    final core::List<dynamic>* #t201 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t202 = :sync-for-iterator.{core::Iterator::current};
        #t201.{core::List::add}{Invariant}(#t202);
      }
    }
  } =>#t201;
  core::Set<dynamic>* set21 = block {
    final core::Set<dynamic>* #t203 = new col::_CompactLinkedHashSet::•<dynamic>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t204 = :sync-for-iterator.{core::Iterator::current};
        #t203.{core::Set::add}{Invariant}(#t204);
      }
    }
    #t203.{core::Set::add}{Invariant}(null);
  } =>#t203;
  core::Map<core::String*, dynamic>* map21 = block {
    final core::Map<core::String*, dynamic>* #t205 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, dynamic>* #t206 = :sync-for-iterator.{core::Iterator::current};
        #t205.{core::Map::[]=}{Invariant}(#t206.{core::MapEntry::key}, #t206.{core::MapEntry::value});
      }
    }
    #t205.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t205;
  core::List<core::List<core::int*>*>* list22 = block {
    final core::List<core::List<core::int*>*>* #t207 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t208 = :sync-for-iterator.{core::Iterator::current};
        #t207.{core::List::add}{Invariant}(#t208);
      }
    }
  } =>#t207;
  core::Set<core::List<core::int*>*>* set22 = block {
    final core::Set<core::List<core::int*>*>* #t209 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t210);
      }
    }
    #t209.{core::Set::add}{Invariant}(null);
  } =>#t209;
  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t211 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t212 = :sync-for-iterator.{core::Iterator::current};
        #t211.{core::Map::[]=}{Invariant}(#t212.{core::MapEntry::key}, #t212.{core::MapEntry::value});
      }
    }
    #t211.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t211;
  core::List<core::int*>* list30 = block {
    final core::List<core::int*>* #t213 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::int* #t214 = :sync-for-iterator.{core::Iterator::current};
          #t213.{core::List::add}{Invariant}(#t214);
        }
      }
  } =>#t213;
  core::Set<core::int*>* set30 = block {
    final core::Set<core::int*>* #t215 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t216);
        }
      }
    #t215.{core::Set::add}{Invariant}(null);
  } =>#t215;
  core::Map<core::String*, core::int*>* map30 = block {
    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <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*>* #t218 = :sync-for-iterator.{core::Iterator::current};
          #t217.{core::Map::[]=}{Invariant}(#t218.{core::MapEntry::key}, #t218.{core::MapEntry::value});
        }
      }
    #t217.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t217;
  core::List<dynamic>* list31 = block {
    final core::List<dynamic>* #t219 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t220 = :sync-for-iterator.{core::Iterator::current};
          #t219.{core::List::add}{Invariant}(#t220);
        }
      }
  } =>#t219;
  core::Set<dynamic>* set31 = block {
    final core::Set<dynamic>* #t221 = new col::_CompactLinkedHashSet::•<dynamic>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t222 = :sync-for-iterator.{core::Iterator::current};
          #t221.{core::Set::add}{Invariant}(#t222);
        }
      }
    #t221.{core::Set::add}{Invariant}(null);
  } =>#t221;
  core::Map<core::String*, dynamic>* map31 = block {
    final core::Map<core::String*, dynamic>* #t223 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<core::String*, dynamic>* #t224 = :sync-for-iterator.{core::Iterator::current};
          #t223.{core::Map::[]=}{Invariant}(#t224.{core::MapEntry::key}, #t224.{core::MapEntry::value});
        }
      }
    #t223.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t223;
  core::List<core::List<core::int*>*>* list33 = block {
    final core::List<core::List<core::int*>*>* #t225 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t226 = :sync-for-iterator.{core::Iterator::current};
          #t225.{core::List::add}{Invariant}(#t226);
        }
      }
  } =>#t225;
  core::Set<core::List<core::int*>*>* set33 = block {
    final core::Set<core::List<core::int*>*>* #t227 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t228);
        }
      }
    #t227.{core::Set::add}{Invariant}(null);
  } =>#t227;
  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t229 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t230 = :sync-for-iterator.{core::Iterator::current};
          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}, #t230.{core::MapEntry::value});
        }
      }
    #t229.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t229;
  core::List<core::List<core::int*>*>* list40 = block {
    final core::List<core::List<core::int*>*>* #t231 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t232 = :sync-for-iterator.{core::Iterator::current};
        #t231.{core::List::add}{Invariant}(#t232);
      }
    }
  } =>#t231;
  core::Set<core::List<core::int*>*>* set40 = block {
    final core::Set<core::List<core::int*>*>* #t233 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::Set::add}{Invariant}(#t234);
      }
    }
    #t233.{core::Set::add}{Invariant}(null);
  } =>#t233;
  core::Map<core::String*, core::List<core::int*>*>* map40 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t235 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t236 = :sync-for-iterator.{core::Iterator::current};
        #t235.{core::Map::[]=}{Invariant}(#t236.{core::MapEntry::key}, #t236.{core::MapEntry::value});
      }
    }
    #t235.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t235;
  core::List<core::List<core::int*>*>* list41 = block {
    final core::List<core::List<core::int*>*>* #t237 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
        final core::Set<core::List<core::int*>*>* #t238 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
        #t238.{core::Set::add}{Invariant}(<core::int*>[]);
      } =>#t238).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t239 = :sync-for-iterator.{core::Iterator::current};
        #t237.{core::List::add}{Invariant}(#t239);
      }
    }
  } =>#t237;
  core::Set<core::List<core::int*>*>* set41 = block {
    final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
        final core::Set<core::List<core::int*>*>* #t241 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
        #t241.{core::Set::add}{Invariant}(<core::int*>[]);
      } =>#t241).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
        #t240.{core::Set::add}{Invariant}(#t242);
      }
    }
    #t240.{core::Set::add}{Invariant}(null);
  } =>#t240;
  core::List<core::List<core::int*>*>* list42 = block {
    final core::List<core::List<core::int*>*>* #t243 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t244 = :sync-for-iterator.{core::Iterator::current};
          #t243.{core::List::add}{Invariant}(#t244);
        }
      }
  } =>#t243;
  core::Set<core::List<core::int*>*>* set42 = block {
    final core::Set<core::List<core::int*>*>* #t245 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
          #t245.{core::Set::add}{Invariant}(#t246);
        }
      }
    #t245.{core::Set::add}{Invariant}(null);
  } =>#t245;
  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t247 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t248 = :sync-for-iterator.{core::Iterator::current};
          #t247.{core::Map::[]=}{Invariant}(#t248.{core::MapEntry::key}, #t248.{core::MapEntry::value});
        }
      }
    #t247.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t247;
  core::List<core::int*>* list50 = block {
    final core::List<core::int*>* #t249 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t250 = :sync-for-iterator.{core::Iterator::current};
        #t249.{core::List::add}{Invariant}(#t250);
      }
    }
  } =>#t249;
  core::Set<core::int*>* set50 = block {
    final core::Set<core::int*>* #t251 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t252 = :sync-for-iterator.{core::Iterator::current};
        #t251.{core::Set::add}{Invariant}(#t252);
      }
    }
    #t251.{core::Set::add}{Invariant}(null);
  } =>#t251;
  core::Map<core::String*, core::int*>* map50 = block {
    final core::Map<core::String*, core::int*>* #t253 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::int*>* #t254 = :sync-for-iterator.{core::Iterator::current};
        #t253.{core::Map::[]=}{Invariant}(#t254.{core::MapEntry::key}, #t254.{core::MapEntry::value});
      }
    }
    #t253.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t253;
  core::List<core::int*>* list51 = block {
    final core::List<core::int*>* #t255 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = ( block {
        final core::Set<core::int*>* #t256 = new col::_CompactLinkedHashSet::•<core::int*>();
      } =>#t256).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t257 = :sync-for-iterator.{core::Iterator::current};
        #t255.{core::List::add}{Invariant}(#t257);
      }
    }
  } =>#t255;
  core::Set<core::int*>* set51 = block {
    final core::Set<core::int*>* #t258 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = ( block {
        final core::Set<core::int*>* #t259 = new col::_CompactLinkedHashSet::•<core::int*>();
      } =>#t259).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t260 = :sync-for-iterator.{core::Iterator::current};
        #t258.{core::Set::add}{Invariant}(#t260);
      }
    }
    #t258.{core::Set::add}{Invariant}(null);
  } =>#t258;
  core::List<core::int*>* list52 = block {
    final core::List<core::int*>* #t261 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::int* #t262 = :sync-for-iterator.{core::Iterator::current};
          #t261.{core::List::add}{Invariant}(#t262);
        }
      }
  } =>#t261;
  core::Set<core::int*>* set52 = block {
    final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
          #t263.{core::Set::add}{Invariant}(#t264);
        }
      }
    #t263.{core::Set::add}{Invariant}(null);
  } =>#t263;
  core::List<core::List<core::int*>*>* list60 = block {
    final core::List<core::List<core::int*>*>* #t265 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t266 = :sync-for-iterator.{core::Iterator::current};
        #t265.{core::List::add}{Invariant}(#t266);
      }
    }
  } =>#t265;
  core::Set<core::List<core::int*>*>* set60 = block {
    final core::Set<core::List<core::int*>*>* #t267 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t268 = :sync-for-iterator.{core::Iterator::current};
        #t267.{core::Set::add}{Invariant}(#t268);
      }
    }
    #t267.{core::Set::add}{Invariant}(null);
  } =>#t267;
  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t269 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t270 = :sync-for-iterator.{core::Iterator::current};
        #t269.{core::Map::[]=}{Invariant}(#t270.{core::MapEntry::key}, #t270.{core::MapEntry::value});
      }
    }
    #t269.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t269;
  core::List<core::List<core::int*>*>* list61 = block {
    final core::List<core::List<core::int*>*>* #t271 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <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::List::add}{Invariant}(#t272);
        }
      }
  } =>#t271;
  core::Set<core::List<core::int*>*>* set61 = block {
    final core::Set<core::List<core::int*>*>* #t273 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::List<core::int*>* #t274 = :sync-for-iterator.{core::Iterator::current};
          #t273.{core::Set::add}{Invariant}(#t274);
        }
      }
    #t273.{core::Set::add}{Invariant}(null);
  } =>#t273;
  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t275 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <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*>*>* #t276 = :sync-for-iterator.{core::Iterator::current};
          #t275.{core::Map::[]=}{Invariant}(#t276.{core::MapEntry::key}, #t276.{core::MapEntry::value});
        }
      }
    #t275.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t275;
  core::List<core::List<core::int*>*>* list70 = block {
    final core::List<core::List<core::int*>*>* #t277 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t277.{core::List::add}{Invariant}(<core::int*>[]);
  } =>#t277;
  core::Set<core::List<core::int*>*>* set70 = block {
    final core::Set<core::List<core::int*>*>* #t278 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t278.{core::Set::add}{Invariant}(<core::int*>[]);
    #t278.{core::Set::add}{Invariant}(null);
  } =>#t278;
  core::Map<core::String*, core::List<core::int*>*>* map70 = 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,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t279.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
    #t279.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t279;
  core::List<core::List<core::int*>*>* list71 = block {
    final core::List<core::List<core::int*>*>* #t280 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t280.{core::List::add}{Invariant}(<core::int*>[]);
  } =>#t280;
  core::Set<core::List<core::int*>*>* set71 = block {
    final core::Set<core::List<core::int*>*>* #t281 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t281.{core::Set::add}{Invariant}(<core::int*>[]);
    #t281.{core::Set::add}{Invariant}(null);
  } =>#t281;
  core::Map<core::String*, core::List<core::int*>*>* map71 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t282 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t282.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
    #t282.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t282;
  core::List<core::num*>* list80 = block {
    final core::List<core::num*>* #t283 = <core::num*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t283.{core::List::add}{Invariant}(42);
      else
        #t283.{core::List::add}{Invariant}(3.14);
  } =>#t283;
  core::Set<core::num*>* set80 = block {
    final core::Set<core::num*>* #t284 = new col::_CompactLinkedHashSet::•<core::num*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t284.{core::Set::add}{Invariant}(42);
      else
        #t284.{core::Set::add}{Invariant}(3.14);
    #t284.{core::Set::add}{Invariant}(null);
  } =>#t284;
  core::Map<core::String*, core::num*>* map80 = block {
    final core::Map<core::String*, core::num*>* #t285 = <core::String*, core::num*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t285.{core::Map::[]=}{Invariant}("bar", 42);
      else
        #t285.{core::Map::[]=}{Invariant}("bar", 3.14);
    #t285.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t285;
  core::List<core::num*>* list81 = block {
    final core::List<core::num*>* #t286 = <core::num*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t287 = :sync-for-iterator.{core::Iterator::current};
          #t286.{core::List::add}{Invariant}(#t287);
        }
      }
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t288 = :sync-for-iterator.{core::Iterator::current};
          #t286.{core::List::add}{Invariant}(#t288);
        }
      }
  } =>#t286;
  core::Set<core::num*>* set81 = block {
    final core::Set<core::num*>* #t289 = new col::_CompactLinkedHashSet::•<core::num*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t290 = :sync-for-iterator.{core::Iterator::current};
          #t289.{core::Set::add}{Invariant}(#t290);
        }
      }
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t291 = :sync-for-iterator.{core::Iterator::current};
          #t289.{core::Set::add}{Invariant}(#t291);
        }
      }
    #t289.{core::Set::add}{Invariant}(null);
  } =>#t289;
  core::Map<core::String*, core::num*>* map81 = block {
    final core::Map<core::String*, core::num*>* #t292 = <core::String*, core::num*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<core::String*, core::num*>* #t293 = :sync-for-iterator.{core::Iterator::current};
          #t292.{core::Map::[]=}{Invariant}(#t293.{core::MapEntry::key}, #t293.{core::MapEntry::value});
        }
      }
      else {
        core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapStringDouble.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<core::String*, core::num*>* #t294 = :sync-for-iterator.{core::Iterator::current};
          #t292.{core::Map::[]=}{Invariant}(#t294.{core::MapEntry::key}, #t294.{core::MapEntry::value});
        }
      }
    #t292.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t292;
  core::List<dynamic>* list82 = block {
    final core::List<dynamic>* #t295 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t296 = :sync-for-iterator.{core::Iterator::current};
          #t295.{core::List::add}{Invariant}(#t296);
        }
      }
      else {
        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t297 = :sync-for-iterator.{core::Iterator::current};
          #t295.{core::List::add}{Invariant}(#t297);
        }
      }
  } =>#t295;
  core::Set<dynamic>* set82 = block {
    final core::Set<dynamic>* #t298 = new col::_CompactLinkedHashSet::•<dynamic>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t299 = :sync-for-iterator.{core::Iterator::current};
          #t298.{core::Set::add}{Invariant}(#t299);
        }
      }
      else {
        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final dynamic #t300 = :sync-for-iterator.{core::Iterator::current};
          #t298.{core::Set::add}{Invariant}(#t300);
        }
      }
    #t298.{core::Set::add}{Invariant}(null);
  } =>#t298;
  core::Map<dynamic, dynamic>* map82 = block {
    final core::Map<dynamic, dynamic>* #t301 = <dynamic, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<dynamic, dynamic>* #t302 = :sync-for-iterator.{core::Iterator::current};
          #t301.{core::Map::[]=}{Invariant}(#t302.{core::MapEntry::key}, #t302.{core::MapEntry::value});
        }
      }
      else {
        core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<dynamic, dynamic>* #t303 = :sync-for-iterator.{core::Iterator::current};
          #t301.{core::Map::[]=}{Invariant}(#t303.{core::MapEntry::key}, #t303.{core::MapEntry::value});
        }
      }
    #t301.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t301;
  core::List<core::num*>* list83 = block {
    final core::List<core::num*>* #t304 = <core::num*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t304.{core::List::add}{Invariant}(42);
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t305 = :sync-for-iterator.{core::Iterator::current};
          #t304.{core::List::add}{Invariant}(#t305);
        }
      }
  } =>#t304;
  core::Set<core::num*>* set83 = block {
    final core::Set<core::num*>* #t306 = new col::_CompactLinkedHashSet::•<core::num*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t307 = :sync-for-iterator.{core::Iterator::current};
          #t306.{core::Set::add}{Invariant}(#t307);
        }
      }
      else
        #t306.{core::Set::add}{Invariant}(3.14);
    #t306.{core::Set::add}{Invariant}(null);
  } =>#t306;
  core::Map<core::String*, core::num*>* map83 = block {
    final core::Map<core::String*, core::num*>* #t308 = <core::String*, core::num*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
        core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::MapEntry<core::String*, core::num*>* #t309 = :sync-for-iterator.{core::Iterator::current};
          #t308.{core::Map::[]=}{Invariant}(#t309.{core::MapEntry::key}, #t309.{core::MapEntry::value});
        }
      }
      else
        #t308.{core::Map::[]=}{Invariant}("bar", 3.14);
    #t308.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t308;
  core::List<core::int*>* list90 = block {
    final core::List<core::int*>* #t310 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t310.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
  } =>#t310;
  core::Set<core::int*>* set90 = block {
    final core::Set<core::int*>* #t311 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t311.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
    #t311.{core::Set::add}{Invariant}(null);
  } =>#t311;
  core::Map<core::String*, core::int*>* map90 = block {
    final core::Map<core::String*, core::int*>* #t312 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t312.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
    #t312.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t312;
  core::List<core::int*>* list91 = block {
    final core::List<core::int*>* #t313 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t314 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t315 = #t314 as{TypeError} core::int*;
          #t313.{core::List::add}{Invariant}(#t315);
        }
      }
    }
  } =>#t313;
  core::Set<core::int*>* set91 = block {
    final core::Set<core::int*>* #t316 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t317 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t318 = #t317 as{TypeError} core::int*;
          #t316.{core::Set::add}{Invariant}(#t318);
        }
      }
    }
    #t316.{core::Set::add}{Invariant}(null);
  } =>#t316;
  core::Map<core::String*, core::int*>* map91 = block {
    final core::Map<core::String*, core::int*>* #t319 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<dynamic, dynamic>* #t320 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::String* #t321 = #t320.{core::MapEntry::key} as{TypeError} core::String*;
          final core::int* #t322 = #t320.{core::MapEntry::value} as{TypeError} core::int*;
          #t319.{core::Map::[]=}{Invariant}(#t321, #t322);
        }
      }
    }
    #t319.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t319;
  core::List<core::int*>* list100 = block {
    final core::List<core::int*>* #t323 = <core::int*>[];
    for (final core::int* #t324 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
      #t323.{core::List::add}{Invariant}(42);
  } =>#t323;
  core::Set<core::int*>* set100 = block {
    final core::Set<core::int*>* #t325 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (final core::int* #t326 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
      #t325.{core::Set::add}{Invariant}(42);
  } =>#t325;
  core::Map<core::String*, core::int*>* map100 = block {
    final core::Map<core::String*, core::int*>* #t327 = <core::String*, core::int*>{};
    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
      #t327.{core::Map::[]=}{Invariant}("bar", 42);
  } =>#t327;
  core::List<core::int*>* list110 = block {
    final core::List<core::int*>* #t329 = <core::int*>[];
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t329.{core::List::add}{Invariant}(i);
      }
    }
  } =>#t329;
  core::Set<core::int*>* set110 = block {
    final core::Set<core::int*>* #t330 = new col::_CompactLinkedHashSet::•<core::int*>();
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t330.{core::Set::add}{Invariant}(i);
      }
    }
    #t330.{core::Set::add}{Invariant}(null);
  } =>#t330;
  core::Map<core::String*, core::int*>* map110 = block {
    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
    {
      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        core::int* i = :sync-for-iterator.{core::Iterator::current};
        #t331.{core::Map::[]=}{Invariant}("bar", i);
      }
    }
    #t331.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t331;
  core::List<core::int*>* list120 = block {
    final core::List<core::int*>* #t332 = <core::int*>[];
    {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        dynamic i = :sync-for-iterator.{core::Iterator::current};
        #t332.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
      }
    }
  } =>#t332;
  core::Set<core::int*>* set120 = block {
    final core::Set<core::int*>* #t333 = new col::_CompactLinkedHashSet::•<core::int*>();
    {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        dynamic i = :sync-for-iterator.{core::Iterator::current};
        #t333.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
      }
    }
    #t333.{core::Set::add}{Invariant}(null);
  } =>#t333;
  core::Map<core::String*, core::int*>* map120 = block {
    final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
    {
      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        dynamic i = :sync-for-iterator.{core::Iterator::current};
        #t334.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*);
      }
    }
    #t334.{core::Map::[]=}{Invariant}("baz", null);
  } =>#t334;
  core::List<core::int*>* list130 = block {
    final core::List<core::int*>* #t335 = <core::int*>[];
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t335.{core::List::add}{Invariant}(i);
  } =>#t335;
  core::Set<core::int*>* set130 = block {
    final core::Set<core::int*>* #t336 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t336.{core::Set::add}{Invariant}(i);
  } =>#t336;
  core::Map<core::int*, core::int*>* map130 = block {
    final core::Map<core::int*, core::int*>* #t337 = <core::int*, core::int*>{};
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t337.{core::Map::[]=}{Invariant}(i, i);
  } =>#t337;
}
static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
  core::bool* :is_sync = false;
  FutureOr<dynamic>* :return_value;
  (dynamic) →* dynamic :async_op_then;
  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
  core::int* :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  dynamic :saved_try_context_var1;
  dynamic :exception0;
  dynamic :stack_trace0;
  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
    try {
      #L1:
      {
        block {
          final core::List<core::int*>* #t338 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t338.{core::List::add}{Invariant}(let final<BottomType> #t339 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: 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*);
        } =>#t338;
        block {
          final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t340.{core::Set::add}{Invariant}(let final<BottomType> #t341 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: 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*);
          #t340.{core::Set::add}{Invariant}(null);
        } =>#t340;
        block {
          final core::Map<core::int*, core::int*>* #t342 = <core::int*, core::int*>{};
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: 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> #t344 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: 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*);
          #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: 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);
        } =>#t342;
        block {
          final core::List<core::int*>* #t346 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t347 = 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*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t348 = :sync-for-iterator.{core::Iterator::current};
              #t346.{core::List::add}{Invariant}(#t348);
            }
          }
        } =>#t346;
        block {
          final core::Set<core::int*>* #t349 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t350 = 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*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t351 = :sync-for-iterator.{core::Iterator::current};
              #t349.{core::Set::add}{Invariant}(#t351);
            }
          }
          #t349.{core::Set::add}{Invariant}(null);
        } =>#t349;
        block {
          final core::Map<core::int*, core::int*>* #t352 = <core::int*, core::int*>{};
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
            core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{let final<BottomType> #t353 = 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> #t354 = 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}.{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::MapEntry<core::int*, core::int*>* #t355 = :sync-for-iterator.{core::Iterator::current};
              #t352.{core::Map::[]=}{Invariant}(#t355.{core::MapEntry::key}, #t355.{core::MapEntry::value});
            }
          }
          #t352.{core::Map::[]=}{Invariant}(let final<BottomType> #t356 = 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);
        } =>#t352;
        block {
          final core::List<core::int*>* #t357 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t357.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                               ^");
        } =>#t357;
        block {
          final core::Set<core::int*>* #t358 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t358.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                               ^");
          #t358.{core::Set::add}{Invariant}(null);
        } =>#t358;
        <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                    ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                    ^": null};
        block {
          final core::List<core::String*>* #t359 = <core::String*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t359.{core::List::add}{Invariant}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                             ^" in 42 as{TypeError} core::String*);
            else
              #t359.{core::List::add}{Invariant}(let final<BottomType> #t361 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                     ^" in 3.14 as{TypeError} core::String*);
        } =>#t359;
        block {
          final core::Set<core::String*>* #t362 = new col::_CompactLinkedHashSet::•<core::String*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t363 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                             ^" in 42 as{TypeError} core::String*);
            else
              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                     ^" in 3.14 as{TypeError} core::String*);
          #t362.{core::Set::add}{Invariant}(null);
        } =>#t362;
        block {
          final core::Map<core::String*, core::String*>* #t365 = <core::String*, core::String*>{};
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t366 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                            ^" in 42 as{TypeError} core::String*);
            else
              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                           ^" in 3.14 as{TypeError} core::String*);
          #t365.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t365;
        block {
          final core::List<core::int*>* #t368 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t368.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                             ^");
            else
              #t368.{core::List::add}{Invariant}(42);
        } =>#t368;
        block {
          final core::Set<core::int*>* #t369 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t369.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                             ^");
            else
              #t369.{core::Set::add}{Invariant}(42);
          #t369.{core::Set::add}{Invariant}(null);
        } =>#t369;
        <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                     ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                     ^": null};
        block {
          final core::List<core::int*>* #t370 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t370.{core::List::add}{Invariant}(42);
            else
              #t370.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                     ^");
        } =>#t370;
        block {
          final core::Set<core::int*>* #t371 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
              #t371.{core::Set::add}{Invariant}(42);
            else
              #t371.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
 - 'Map' is from 'dart:core'.
  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                     ^");
          #t371.{core::Set::add}{Invariant}(null);
        } =>#t371;
        <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
                                                                                    ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
 - 'List' is from 'dart:core'.
  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
                                                                                    ^": null};
        final core::int* i = 0;
        block {
          final core::List<core::int*>* #t372 = <core::int*>[];
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t373 = :sync-for-iterator.{core::Iterator::current};
              {
                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
  <int>[for (i in <int>[1]) i];
             ^";
                #t372.{core::List::add}{Invariant}(i);
              }
            }
          }
        } =>#t372;
        block {
          final core::Set<core::int*>* #t374 = new col::_CompactLinkedHashSet::•<core::int*>();
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t375 = :sync-for-iterator.{core::Iterator::current};
              {
                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
  <int>{for (i in <int>[1]) i, null};
             ^";
                #t374.{core::Set::add}{Invariant}(i);
              }
            }
          }
          #t374.{core::Set::add}{Invariant}(null);
        } =>#t374;
        block {
          final core::Map<core::String*, core::int*>* #t376 = <core::String*, core::int*>{};
          {
            core::Iterator<core::int*>* :sync-for-iterator = <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:232:21: Error: Can't assign to the final variable 'i'.
\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
\t                   ^";
                #t376.{core::Map::[]=}{Invariant}("bar", i);
              }
            }
          }
          #t376.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t376;
        core::List<dynamic>* list10 = block {
          final core::List<dynamic>* #t378 = <dynamic>[];
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t379 = 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>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t378.{core::List::add}{Invariant}(i);
            }
          }
        } =>#t378;
        core::Set<dynamic>* set10 = block {
          final core::Set<dynamic>* #t380 = new col::_CompactLinkedHashSet::•<dynamic>();
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t381 = 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>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t380.{core::Set::add}{Invariant}(i);
            }
          }
          #t380.{core::Set::add}{Invariant}(null);
        } =>#t380;
        core::Map<core::String*, dynamic>* map10 = block {
          final core::Map<core::String*, dynamic>* #t382 = <core::String*, dynamic>{};
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = 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>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t382.{core::Map::[]=}{Invariant}("bar", i);
            }
          }
          #t382.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t382;
        core::List<core::int*>* list20 = block {
          final core::List<core::int*>* #t384 = <core::int*>[];
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t385 = 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> #t386 = 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*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t384.{core::List::add}{Invariant}(i);
            }
          }
        } =>#t384;
        core::Set<core::int*>* set20 = block {
          final core::Set<core::int*>* #t387 = new col::_CompactLinkedHashSet::•<core::int*>();
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t388 = 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> #t389 = 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*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t387.{core::Set::add}{Invariant}(i);
            }
          }
          #t387.{core::Set::add}{Invariant}(null);
        } =>#t387;
        core::Map<core::String*, core::int*>* map20 = block {
          final core::Map<core::String*, core::int*>* #t390 = <core::String*, core::int*>{};
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t391 = 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> #t392 = 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*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t390.{core::Map::[]=}{Invariant}("bar", i);
            }
          }
          #t390.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t390;
        final core::List<dynamic>* #t393 = <dynamic>[];
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t394 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'Stream' is from 'dart:async'.
  var list30 = [await for (var i in \"not stream\") i];
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L2:
            while (true) {
              dynamic #t395 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t396 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                dynamic i = :for-iterator.{asy::_StreamIterator::current};
                #t393.{core::List::add}{Invariant}(i);
              }
              else
                break #L2;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t397 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::List<dynamic>* list30 = block {} =>#t393;
        final core::Set<dynamic>* #t398 = new col::_CompactLinkedHashSet::•<dynamic>();
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t399 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'Stream' is from 'dart:async'.
  var set30 = {await for (var i in \"not stream\") i, null};
                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L3:
            while (true) {
              dynamic #t400 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                dynamic i = :for-iterator.{asy::_StreamIterator::current};
                #t398.{core::Set::add}{Invariant}(i);
              }
              else
                break #L3;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t402 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Set<dynamic>* set30 = block {
          #t398.{core::Set::add}{Invariant}(null);
        } =>#t398;
        final core::Map<core::String*, dynamic>* #t403 = <core::String*, dynamic>{};
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'Stream' is from 'dart:async'.
  var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L4:
            while (true) {
              dynamic #t405 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                dynamic i = :for-iterator.{asy::_StreamIterator::current};
                #t403.{core::Map::[]=}{Invariant}("bar", i);
              }
              else
                break #L4;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t407 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Map<core::String*, dynamic>* map30 = block {
          #t403.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t403;
        final core::List<core::int*>* #t408 = <core::int*>[];
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t409 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                ^" in "int" as{TypeError} core::int*]);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L5:
            while (true) {
              dynamic #t411 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t412 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                core::int* i = :for-iterator.{asy::_StreamIterator::current};
                #t408.{core::List::add}{Invariant}(i);
              }
              else
                break #L5;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t413 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::List<core::int*>* list40 = block {} =>#t408;
        final core::Set<core::int*>* #t414 = new col::_CompactLinkedHashSet::•<core::int*>();
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t415 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                               ^" in "int" as{TypeError} core::int*]);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L6:
            while (true) {
              dynamic #t417 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t418 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                core::int* i = :for-iterator.{asy::_StreamIterator::current};
                #t414.{core::Set::add}{Invariant}(i);
              }
              else
                break #L6;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t419 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Set<core::int*>* set40 = block {
          #t414.{core::Set::add}{Invariant}(null);
        } =>#t414;
        final core::Map<core::String*, core::int*>* #t420 = <core::String*, core::int*>{};
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t421 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t422 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                               ^" in "int" as{TypeError} core::int*]);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L7:
            while (true) {
              dynamic #t423 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t424 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
              if(_in::unsafeCast<core::bool>(:result)) {
                core::int* i = :for-iterator.{asy::_StreamIterator::current};
                #t420.{core::Map::[]=}{Invariant}("bar", i);
              }
              else
                break #L7;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t425 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Map<core::String*, core::int*>* map40 = block {
          #t420.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t420;
        core::List<core::int*>* list50 = block {
          final core::List<core::int*>* #t426 = <core::int*>[];
          for (; ; )
            #t426.{core::List::add}{Invariant}(42);
        } =>#t426;
        core::Set<core::int*>* set50 = block {
          final core::Set<core::int*>* #t427 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (; ; )
            #t427.{core::Set::add}{Invariant}(42);
          #t427.{core::Set::add}{Invariant}(null);
        } =>#t427;
        core::Map<core::String*, core::int*>* map50 = block {
          final core::Map<core::String*, core::int*>* #t428 = <core::String*, core::int*>{};
          for (; ; )
            #t428.{core::Map::[]=}{Invariant}("bar", 42);
          #t428.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t428;
        core::List<core::int*>* list60 = block {
          final core::List<core::int*>* #t429 = <core::int*>[];
          for (; let final<BottomType> #t430 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
  var list60 = [for (; \"not bool\";) 42];
                       ^" in "not bool" as{TypeError} core::bool*; )
            #t429.{core::List::add}{Invariant}(42);
        } =>#t429;
        core::Set<core::int*>* set60 = block {
          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (; let final<BottomType> #t432 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
  var set60 = {for (; \"not bool\";) 42, null};
                      ^" in "not bool" as{TypeError} core::bool*; )
            #t431.{core::Set::add}{Invariant}(42);
          #t431.{core::Set::add}{Invariant}(null);
        } =>#t431;
        core::Map<core::String*, core::int*>* map60 = block {
          final core::Map<core::String*, core::int*>* #t433 = <core::String*, core::int*>{};
          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                      ^" in "not bool" as{TypeError} core::bool*; )
            #t433.{core::Map::[]=}{Invariant}("bar", 42);
          #t433.{core::Map::[]=}{Invariant}("baz", null);
        } =>#t433;
      }
      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
    }
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_op.call();
  :is_sync = true;
  return :async_future;
}
static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
  block {
    final core::List<core::int*>* #t435 = <core::int*>[];
    await for (core::int* i in stream)
      #t435.{core::List::add}{Invariant}(i);
  } =>#t435;
  block {
    final core::Set<core::int*>* #t436 = new col::_CompactLinkedHashSet::•<core::int*>();
    await for (core::int* i in stream)
      #t436.{core::Set::add}{Invariant}(i);
  } =>#t436;
  block {
    final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
    await for (core::int* i in stream)
      #t437.{core::Map::[]=}{Invariant}("bar", i);
  } =>#t437;
}
static method testPromotion(self::A* a) → dynamic {
  core::List<core::int*>* list10 = block {
    final core::List<core::int*>* #t438 = <core::int*>[];
    if(a is self::B*)
      #t438.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo});
  } =>#t438;
  core::Set<core::int*>* set10 = block {
    final core::Set<core::int*>* #t439 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(a is self::B*)
      #t439.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo});
  } =>#t439;
  core::Map<core::int*, core::int*>* map10 = block {
    final core::Map<core::int*, core::int*>* #t440 = <core::int*, core::int*>{};
    if(a is self::B*)
      #t440.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
  } =>#t440;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
