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}(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}(42);
    #t2.{core::Set::add}(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::[]=}("bar", 42);
    #t3.{core::Map::[]=}("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}(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}(dynVar);
    #t5.{core::Set::add}(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::[]=}("bar", dynVar);
    #t6.{core::Map::[]=}("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}(<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}(<core::int*>[42]);
    #t8.{core::Set::add}(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::[]=}("bar", <core::int*>[42]);
    #t9.{core::Map::[]=}("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}(#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}(#t13);
      }
    }
    #t12.{core::Set::add}(null);
  } =>#t12;
  core::Map<core::String*, core::int*>* map20 = block {
    final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
      }
    }
    #t14.{core::Map::[]=}("baz", null);
  } =>#t14;
  core::List<dynamic>* list21 = block {
    final core::List<dynamic>* #t16 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t19);
      }
    }
    #t18.{core::Set::add}(null);
  } =>#t18;
  core::Map<core::String*, dynamic>* map21 = block {
    final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
      }
    }
    #t20.{core::Map::[]=}("baz", null);
  } =>#t20;
  core::List<core::List<core::int*>*>* list22 = block {
    final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t25);
      }
    }
    #t24.{core::Set::add}(null);
  } =>#t24;
  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
      }
    }
    #t26.{core::Map::[]=}("baz", null);
  } =>#t26;
  core::List<core::int*>* list30 = block {
    final core::List<core::int*>* #t28 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t31);
        }
      }
    #t30.{core::Set::add}(null);
  } =>#t30;
  core::Map<core::String*, core::int*>* map30 = block {
    final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
        }
      }
    #t32.{core::Map::[]=}("baz", null);
  } =>#t32;
  core::List<dynamic>* list31 = block {
    final core::List<dynamic>* #t34 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t37);
        }
      }
    #t36.{core::Set::add}(null);
  } =>#t36;
  core::Map<core::String*, dynamic>* map31 = block {
    final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
        }
      }
    #t38.{core::Map::[]=}("baz", null);
  } =>#t38;
  core::List<core::List<core::int*>*>* list33 = block {
    final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t43);
        }
      }
    #t42.{core::Set::add}(null);
  } =>#t42;
  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
        }
      }
    #t44.{core::Map::[]=}("baz", null);
  } =>#t44;
  core::List<core::List<core::int*>*>* list40 = block {
    final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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}(#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}(#t49);
      }
    }
    #t48.{core::Set::add}(null);
  } =>#t48;
  core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
  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 = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
        #t50.{core::List::add}(#t53);
      }
    }
  } =>#t50;
  core::Set<core::List<core::int*>*>* set41 = block {
    final core::Set<core::List<core::int*>*>* #t54 = 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 = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
        #t54.{core::Set::add}(#t57);
      }
    }
    #t54.{core::Set::add}(null);
  } =>#t54;
  core::List<core::List<core::int*>*>* list42 = block {
    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t59);
        }
      }
  } =>#t58;
  core::Set<core::List<core::int*>*>* set42 = block {
    final core::Set<core::List<core::int*>*>* #t60 = 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*>* #t61 = :sync-for-iterator.{core::Iterator::current};
          #t60.{core::Set::add}(#t61);
        }
      }
    #t60.{core::Set::add}(null);
  } =>#t60;
  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t63 = :sync-for-iterator.{core::Iterator::current};
          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
        }
      }
    #t62.{core::Map::[]=}("baz", null);
  } =>#t62;
  core::List<core::int*>* list50 = block {
    final core::List<core::int*>* #t64 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t65);
      }
    }
  } =>#t64;
  core::Set<core::int*>* set50 = block {
    final core::Set<core::int*>* #t66 = 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* #t67 = :sync-for-iterator.{core::Iterator::current};
        #t66.{core::Set::add}(#t67);
      }
    }
    #t66.{core::Set::add}(null);
  } =>#t66;
  core::Map<core::String*, core::int*>* map50 = block {
    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>* #t69 = :sync-for-iterator.{core::Iterator::current};
        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
      }
    }
    #t68.{core::Map::[]=}("baz", null);
  } =>#t68;
  core::List<core::int*>* list51 = block {
    final core::List<core::int*>* #t70 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
        #t70.{core::List::add}(#t72);
      }
    }
  } =>#t70;
  core::Set<core::int*>* set51 = block {
    final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
        #t73.{core::Set::add}(#t75);
      }
    }
    #t73.{core::Set::add}(null);
  } =>#t73;
  core::List<core::int*>* list52 = block {
    final core::List<core::int*>* #t76 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t77);
        }
      }
  } =>#t76;
  core::Set<core::int*>* set52 = block {
    final core::Set<core::int*>* #t78 = 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* #t79 = :sync-for-iterator.{core::Iterator::current};
          #t78.{core::Set::add}(#t79);
        }
      }
    #t78.{core::Set::add}(null);
  } =>#t78;
  core::Map<core::String*, core::int*>* map52 = block {
    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>* #t81 = :sync-for-iterator.{core::Iterator::current};
          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
        }
      }
    #t80.{core::Map::[]=}("baz", null);
  } =>#t80;
  core::List<core::List<core::int*>*>* list60 = block {
    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t83);
      }
    }
  } =>#t82;
  core::Set<core::List<core::int*>*>* set60 = block {
    final core::Set<core::List<core::int*>*>* #t84 = 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*>* #t85 = :sync-for-iterator.{core::Iterator::current};
        #t84.{core::Set::add}(#t85);
      }
    }
    #t84.{core::Set::add}(null);
  } =>#t84;
  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t87 = :sync-for-iterator.{core::Iterator::current};
        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
      }
    }
    #t86.{core::Map::[]=}("baz", null);
  } =>#t86;
  core::List<core::List<core::int*>*>* list61 = block {
    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t89);
        }
      }
  } =>#t88;
  core::Set<core::List<core::int*>*>* set61 = block {
    final core::Set<core::List<core::int*>*>* #t90 = 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*>* #t91 = :sync-for-iterator.{core::Iterator::current};
          #t90.{core::Set::add}(#t91);
        }
      }
    #t90.{core::Set::add}(null);
  } =>#t90;
  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t93 = :sync-for-iterator.{core::Iterator::current};
          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
        }
      }
    #t92.{core::Map::[]=}("baz", null);
  } =>#t92;
  core::List<core::List<core::int*>*>* list70 = block {
    final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t94.{core::List::add}(<core::int*>[]);
  } =>#t94;
  core::Set<core::List<core::int*>*>* set70 = 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*)
      #t95.{core::Set::add}(<core::int*>[]);
    #t95.{core::Set::add}(null);
  } =>#t95;
  core::List<core::List<core::int*>*>* list71 = block {
    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
        #t96.{core::List::add}(<core::int*>[]);
  } =>#t96;
  core::Set<core::List<core::int*>*>* set71 = block {
    final core::Set<core::List<core::int*>*>* #t97 = 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*)
        #t97.{core::Set::add}(<core::int*>[]);
    #t97.{core::Set::add}(null);
  } =>#t97;
  core::List<core::num*>* list80 = block {
    final core::List<core::num*>* #t98 = <core::num*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t98.{core::List::add}(42);
    else
      #t98.{core::List::add}(3.14);
  } =>#t98;
  core::Set<core::num*>* set80 = block {
    final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t99.{core::Set::add}(42);
    else
      #t99.{core::Set::add}(3.14);
    #t99.{core::Set::add}(null);
  } =>#t99;
  core::Map<core::String*, core::num*>* map80 = block {
    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t100.{core::Map::[]=}("bar", 42);
    else
      #t100.{core::Map::[]=}("bar", 3.14);
    #t100.{core::Map::[]=}("baz", null);
  } =>#t100;
  core::List<core::num*>* list81 = block {
    final core::List<core::num*>* #t101 = <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* #t102 = :sync-for-iterator.{core::Iterator::current};
        #t101.{core::List::add}(#t102);
      }
    }
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t103 = :sync-for-iterator.{core::Iterator::current};
        #t101.{core::List::add}(#t103);
      }
    }
  } =>#t101;
  core::Set<core::num*>* set81 = block {
    final core::Set<core::num*>* #t104 = 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* #t105 = :sync-for-iterator.{core::Iterator::current};
        #t104.{core::Set::add}(#t105);
      }
    }
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t106 = :sync-for-iterator.{core::Iterator::current};
        #t104.{core::Set::add}(#t106);
      }
    }
    #t104.{core::Set::add}(null);
  } =>#t104;
  core::Map<core::String*, core::num*>* map81 = block {
    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>* #t108 = :sync-for-iterator.{core::Iterator::current};
        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{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*>* #t109 = :sync-for-iterator.{core::Iterator::current};
        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
      }
    }
    #t107.{core::Map::[]=}("baz", null);
  } =>#t107;
  core::List<dynamic>* list82 = block {
    final core::List<dynamic>* #t110 = <dynamic>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t111 = :sync-for-iterator.{core::Iterator::current};
        #t110.{core::List::add}(#t111);
      }
    }
    else {
      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 #t112 = :sync-for-iterator.{core::Iterator::current};
        #t110.{core::List::add}(#t112);
      }
    }
  } =>#t110;
  core::Set<dynamic>* set82 = block {
    final core::Set<dynamic>* #t113 = 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 #t114 = :sync-for-iterator.{core::Iterator::current};
        #t113.{core::Set::add}(#t114);
      }
    }
    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};
        #t113.{core::Set::add}(#t115);
      }
    }
    #t113.{core::Set::add}(null);
  } =>#t113;
  core::Set<dynamic>* map82 = block {
    final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t116.{core::Set::add}(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 #t117 = :sync-for-iterator.{core::Iterator::current};
        #t116.{core::Set::add}(#t117);
      }
    }
    #t116.{core::Set::add}(null);
  } =>#t116;
  core::List<core::num*>* list83 = block {
    final core::List<core::num*>* #t118 = <core::num*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t118.{core::List::add}(42);
    else {
      core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
        #t118.{core::List::add}(#t119);
      }
    }
  } =>#t118;
  core::Set<core::num*>* set83 = block {
    final core::Set<core::num*>* #t120 = 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* #t121 = :sync-for-iterator.{core::Iterator::current};
        #t120.{core::Set::add}(#t121);
      }
    }
    else
      #t120.{core::Set::add}(3.14);
    #t120.{core::Set::add}(null);
  } =>#t120;
  core::Map<core::String*, core::num*>* map83 = block {
    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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*>* #t123 = :sync-for-iterator.{core::Iterator::current};
        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
      }
    }
    else
      #t122.{core::Map::[]=}("bar", 3.14);
    #t122.{core::Map::[]=}("baz", null);
  } =>#t122;
  core::List<core::int*>* list90 = block {
    final core::List<core::int*>* #t124 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
  } =>#t124;
  core::Set<core::int*>* set90 = block {
    final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
    #t125.{core::Set::add}(null);
  } =>#t125;
  core::Map<core::String*, core::int*>* map90 = block {
    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t126.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
    #t126.{core::Map::[]=}("baz", null);
  } =>#t126;
  core::List<core::int*>* list91 = block {
    final core::List<core::int*>* #t127 = <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 #t128 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t129 = #t128 as{TypeError} core::int*;
          #t127.{core::List::add}(#t129);
        }
      }
    }
  } =>#t127;
  core::Set<core::int*>* set91 = block {
    final core::Set<core::int*>* #t130 = 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 #t131 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t132 = #t131 as{TypeError} core::int*;
          #t130.{core::Set::add}(#t132);
        }
      }
    }
    #t130.{core::Set::add}(null);
  } =>#t130;
  core::Map<core::String*, core::int*>* map91 = block {
    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,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>* #t134 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
          final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
          #t133.{core::Map::[]=}(#t135, #t136);
        }
      }
    }
    #t133.{core::Map::[]=}("baz", null);
  } =>#t133;
  core::List<core::int*>* list100 = block {
    final core::List<core::int*>* #t137 = <core::int*>[];
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t137.{core::List::add}(42);
  } =>#t137;
  core::Set<core::int*>* set100 = block {
    final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t138.{core::Set::add}(42);
  } =>#t138;
  core::Map<core::int*, core::int*>* map100 = block {
    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
    if(dynVar as{TypeError,ForDynamic} core::bool*)
      #t139.{core::Map::[]=}(42, 42);
  } =>#t139;
}
static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
  block {
    final core::List<core::int*>* #t140 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t140.{core::List::add}(let final<BottomType> #t141 = 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*);
  } =>#t140;
  block {
    final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t142.{core::Set::add}(let final<BottomType> #t143 = 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*);
    #t142.{core::Set::add}(null);
  } =>#t142;
  block {
    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = 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*);
    #t144.{core::Map::[]=}("baz", null);
  } =>#t144;
  block {
    final core::List<core::int*>* #t146 = <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> #t147 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                               ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t148 = :sync-for-iterator.{core::Iterator::current};
        #t146.{core::List::add}(#t148);
      }
    }
  } =>#t146;
  block {
    final core::Set<core::int*>* #t149 = 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> #t150 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                               ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t151 = :sync-for-iterator.{core::Iterator::current};
        #t149.{core::Set::add}(#t151);
      }
    }
    #t149.{core::Set::add}(null);
  } =>#t149;
  block {
    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::MapEntry<core::String*, core::int*>* #t154 = :sync-for-iterator.{core::Iterator::current};
        #t152.{core::Map::[]=}(#t154.{core::MapEntry::key}, #t154.{core::MapEntry::value});
      }
    }
    #t152.{core::Map::[]=}("baz", null);
  } =>#t152;
  block {
    final core::List<core::int*>* #t155 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t155.{core::List::add}(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];
                              ^");
  } =>#t155;
  block {
    final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t156.{core::Set::add}(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};
                              ^");
    #t156.{core::Set::add}(null);
  } =>#t156;
  <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*>* #t157 = <core::String*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t157.{core::List::add}(let final<BottomType> #t158 = 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
      #t157.{core::List::add}(let final<BottomType> #t159 = 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*);
  } =>#t157;
  block {
    final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t160.{core::Set::add}(let final<BottomType> #t161 = 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
      #t160.{core::Set::add}(let final<BottomType> #t162 = 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*);
    #t160.{core::Set::add}(null);
  } =>#t160;
  block {
    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = 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
      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = 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*);
    #t163.{core::Map::[]=}("baz", null);
  } =>#t163;
  block {
    final core::List<core::int*>* #t166 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t166.{core::List::add}(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
      #t166.{core::List::add}(42);
  } =>#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}(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
      #t167.{core::Set::add}(42);
    #t167.{core::Set::add}(null);
  } =>#t167;
  <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*>* #t168 = <core::int*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t168.{core::List::add}(42);
    else
      #t168.{core::List::add}(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];
                                      ^");
  } =>#t168;
  block {
    final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t169.{core::Set::add}(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
      #t169.{core::Set::add}(42);
    #t169.{core::Set::add}(null);
  } =>#t169;
  <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, core::Null?>* map12 = <dynamic, core::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, core::Null?>* map13 = <dynamic, core::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*>* #t170 = <core::int*>[];
    if(let final<BottomType> #t171 = 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*)
      #t170.{core::List::add}(42);
  } =>#t170;
  core::Set<core::int*>* set20 = block {
    final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(let final<BottomType> #t173 = 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*)
      #t172.{core::Set::add}(42);
  } =>#t172;
  core::Map<core::int*, core::int*>* map30 = block {
    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
    if(let final<BottomType> #t175 = 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*)
      #t174.{core::Map::[]=}(42, 42);
  } =>#t174;
  core::List<core::String*>* list40 = block {
    final core::List<core::String*>* #t176 = <core::String*>[];
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t176.{core::List::add}(let final<BottomType> #t177 = 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
      #t176.{core::List::add}(let final<BottomType> #t178 = 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*);
  } =>#t176;
  core::Set<core::String*>* set40 = block {
    final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t179.{core::Set::add}(let final<BottomType> #t180 = 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
      #t179.{core::Set::add}(let final<BottomType> #t181 = 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*);
  } =>#t179;
  core::Map<core::String*, core::int*>* map40 = block {
    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t182.{core::Map::[]=}(let final<BottomType> #t183 = 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
      #t182.{core::Map::[]=}(let final<BottomType> #t184 = 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);
  } =>#t182;
  core::Map<core::int*, core::String*>* map41 = block {
    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = 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
      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = 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*);
  } =>#t185;
}
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*>* #t188 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t188.{core::List::add}(42);
  } =>#t188;
  core::Set<core::int*>* set10 = block {
    final core::Set<core::int*>* #t189 = 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))
      #t189.{core::Set::add}(42);
    #t189.{core::Set::add}(null);
  } =>#t189;
  core::Map<core::String*, core::int*>* map10 = block {
    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t190.{core::Map::[]=}("bar", 42);
    #t190.{core::Map::[]=}("baz", null);
  } =>#t190;
  core::List<dynamic>* list11 = block {
    final core::List<dynamic>* #t191 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t191.{core::List::add}(dynVar);
  } =>#t191;
  core::Set<dynamic>* set11 = block {
    final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t192.{core::Set::add}(dynVar);
    #t192.{core::Set::add}(null);
  } =>#t192;
  core::Map<core::String*, dynamic>* map11 = block {
    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t193.{core::Map::[]=}("bar", dynVar);
    #t193.{core::Map::[]=}("baz", null);
  } =>#t193;
  core::List<core::List<core::int*>*>* list12 = block {
    final core::List<core::List<core::int*>*>* #t194 = <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::List::add}(<core::int*>[42]);
  } =>#t194;
  core::Set<core::List<core::int*>*>* set12 = block {
    final core::Set<core::List<core::int*>*>* #t195 = 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))
      #t195.{core::Set::add}(<core::int*>[42]);
    #t195.{core::Set::add}(null);
  } =>#t195;
  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <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))
      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
    #t196.{core::Map::[]=}("baz", null);
  } =>#t196;
  core::List<core::int*>* list20 = block {
    final core::List<core::int*>* #t197 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t198);
      }
    }
  } =>#t197;
  core::Set<core::int*>* set20 = block {
    final core::Set<core::int*>* #t199 = 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* #t200 = :sync-for-iterator.{core::Iterator::current};
        #t199.{core::Set::add}(#t200);
      }
    }
    #t199.{core::Set::add}(null);
  } =>#t199;
  core::Map<core::String*, core::int*>* map20 = block {
    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t202 = :sync-for-iterator.{core::Iterator::current};
        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
      }
    }
    #t201.{core::Map::[]=}("baz", null);
  } =>#t201;
  core::List<dynamic>* list21 = block {
    final core::List<dynamic>* #t203 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t204);
      }
    }
  } =>#t203;
  core::Set<dynamic>* set21 = block {
    final core::Set<dynamic>* #t205 = 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 #t206 = :sync-for-iterator.{core::Iterator::current};
        #t205.{core::Set::add}(#t206);
      }
    }
    #t205.{core::Set::add}(null);
  } =>#t205;
  core::Map<core::String*, dynamic>* map21 = block {
    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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>* #t208 = :sync-for-iterator.{core::Iterator::current};
        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
      }
    }
    #t207.{core::Map::[]=}("baz", null);
  } =>#t207;
  core::List<core::List<core::int*>*>* list22 = block {
    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t210);
      }
    }
  } =>#t209;
  core::Set<core::List<core::int*>*>* set22 = block {
    final core::Set<core::List<core::int*>*>* #t211 = 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*>* #t212 = :sync-for-iterator.{core::Iterator::current};
        #t211.{core::Set::add}(#t212);
      }
    }
    #t211.{core::Set::add}(null);
  } =>#t211;
  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t214 = :sync-for-iterator.{core::Iterator::current};
        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
      }
    }
    #t213.{core::Map::[]=}("baz", null);
  } =>#t213;
  core::List<core::int*>* list30 = block {
    final core::List<core::int*>* #t215 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t216);
        }
      }
  } =>#t215;
  core::Set<core::int*>* set30 = block {
    final core::Set<core::int*>* #t217 = 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* #t218 = :sync-for-iterator.{core::Iterator::current};
          #t217.{core::Set::add}(#t218);
        }
      }
    #t217.{core::Set::add}(null);
  } =>#t217;
  core::Map<core::String*, core::int*>* map30 = block {
    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t220 = :sync-for-iterator.{core::Iterator::current};
          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
        }
      }
    #t219.{core::Map::[]=}("baz", null);
  } =>#t219;
  core::List<dynamic>* list31 = block {
    final core::List<dynamic>* #t221 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t222);
        }
      }
  } =>#t221;
  core::Set<dynamic>* set31 = block {
    final core::Set<dynamic>* #t223 = 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 #t224 = :sync-for-iterator.{core::Iterator::current};
          #t223.{core::Set::add}(#t224);
        }
      }
    #t223.{core::Set::add}(null);
  } =>#t223;
  core::Map<core::String*, dynamic>* map31 = block {
    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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>* #t226 = :sync-for-iterator.{core::Iterator::current};
          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
        }
      }
    #t225.{core::Map::[]=}("baz", null);
  } =>#t225;
  core::List<core::List<core::int*>*>* list33 = block {
    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t228);
        }
      }
  } =>#t227;
  core::Set<core::List<core::int*>*>* set33 = block {
    final core::Set<core::List<core::int*>*>* #t229 = 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*>* #t230 = :sync-for-iterator.{core::Iterator::current};
          #t229.{core::Set::add}(#t230);
        }
      }
    #t229.{core::Set::add}(null);
  } =>#t229;
  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t232 = :sync-for-iterator.{core::Iterator::current};
          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
        }
      }
    #t231.{core::Map::[]=}("baz", null);
  } =>#t231;
  core::List<core::List<core::int*>*>* list40 = block {
    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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::List::add}(#t234);
      }
    }
  } =>#t233;
  core::Set<core::List<core::int*>*>* set40 = block {
    final core::Set<core::List<core::int*>*>* #t235 = 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*>* #t236 = :sync-for-iterator.{core::Iterator::current};
        #t235.{core::Set::add}(#t236);
      }
    }
    #t235.{core::Set::add}(null);
  } =>#t235;
  core::Map<core::String*, core::List<core::int*>*>* map40 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t238 = :sync-for-iterator.{core::Iterator::current};
        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
      }
    }
    #t237.{core::Map::[]=}("baz", null);
  } =>#t237;
  core::List<core::List<core::int*>*>* list41 = block {
    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
        #t239.{core::List::add}(#t242);
      }
    }
  } =>#t239;
  core::Set<core::List<core::int*>*>* set41 = block {
    final core::Set<core::List<core::int*>*>* #t243 = 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 = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
        #t243.{core::Set::add}(#t246);
      }
    }
    #t243.{core::Set::add}(null);
  } =>#t243;
  core::List<core::List<core::int*>*>* list42 = block {
    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t248 = :sync-for-iterator.{core::Iterator::current};
          #t247.{core::List::add}(#t248);
        }
      }
  } =>#t247;
  core::Set<core::List<core::int*>*>* set42 = block {
    final core::Set<core::List<core::int*>*>* #t249 = 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*>* #t250 = :sync-for-iterator.{core::Iterator::current};
          #t249.{core::Set::add}(#t250);
        }
      }
    #t249.{core::Set::add}(null);
  } =>#t249;
  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t252 = :sync-for-iterator.{core::Iterator::current};
          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
        }
      }
    #t251.{core::Map::[]=}("baz", null);
  } =>#t251;
  core::List<core::int*>* list50 = block {
    final core::List<core::int*>* #t253 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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* #t254 = :sync-for-iterator.{core::Iterator::current};
        #t253.{core::List::add}(#t254);
      }
    }
  } =>#t253;
  core::Set<core::int*>* set50 = block {
    final core::Set<core::int*>* #t255 = 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* #t256 = :sync-for-iterator.{core::Iterator::current};
        #t255.{core::Set::add}(#t256);
      }
    }
    #t255.{core::Set::add}(null);
  } =>#t255;
  core::Map<core::String*, core::int*>* map50 = block {
    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t258 = :sync-for-iterator.{core::Iterator::current};
        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
      }
    }
    #t257.{core::Map::[]=}("baz", null);
  } =>#t257;
  core::List<core::int*>* list51 = block {
    final core::List<core::int*>* #t259 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
        #t259.{core::List::add}(#t261);
      }
    }
  } =>#t259;
  core::Set<core::int*>* set51 = block {
    final core::Set<core::int*>* #t262 = 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 = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
        #t262.{core::Set::add}(#t264);
      }
    }
    #t262.{core::Set::add}(null);
  } =>#t262;
  core::List<core::int*>* list52 = block {
    final core::List<core::int*>* #t265 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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* #t266 = :sync-for-iterator.{core::Iterator::current};
          #t265.{core::List::add}(#t266);
        }
      }
  } =>#t265;
  core::Set<core::int*>* set52 = block {
    final core::Set<core::int*>* #t267 = 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* #t268 = :sync-for-iterator.{core::Iterator::current};
          #t267.{core::Set::add}(#t268);
        }
      }
    #t267.{core::Set::add}(null);
  } =>#t267;
  core::List<core::List<core::int*>*>* list60 = block {
    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t270 = :sync-for-iterator.{core::Iterator::current};
        #t269.{core::List::add}(#t270);
      }
    }
  } =>#t269;
  core::Set<core::List<core::int*>*>* set60 = block {
    final core::Set<core::List<core::int*>*>* #t271 = 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*>* #t272 = :sync-for-iterator.{core::Iterator::current};
        #t271.{core::Set::add}(#t272);
      }
    }
    #t271.{core::Set::add}(null);
  } =>#t271;
  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t274 = :sync-for-iterator.{core::Iterator::current};
        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
      }
    }
    #t273.{core::Map::[]=}("baz", null);
  } =>#t273;
  core::List<core::List<core::int*>*>* list61 = block {
    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t276 = :sync-for-iterator.{core::Iterator::current};
          #t275.{core::List::add}(#t276);
        }
      }
  } =>#t275;
  core::Set<core::List<core::int*>*>* set61 = block {
    final core::Set<core::List<core::int*>*>* #t277 = 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*>* #t278 = :sync-for-iterator.{core::Iterator::current};
          #t277.{core::Set::add}(#t278);
        }
      }
    #t277.{core::Set::add}(null);
  } =>#t277;
  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>*>* #t280 = :sync-for-iterator.{core::Iterator::current};
          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
        }
      }
    #t279.{core::Map::[]=}("baz", null);
  } =>#t279;
  core::List<core::List<core::int*>*>* list70 = block {
    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t281.{core::List::add}(<core::int*>[]);
  } =>#t281;
  core::Set<core::List<core::int*>*>* set70 = block {
    final core::Set<core::List<core::int*>*>* #t282 = 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))
      #t282.{core::Set::add}(<core::int*>[]);
    #t282.{core::Set::add}(null);
  } =>#t282;
  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <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))
      #t283.{core::Map::[]=}("bar", <core::int*>[]);
    #t283.{core::Map::[]=}("baz", null);
  } =>#t283;
  core::List<core::List<core::int*>*>* list71 = block {
    final core::List<core::List<core::int*>*>* #t284 = <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*)
        #t284.{core::List::add}(<core::int*>[]);
  } =>#t284;
  core::Set<core::List<core::int*>*>* set71 = block {
    final core::Set<core::List<core::int*>*>* #t285 = 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*)
        #t285.{core::Set::add}(<core::int*>[]);
    #t285.{core::Set::add}(null);
  } =>#t285;
  core::Map<core::String*, core::List<core::int*>*>* map71 = block {
    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <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*)
        #t286.{core::Map::[]=}("bar", <core::int*>[]);
    #t286.{core::Map::[]=}("baz", null);
  } =>#t286;
  core::List<core::num*>* list80 = block {
    final core::List<core::num*>* #t287 = <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*)
        #t287.{core::List::add}(42);
      else
        #t287.{core::List::add}(3.14);
  } =>#t287;
  core::Set<core::num*>* set80 = block {
    final core::Set<core::num*>* #t288 = 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*)
        #t288.{core::Set::add}(42);
      else
        #t288.{core::Set::add}(3.14);
    #t288.{core::Set::add}(null);
  } =>#t288;
  core::Map<core::String*, core::num*>* map80 = block {
    final core::Map<core::String*, core::num*>* #t289 = <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*)
        #t289.{core::Map::[]=}("bar", 42);
      else
        #t289.{core::Map::[]=}("bar", 3.14);
    #t289.{core::Map::[]=}("baz", null);
  } =>#t289;
  core::List<core::num*>* list81 = block {
    final core::List<core::num*>* #t290 = <core::num*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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* #t291 = :sync-for-iterator.{core::Iterator::current};
          #t290.{core::List::add}(#t291);
        }
      }
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t292 = :sync-for-iterator.{core::Iterator::current};
          #t290.{core::List::add}(#t292);
        }
      }
  } =>#t290;
  core::Set<core::num*>* set81 = block {
    final core::Set<core::num*>* #t293 = 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* #t294 = :sync-for-iterator.{core::Iterator::current};
          #t293.{core::Set::add}(#t294);
        }
      }
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t295 = :sync-for-iterator.{core::Iterator::current};
          #t293.{core::Set::add}(#t295);
        }
      }
    #t293.{core::Set::add}(null);
  } =>#t293;
  core::Map<core::String*, core::num*>* map81 = block {
    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t297 = :sync-for-iterator.{core::Iterator::current};
          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{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*>* #t298 = :sync-for-iterator.{core::Iterator::current};
          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
        }
      }
    #t296.{core::Map::[]=}("baz", null);
  } =>#t296;
  core::List<dynamic>* list82 = block {
    final core::List<dynamic>* #t299 = <dynamic>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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 #t300 = :sync-for-iterator.{core::Iterator::current};
          #t299.{core::List::add}(#t300);
        }
      }
      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 #t301 = :sync-for-iterator.{core::Iterator::current};
          #t299.{core::List::add}(#t301);
        }
      }
  } =>#t299;
  core::Set<dynamic>* set82 = block {
    final core::Set<dynamic>* #t302 = 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 #t303 = :sync-for-iterator.{core::Iterator::current};
          #t302.{core::Set::add}(#t303);
        }
      }
      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 #t304 = :sync-for-iterator.{core::Iterator::current};
          #t302.{core::Set::add}(#t304);
        }
      }
    #t302.{core::Set::add}(null);
  } =>#t302;
  core::Map<dynamic, dynamic>* map82 = block {
    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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>* #t306 = :sync-for-iterator.{core::Iterator::current};
          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{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>* #t307 = :sync-for-iterator.{core::Iterator::current};
          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
        }
      }
    #t305.{core::Map::[]=}("baz", null);
  } =>#t305;
  core::List<core::num*>* list83 = block {
    final core::List<core::num*>* #t308 = <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*)
        #t308.{core::List::add}(42);
      else {
        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
          final core::num* #t309 = :sync-for-iterator.{core::Iterator::current};
          #t308.{core::List::add}(#t309);
        }
      }
  } =>#t308;
  core::Set<core::num*>* set83 = block {
    final core::Set<core::num*>* #t310 = 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* #t311 = :sync-for-iterator.{core::Iterator::current};
          #t310.{core::Set::add}(#t311);
        }
      }
      else
        #t310.{core::Set::add}(3.14);
    #t310.{core::Set::add}(null);
  } =>#t310;
  core::Map<core::String*, core::num*>* map83 = block {
    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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*>* #t313 = :sync-for-iterator.{core::Iterator::current};
          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
        }
      }
      else
        #t312.{core::Map::[]=}("bar", 3.14);
    #t312.{core::Map::[]=}("baz", null);
  } =>#t312;
  core::List<core::int*>* list90 = block {
    final core::List<core::int*>* #t314 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
  } =>#t314;
  core::Set<core::int*>* set90 = block {
    final core::Set<core::int*>* #t315 = 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))
      #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
    #t315.{core::Set::add}(null);
  } =>#t315;
  core::Map<core::String*, core::int*>* map90 = block {
    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
      #t316.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
    #t316.{core::Map::[]=}("baz", null);
  } =>#t316;
  core::List<core::int*>* list91 = block {
    final core::List<core::int*>* #t317 = <core::int*>[];
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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 #t318 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t319 = #t318 as{TypeError} core::int*;
          #t317.{core::List::add}(#t319);
        }
      }
    }
  } =>#t317;
  core::Set<core::int*>* set91 = block {
    final core::Set<core::int*>* #t320 = 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 #t321 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int* #t322 = #t321 as{TypeError} core::int*;
          #t320.{core::Set::add}(#t322);
        }
      }
    }
    #t320.{core::Set::add}(null);
  } =>#t320;
  core::Map<core::String*, core::int*>* map91 = block {
    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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>* #t324 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
          final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
          #t323.{core::Map::[]=}(#t325, #t326);
        }
      }
    }
    #t323.{core::Map::[]=}("baz", null);
  } =>#t323;
  core::List<core::int*>* list100 = block {
    final core::List<core::int*>* #t327 = <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::List::add}(42);
  } =>#t327;
  core::Set<core::int*>* set100 = block {
    final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
      #t329.{core::Set::add}(42);
  } =>#t329;
  core::Map<core::String*, core::int*>* map100 = block {
    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
      #t331.{core::Map::[]=}("bar", 42);
  } =>#t331;
  core::List<core::int*>* list110 = block {
    final core::List<core::int*>* #t333 = <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};
        #t333.{core::List::add}(i);
      }
    }
  } =>#t333;
  core::Set<core::int*>* set110 = block {
    final core::Set<core::int*>* #t334 = 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};
        #t334.{core::Set::add}(i);
      }
    }
    #t334.{core::Set::add}(null);
  } =>#t334;
  core::Map<core::String*, core::int*>* map110 = block {
    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
    {
      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};
        #t335.{core::Map::[]=}("bar", i);
      }
    }
    #t335.{core::Map::[]=}("baz", null);
  } =>#t335;
  core::List<core::int*>* list120 = block {
    final core::List<core::int*>* #t336 = <core::int*>[];
    {
      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};
        #t336.{core::List::add}(i as{TypeError,ForDynamic} core::int*);
      }
    }
  } =>#t336;
  core::Set<core::int*>* set120 = block {
    final core::Set<core::int*>* #t337 = 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};
        #t337.{core::Set::add}(i as{TypeError,ForDynamic} core::int*);
      }
    }
    #t337.{core::Set::add}(null);
  } =>#t337;
  core::Map<core::String*, core::int*>* map120 = block {
    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
    {
      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};
        #t338.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*);
      }
    }
    #t338.{core::Map::[]=}("baz", null);
  } =>#t338;
  core::List<core::int*>* list130 = block {
    final core::List<core::int*>* #t339 = <core::int*>[];
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t339.{core::List::add}(i);
  } =>#t339;
  core::Set<core::int*>* set130 = block {
    final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t340.{core::Set::add}(i);
  } =>#t340;
  core::Map<core::int*, core::int*>* map130 = block {
    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
      #t341.{core::Map::[]=}(i, i);
  } =>#t341;
}
static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
  FutureOr<dynamic>* :return_value;
  dynamic :async_stack_trace;
  (dynamic) →* dynamic :async_op_then;
  (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
  core::int* :await_jump_var = 0;
  dynamic :await_ctx_var;
  dynamic :saved_try_context_var0;
  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*>* #t342 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t342.{core::List::add}(let final<BottomType> #t343 = 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*);
        } =>#t342;
        block {
          final core::Set<core::int*>* #t344 = 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))
            #t344.{core::Set::add}(let final<BottomType> #t345 = 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*);
          #t344.{core::Set::add}(null);
        } =>#t344;
        block {
          final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t346.{core::Map::[]=}(let final<BottomType> #t347 = 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> #t348 = 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*);
          #t346.{core::Map::[]=}(let final<BottomType> #t349 = 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);
        } =>#t346;
        block {
          final core::List<core::int*>* #t350 = <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> #t351 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t352 = :sync-for-iterator.{core::Iterator::current};
              #t350.{core::List::add}(#t352);
            }
          }
        } =>#t350;
        block {
          final core::Set<core::int*>* #t353 = 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> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::int* #t355 = :sync-for-iterator.{core::Iterator::current};
              #t353.{core::Set::add}(#t355);
            }
          }
          #t353.{core::Set::add}(null);
        } =>#t353;
        block {
          final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,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> #t357 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              final core::MapEntry<core::int*, core::int*>* #t359 = :sync-for-iterator.{core::Iterator::current};
              #t356.{core::Map::[]=}(#t359.{core::MapEntry::key}, #t359.{core::MapEntry::value});
            }
          }
          #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                    ^" in "baz" as{TypeError} core::int*, null);
        } =>#t356;
        block {
          final core::List<core::int*>* #t361 = <core::int*>[];
          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
            #t361.{core::List::add}(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];
                                               ^");
        } =>#t361;
        block {
          final core::Set<core::int*>* #t362 = 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))
            #t362.{core::Set::add}(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};
                                               ^");
          #t362.{core::Set::add}(null);
        } =>#t362;
        <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*>* #t363 = <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*)
              #t363.{core::List::add}(let final<BottomType> #t364 = 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
              #t363.{core::List::add}(let final<BottomType> #t365 = 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*);
        } =>#t363;
        block {
          final core::Set<core::String*>* #t366 = 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*)
              #t366.{core::Set::add}(let final<BottomType> #t367 = 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
              #t366.{core::Set::add}(let final<BottomType> #t368 = 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*);
          #t366.{core::Set::add}(null);
        } =>#t366;
        block {
          final core::Map<core::String*, core::String*>* #t369 = <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*)
              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = 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
              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = 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*);
          #t369.{core::Map::[]=}("baz", null);
        } =>#t369;
        block {
          final core::List<core::int*>* #t372 = <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*)
              #t372.{core::List::add}(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
              #t372.{core::List::add}(42);
        } =>#t372;
        block {
          final core::Set<core::int*>* #t373 = 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*)
              #t373.{core::Set::add}(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
              #t373.{core::Set::add}(42);
          #t373.{core::Set::add}(null);
        } =>#t373;
        <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*>* #t374 = <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*)
              #t374.{core::List::add}(42);
            else
              #t374.{core::List::add}(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];
                                                                     ^");
        } =>#t374;
        block {
          final core::Set<core::int*>* #t375 = 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*)
              #t375.{core::Set::add}(42);
            else
              #t375.{core::Set::add}(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};
                                                                     ^");
          #t375.{core::Set::add}(null);
        } =>#t375;
        <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*>* #t376 = <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:230:14: Error: Can't assign to the final variable 'i'.
  <int>[for (i in <int>[1]) i];
             ^";
                #t376.{core::List::add}(i);
              }
            }
          }
        } =>#t376;
        block {
          final core::Set<core::int*>* #t378 = 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* #t379 = :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};
             ^";
                #t378.{core::Set::add}(i);
              }
            }
          }
          #t378.{core::Set::add}(null);
        } =>#t378;
        block {
          final core::Map<core::String*, core::int*>* #t380 = <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* #t381 = :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                   ^";
                #t380.{core::Map::[]=}("bar", i);
              }
            }
          }
          #t380.{core::Map::[]=}("baz", null);
        } =>#t380;
        core::List<dynamic>* list10 = block {
          final core::List<dynamic>* #t382 = <dynamic>[];
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 - 'Iterable' is from 'dart:core'.
  var list10 = [for (var i in \"not iterable\") i];
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t382.{core::List::add}(i);
            }
          }
        } =>#t382;
        core::Set<dynamic>* set10 = block {
          final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 - 'Iterable' is from 'dart:core'.
  var set10 = {for (var i in \"not iterable\") i, null};
                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t384.{core::Set::add}(i);
            }
          }
          #t384.{core::Set::add}(null);
        } =>#t384;
        core::Map<core::String*, dynamic>* map10 = block {
          final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
          {
            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 - 'Iterable' is from 'dart:core'.
  var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              dynamic i = :sync-for-iterator.{core::Iterator::current};
              #t386.{core::Map::[]=}("bar", i);
            }
          }
          #t386.{core::Map::[]=}("baz", null);
        } =>#t386;
        core::List<core::int*>* list20 = block {
          final core::List<core::int*>* #t388 = <core::int*>[];
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var list20 = [for (int i in [\"not\", \"int\"]) i];
                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var list20 = [for (int i in [\"not\", \"int\"]) i];
                                      ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t388.{core::List::add}(i);
            }
          }
        } =>#t388;
        core::Set<core::int*>* set20 = block {
          final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                     ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t391.{core::Set::add}(i);
            }
          }
          #t391.{core::Set::add}(null);
        } =>#t391;
        core::Map<core::String*, core::int*>* map20 = block {
          final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
          {
            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                     ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
              core::int* i = :sync-for-iterator.{core::Iterator::current};
              #t394.{core::Map::[]=}("bar", i);
            }
          }
          #t394.{core::Map::[]=}("baz", null);
        } =>#t394;
        final core::List<dynamic>* #t397 = <dynamic>[];
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t398 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L2:
            while (true) {
              dynamic #t399 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t400 = 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};
                #t397.{core::List::add}(i);
              }
              else
                break #L2;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::List<dynamic>* list30 = block {} =>#t397;
        final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L3:
            while (true) {
              dynamic #t404 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t405 = 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};
                #t402.{core::Set::add}(i);
              }
              else
                break #L3;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Set<dynamic>* set30 = block {
          #t402.{core::Set::add}(null);
        } =>#t402;
        final core::Map<core::String*, dynamic>* #t407 = <core::String*, dynamic>{};
        {
          asy::Stream<dynamic>* :stream = let final<BottomType> #t408 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
          try
            #L4:
            while (true) {
              dynamic #t409 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t410 = 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};
                #t407.{core::Map::[]=}("bar", i);
              }
              else
                break #L4;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t411 = 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 {
          #t407.{core::Map::[]=}("baz", null);
        } =>#t407;
        final core::List<core::int*>* #t412 = <core::int*>[];
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t413 = 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> #t414 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L5:
            while (true) {
              dynamic #t415 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t416 = 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};
                #t412.{core::List::add}(i);
              }
              else
                break #L5;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::List<core::int*>* list40 = block {} =>#t412;
        final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = 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> #t420 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L6:
            while (true) {
              dynamic #t421 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t422 = 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};
                #t418.{core::Set::add}(i);
              }
              else
                break #L6;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
              :result;
            }
        }
        core::Set<core::int*>* set40 = block {
          #t418.{core::Set::add}(null);
        } =>#t418;
        final core::Map<core::String*, core::int*>* #t424 = <core::String*, core::int*>{};
        {
          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t425 = 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> #t426 = 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::_asyncStarListenHelper(:stream, :async_op);
          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
          try
            #L7:
            while (true) {
              dynamic #t427 = asy::_asyncStarMoveNextHelper(:stream);
              [yield] let dynamic #t428 = 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};
                #t424.{core::Map::[]=}("bar", i);
              }
              else
                break #L7;
            }
          finally
            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
              [yield] let dynamic #t429 = 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 {
          #t424.{core::Map::[]=}("baz", null);
        } =>#t424;
        core::List<core::int*>* list50 = block {
          final core::List<core::int*>* #t430 = <core::int*>[];
          for (; ; )
            #t430.{core::List::add}(42);
        } =>#t430;
        core::Set<core::int*>* set50 = block {
          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (; ; )
            #t431.{core::Set::add}(42);
          #t431.{core::Set::add}(null);
        } =>#t431;
        core::Map<core::String*, core::int*>* map50 = block {
          final core::Map<core::String*, core::int*>* #t432 = <core::String*, core::int*>{};
          for (; ; )
            #t432.{core::Map::[]=}("bar", 42);
          #t432.{core::Map::[]=}("baz", null);
        } =>#t432;
        core::List<core::int*>* list60 = block {
          final core::List<core::int*>* #t433 = <core::int*>[];
          for (; let final<BottomType> #t434 = 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*; )
            #t433.{core::List::add}(42);
        } =>#t433;
        core::Set<core::int*>* set60 = block {
          final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
          for (; let final<BottomType> #t436 = 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*; )
            #t435.{core::Set::add}(42);
          #t435.{core::Set::add}(null);
        } =>#t435;
        core::Map<core::String*, core::int*>* map60 = block {
          final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
          for (; let final<BottomType> #t438 = 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*; )
            #t437.{core::Map::[]=}("bar", 42);
          #t437.{core::Map::[]=}("baz", null);
        } =>#t437;
      }
      asy::_completeOnAsyncReturn(:async_completer, :return_value);
      return;
    }
    on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
    }
  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
  return :async_completer.{asy::Completer::future};
}
static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
  block {
    final core::List<core::int*>* #t439 = <core::int*>[];
    await for (core::int* i in stream)
      #t439.{core::List::add}(i);
  } =>#t439;
  block {
    final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
    await for (core::int* i in stream)
      #t440.{core::Set::add}(i);
  } =>#t440;
  block {
    final core::Map<core::String*, core::int*>* #t441 = <core::String*, core::int*>{};
    await for (core::int* i in stream)
      #t441.{core::Map::[]=}("bar", i);
  } =>#t441;
}
static method testPromotion(self::A* a) → dynamic {
  core::List<core::int*>* list10 = block {
    final core::List<core::int*>* #t442 = <core::int*>[];
    if(a is self::B*)
      #t442.{core::List::add}(a{self::B*}.{self::B::foo});
  } =>#t442;
  core::Set<core::int*>* set10 = block {
    final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
    if(a is self::B*)
      #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
  } =>#t443;
  core::Map<core::int*, core::int*>* map10 = block {
    final core::Map<core::int*, core::int*>* #t444 = <core::int*, core::int*>{};
    if(a is self::B*)
      #t444.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
  } =>#t444;
}
static method main() → dynamic {}

constants  {
  #C1 = null
}
