[cfe] Report error on nullable spread access

Closes #43256

Change-Id: I15b0f5a9353566af290b78151f7889fa06a44406
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162002
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index e70561c..afd418a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -6831,6 +6831,15 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNullableSpreadError = messageNullableSpreadError;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNullableSpreadError = const MessageCode(
+    "NullableSpreadError",
+    message:
+        r"""An expression whose value can be 'null' must be null-checked before it can be dereferenced.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableSuperclassError =
     const Template<Message Function(String name)>(
         messageTemplate:
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index ec7bc61..7560e5b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1328,19 +1328,19 @@
     return const StatementInferenceResult();
   }
 
-  DartType getSpreadElementType(DartType spreadType, bool isNullAware) {
-    DartType typeBound = inferrer.resolveTypeParameter(spreadType);
-    if (inferrer.coreTypes.isNull(typeBound)) {
+  DartType getSpreadElementType(
+      DartType spreadType, DartType spreadTypeBound, bool isNullAware) {
+    if (inferrer.coreTypes.isNull(spreadTypeBound)) {
       if (inferrer.isNonNullableByDefault) {
         return isNullAware ? const NeverType(Nullability.nonNullable) : null;
       } else {
         return isNullAware ? inferrer.coreTypes.nullType : null;
       }
     }
-    if (typeBound is InterfaceType) {
+    if (spreadTypeBound is InterfaceType) {
       List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
           .getTypeArgumentsAsInstanceOf(
-              typeBound, inferrer.coreTypes.iterableClass);
+              spreadTypeBound, inferrer.coreTypes.iterableClass);
       if (supertypeArguments == null) {
         return null;
       }
@@ -1377,9 +1377,10 @@
       DartType spreadType = spreadResult.inferredType;
       inferredSpreadTypes[element.expression] = spreadType;
       Expression replacement = element;
+      DartType spreadTypeBound = inferrer.resolveTypeParameter(spreadType);
+      DartType spreadElementType = getSpreadElementType(
+          spreadType, spreadTypeBound, element.isNullAware);
       if (typeChecksNeeded) {
-        DartType spreadElementType =
-            getSpreadElementType(spreadType, element.isNullAware);
         if (spreadElementType == null) {
           if (inferrer.coreTypes
                   .isNull(inferrer.resolveTypeParameter(spreadType)) &&
@@ -1396,7 +1397,7 @@
                 element.expression.fileOffset,
                 1);
           }
-        } else if (spreadType is InterfaceType) {
+        } else if (spreadTypeBound is InterfaceType) {
           if (!inferrer.isAssignable(inferredTypeArgument, spreadElementType)) {
             replacement = inferrer.helper.buildProblem(
                 templateSpreadElementTypeMismatch.withArguments(
@@ -1405,13 +1406,18 @@
                     inferrer.isNonNullableByDefault),
                 element.expression.fileOffset,
                 1);
+          } else if (inferrer.isNonNullableByDefault &&
+              spreadType.isPotentiallyNullable &&
+              spreadType is! DynamicType &&
+              spreadType != inferrer.coreTypes.nullType &&
+              !element.isNullAware) {
+            replacement = inferrer.helper.buildProblem(
+                messageNullableSpreadError, element.expression.fileOffset, 1);
           }
         }
       }
       // Use 'dynamic' for error recovery.
-      element.elementType =
-          getSpreadElementType(spreadType, element.isNullAware) ??
-              const DynamicType();
+      element.elementType = spreadElementType ?? const DynamicType();
       return new ExpressionInferenceResult(element.elementType, replacement);
     } else if (element is IfElement) {
       DartType boolType =
@@ -1802,8 +1808,9 @@
           spreadType, entry.isNullAware, actualTypes, length);
       DartType actualKeyType = actualTypes[length];
       DartType actualValueType = actualTypes[length + 1];
+      DartType spreadTypeBound = inferrer.resolveTypeParameter(spreadType);
       DartType actualElementType =
-          getSpreadElementType(spreadType, entry.isNullAware);
+          getSpreadElementType(spreadType, spreadTypeBound, entry.isNullAware);
 
       MapEntry replacement = entry;
       if (typeChecksNeeded) {
@@ -1833,7 +1840,7 @@
                 new NullLiteral())
               ..fileOffset = entry.fileOffset;
           }
-        } else if (spreadType is InterfaceType) {
+        } else if (spreadTypeBound is InterfaceType) {
           Expression keyError;
           Expression valueError;
           if (!inferrer.isAssignable(inferredKeyType, actualKeyType)) {
@@ -1854,6 +1861,14 @@
                 entry.expression.fileOffset,
                 1);
           }
+          if (inferrer.isNonNullableByDefault &&
+              spreadType.isPotentiallyNullable &&
+              spreadType is! DynamicType &&
+              spreadType != inferrer.coreTypes.nullType &&
+              !entry.isNullAware) {
+            keyError = inferrer.helper.buildProblem(
+                messageNullableSpreadError, entry.expression.fileOffset, 1);
+          }
           if (keyError != null || valueError != null) {
             keyError ??= new NullLiteral();
             valueError ??= new NullLiteral();
@@ -2331,9 +2346,12 @@
         return new ExpressionInferenceResult(inferredType, setLiteral);
       }
       if (canBeSet && canBeMap && node.entries.isNotEmpty) {
-        Expression error = inferrer.helper.buildProblem(
-            messageCantDisambiguateNotEnoughInformation, node.fileOffset, 1);
-        return new ExpressionInferenceResult(const BottomType(), error);
+        Expression replacement = node;
+        if (!inferrer.isTopLevel) {
+          replacement = inferrer.helper.buildProblem(
+              messageCantDisambiguateNotEnoughInformation, node.fileOffset, 1);
+        }
+        return new ExpressionInferenceResult(const BottomType(), replacement);
       }
       if (!canBeSet && !canBeMap) {
         Expression replacement = node;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 1d44086..3844240 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -549,6 +549,8 @@
 NullablePropertyAccessError/example: Fail
 NullablePropertyAccessWarning/analyzerCode: Fail
 NullablePropertyAccessWarning/example: Fail
+NullableSpreadError/analyzerCode: Fail
+NullableSpreadError/example: Fail
 NullableSuperclassError/analyzerCode: Fail
 NullableSuperclassError/example: Fail
 NullableSuperclassWarning/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index b0efbdb..d568f05 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4090,6 +4090,9 @@
 NullableTearoffError:
   template: "Can't tear off method '#name' from a potentially null value."
 
+NullableSpreadError:
+  template: "An expression whose value can be 'null' must be null-checked before it can be dereferenced."
+
 ThrowingNotAssignableToObjectError:
   template: "Can't throw a value of '#type' since it is neither dynamic nor non-nullable."
 
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index c9f67ed..5882a79 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -793,6 +793,7 @@
 deprecated
 depromotes
 depth
+dereferenced
 derivation
 derive
 derived
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart b/pkg/front_end/testcases/nnbd/issue43256.dart
new file mode 100644
index 0000000..5c72c9e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+var i = 1;
+
+Map<int, String>? nullableMap = {1: "Let", 2: "it", 3: "be"};
+
+List<int>? nullableList = [1, 2, 3];
+
+dynamic dynamicMap = {1: "Let", 2: "it", 3: "be"};
+
+dynamic dynamicList = [1, 2, 3];
+
+var map1 = {
+  if (i > 0) ...nullableMap, // error
+  if (i > 0) ...dynamicMap, // ok
+  if (i > 0) ...nullableMap!, // ok
+};
+
+var set1 = {
+  0,
+  if (i > 0) ...nullableList, // error
+  if (i > 0) ...dynamicList, // ok
+  if (i > 0) ...nullableList! // ok
+};
+
+var list1 = [
+  if (i > 0) ...nullableList, // error
+  if (i > 0) ...dynamicList, // ok
+  if (i > 0) ...nullableList!, // ok
+];
+
+testMap<X extends dynamic, Y extends Map<int, String>?,
+    Z extends Map<int, String>>(X x, Y y, Z z) {
+  var map2 = {
+    if (i > 0) ...x, // error
+    if (i > 0) ...y, // error
+    if (i > 0) ...z, // ok
+    if (i > 0) ...y!, // ok
+  };
+}
+
+testIterables<X extends dynamic, Y extends List<int>?, Z extends List<int>>(
+    X x, Y y, Z z) {
+  var set2 = {
+    0,
+    if (i > 0) ...x, // error
+    if (i > 0) ...y, // error
+    if (i > 0) ...z, // ok
+  };
+  var list2 = [
+    if (i > 0) ...x, // error
+    if (i > 0) ...y, // error
+    if (i > 0) ...z, // ok
+  ];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.outline.expect
new file mode 100644
index 0000000..d008a19
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field core::int i;
+static field core::Map<core::int, core::String>? nullableMap;
+static field core::List<core::int>? nullableList;
+static field dynamic dynamicMap;
+static field dynamic dynamicList;
+static field core::Map<dynamic, dynamic> map1;
+static field core::Set<dynamic> set1;
+static field core::List<dynamic> list1;
+static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic
+  ;
+static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
new file mode 100644
index 0000000..0d7d725
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
@@ -0,0 +1,140 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableMap, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::int i = 1;
+static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field core::List<core::int>? nullableList = <core::int>[1, 2, 3];
+static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field dynamic dynamicList = <core::int>[1, 2, 3];
+static field core::Map<dynamic, dynamic> map1 = block {
+  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
+  if(self::i.{core::num::>}(0))
+    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableMap, // error
+                ^", null);
+  if(self::i.{core::num::>}(0))
+    for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries})
+      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+  if(self::i.{core::num::>}(0))
+    for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries})
+      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+} =>#t1;
+static field core::Set<dynamic> set1 = block {
+  final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
+  #t4.{core::Set::add}(0);
+  if(self::i.{core::num::>}(0))
+    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t5 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t4.{core::Set::add}(#t5);
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t6 in self::nullableList!)
+      #t4.{core::Set::add}(#t6);
+} =>#t4;
+static field core::List<dynamic> list1 = block {
+  final core::List<dynamic> #t7 = <dynamic>[];
+  if(self::i.{core::num::>}(0))
+    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t8 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t7.{core::List::add}(#t8);
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t9 in self::nullableList!)
+      #t7.{core::List::add}(#t9);
+} =>#t7;
+static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+  core::Map<dynamic, dynamic> map2 = block {
+    final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    if (i > 0) ...x, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      for (final core::MapEntry<dynamic, dynamic> #t11 in z.{core::Map::entries})
+        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+    if(self::i.{core::num::>}(0))
+      for (final core::MapEntry<dynamic, dynamic> #t12 in y!.{core::Map::entries})
+        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+  } =>#t10;
+}
+static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+  core::Set<dynamic> set2 = block {
+    final core::Set<dynamic> #t13 = col::LinkedHashSet::•<dynamic>();
+    #t13.{core::Set::add}(0);
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      for (final dynamic #t14 in z)
+        #t13.{core::Set::add}(#t14);
+  } =>#t13;
+  core::List<dynamic> list2 = block {
+    final core::List<dynamic> #t15 = <dynamic>[];
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      for (final dynamic #t16 in z)
+        #t15.{core::List::add}(#t16);
+  } =>#t15;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
new file mode 100644
index 0000000..ef9e80c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
@@ -0,0 +1,180 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableMap, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::int i = 1;
+static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field core::List<core::int>? nullableList = <core::int>[1, 2, 3];
+static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field dynamic dynamicList = <core::int>[1, 2, 3];
+static field core::Map<dynamic, dynamic> map1 = block {
+  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
+  if(self::i.{core::num::>}(0))
+    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableMap, // error
+                ^", null);
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current};
+      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current};
+      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+    }
+  }
+} =>#t1;
+static field core::Set<dynamic> set1 = block {
+  final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
+  #t4.{core::Set::add}(0);
+  if(self::i.{core::num::>}(0))
+    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
+      #t4.{core::Set::add}(#t5);
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+      #t4.{core::Set::add}(#t6);
+    }
+  }
+} =>#t4;
+static field core::List<dynamic> list1 = block {
+  final core::List<dynamic> #t7 = <dynamic>[];
+  if(self::i.{core::num::>}(0))
+    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+      #t7.{core::List::add}(#t8);
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
+      #t7.{core::List::add}(#t9);
+    }
+  }
+} =>#t7;
+static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+  core::Map<dynamic, dynamic> map2 = block {
+    final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    if (i > 0) ...x, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = z.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic> #t11 = :sync-for-iterator.{core::Iterator::current};
+        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+      }
+    }
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = y!.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic> #t12 = :sync-for-iterator.{core::Iterator::current};
+        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+      }
+    }
+  } =>#t10;
+}
+static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+  core::Set<dynamic> set2 = block {
+    final core::Set<dynamic> #t13 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t13.{core::Set::add}(0);
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
+        #t13.{core::Set::add}(#t14);
+      }
+    }
+  } =>#t13;
+  core::List<dynamic> list2 = block {
+    final core::List<dynamic> #t15 = <dynamic>[];
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
+        #t15.{core::List::add}(#t16);
+      }
+    }
+  } =>#t15;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline.expect
new file mode 100644
index 0000000..8fbb6e9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline.expect
@@ -0,0 +1,26 @@
+var i = 1;
+Map<int, String>? nullableMap = {1: "Let", 2: "it", 3: "be"};
+List<int>? nullableList = [1, 2, 3];
+dynamic dynamicMap = {1: "Let", 2: "it", 3: "be"};
+dynamic dynamicList = [1, 2, 3];
+var map1 = {
+  if (i > 0) ...nullableMap,
+  if (i > 0) ...dynamicMap,
+  if (i > 0) ...nullableMap!,
+};
+var set1 = {
+  0,
+  if (i > 0) ...nullableList,
+  if (i > 0) ...dynamicList,
+  if (i > 0) ...nullableList!
+};
+var list1 = [
+  if (i > 0) ...nullableList,
+  if (i > 0) ...dynamicList,
+  if (i > 0) ...nullableList!,
+];
+testMap<X extends dynamic, Y extends Map<int, String>?,
+    Z extends Map<int, String>>(X x, Y y, Z z) {}
+testIterables<X extends dynamic, Y extends List<int>?, Z extends List<int>>(
+    X x, Y y, Z z) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..51913c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.textual_outline_modelled.expect
@@ -0,0 +1,26 @@
+List<int>? nullableList = [1, 2, 3];
+Map<int, String>? nullableMap = {1: "Let", 2: "it", 3: "be"};
+dynamic dynamicList = [1, 2, 3];
+dynamic dynamicMap = {1: "Let", 2: "it", 3: "be"};
+main() {}
+testIterables<X extends dynamic, Y extends List<int>?, Z extends List<int>>(
+    X x, Y y, Z z) {}
+testMap<X extends dynamic, Y extends Map<int, String>?,
+    Z extends Map<int, String>>(X x, Y y, Z z) {}
+var i = 1;
+var list1 = [
+  if (i > 0) ...nullableList,
+  if (i > 0) ...dynamicList,
+  if (i > 0) ...nullableList!,
+];
+var map1 = {
+  if (i > 0) ...nullableMap,
+  if (i > 0) ...dynamicMap,
+  if (i > 0) ...nullableMap!,
+};
+var set1 = {
+  0,
+  if (i > 0) ...nullableList,
+  if (i > 0) ...dynamicList,
+  if (i > 0) ...nullableList!
+};
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
new file mode 100644
index 0000000..0d7d725
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
@@ -0,0 +1,140 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableMap, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::int i = 1;
+static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field core::List<core::int>? nullableList = <core::int>[1, 2, 3];
+static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field dynamic dynamicList = <core::int>[1, 2, 3];
+static field core::Map<dynamic, dynamic> map1 = block {
+  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
+  if(self::i.{core::num::>}(0))
+    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableMap, // error
+                ^", null);
+  if(self::i.{core::num::>}(0))
+    for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries})
+      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+  if(self::i.{core::num::>}(0))
+    for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries})
+      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+} =>#t1;
+static field core::Set<dynamic> set1 = block {
+  final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
+  #t4.{core::Set::add}(0);
+  if(self::i.{core::num::>}(0))
+    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t5 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t4.{core::Set::add}(#t5);
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t6 in self::nullableList!)
+      #t4.{core::Set::add}(#t6);
+} =>#t4;
+static field core::List<dynamic> list1 = block {
+  final core::List<dynamic> #t7 = <dynamic>[];
+  if(self::i.{core::num::>}(0))
+    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t8 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t7.{core::List::add}(#t8);
+  if(self::i.{core::num::>}(0))
+    for (final dynamic #t9 in self::nullableList!)
+      #t7.{core::List::add}(#t9);
+} =>#t7;
+static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+  core::Map<dynamic, dynamic> map2 = block {
+    final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    if (i > 0) ...x, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      for (final core::MapEntry<dynamic, dynamic> #t11 in z.{core::Map::entries})
+        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+    if(self::i.{core::num::>}(0))
+      for (final core::MapEntry<dynamic, dynamic> #t12 in y!.{core::Map::entries})
+        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+  } =>#t10;
+}
+static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+  core::Set<dynamic> set2 = block {
+    final core::Set<dynamic> #t13 = col::LinkedHashSet::•<dynamic>();
+    #t13.{core::Set::add}(0);
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      for (final dynamic #t14 in z)
+        #t13.{core::Set::add}(#t14);
+  } =>#t13;
+  core::List<dynamic> list2 = block {
+    final core::List<dynamic> #t15 = <dynamic>[];
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      for (final dynamic #t16 in z)
+        #t15.{core::List::add}(#t16);
+  } =>#t15;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
new file mode 100644
index 0000000..ef9e80c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
@@ -0,0 +1,180 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableMap, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::int i = 1;
+static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field core::List<core::int>? nullableList = <core::int>[1, 2, 3];
+static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field dynamic dynamicList = <core::int>[1, 2, 3];
+static field core::Map<dynamic, dynamic> map1 = block {
+  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
+  if(self::i.{core::num::>}(0))
+    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableMap, // error
+                ^", null);
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current};
+      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current};
+      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+    }
+  }
+} =>#t1;
+static field core::Set<dynamic> set1 = block {
+  final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
+  #t4.{core::Set::add}(0);
+  if(self::i.{core::num::>}(0))
+    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
+      #t4.{core::Set::add}(#t5);
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+      #t4.{core::Set::add}(#t6);
+    }
+  }
+} =>#t4;
+static field core::List<dynamic> list1 = block {
+  final core::List<dynamic> #t7 = <dynamic>[];
+  if(self::i.{core::num::>}(0))
+    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^");
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+      #t7.{core::List::add}(#t8);
+    }
+  }
+  if(self::i.{core::num::>}(0)) {
+    core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
+      #t7.{core::List::add}(#t9);
+    }
+  }
+} =>#t7;
+static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+  core::Map<dynamic, dynamic> map2 = block {
+    final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    if (i > 0) ...x, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0))
+      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^", null);
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = z.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic> #t11 = :sync-for-iterator.{core::Iterator::current};
+        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+      }
+    }
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = y!.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic> #t12 = :sync-for-iterator.{core::Iterator::current};
+        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+      }
+    }
+  } =>#t10;
+}
+static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+  core::Set<dynamic> set2 = block {
+    final core::Set<dynamic> #t13 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t13.{core::Set::add}(0);
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
+        #t13.{core::Set::add}(#t14);
+      }
+    }
+  } =>#t13;
+  core::List<dynamic> list2 = block {
+    final core::List<dynamic> #t15 = <dynamic>[];
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^");
+    if(self::i.{core::num::>}(0))
+      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^");
+    if(self::i.{core::num::>}(0)) {
+      core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
+        #t15.{core::List::add}(#t16);
+      }
+    }
+  } =>#t15;
+}
+static method main() → dynamic {}