[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 {}