Reland "[cfe] Disambiguate between sets and maps with spreads"

This is a reland of b817b274c2f9ef1f3232f95aa15efbec9f6b3b80

Original change's description:
> [cfe] Disambiguate between sets and maps with spreads
> 
> Change-Id: I8da95178d0864dd0d59232a902cdb142be7f135e
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/95649
> Reviewed-by: Kevin Millikin <kmillikin@google.com>

Change-Id: Id22b7513230f6410dc2af5146d292fc7fc47a0aa
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96130
Reviewed-by: Régis Crelier <regis@google.com>
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index a47e394..c12729c 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -520,6 +520,28 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeCantDisambiguateAmbiguousInformation =
+    messageCantDisambiguateAmbiguousInformation;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageCantDisambiguateAmbiguousInformation = const MessageCode(
+    "CantDisambiguateAmbiguousInformation",
+    message:
+        r"""Both Iterable and Map spread elements encountered in ambiguous literal.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeCantDisambiguateNotEnoughInformation =
+    messageCantDisambiguateNotEnoughInformation;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageCantDisambiguateNotEnoughInformation = const MessageCode(
+    "CantDisambiguateNotEnoughInformation",
+    message:
+        r"""Not enough type information to disambiguate between literal set and literal map.""",
+    tip:
+        r"""Try providing type arguments for the literal explicitly to disambiguate it.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCantInferPackagesFromManyInputs =
     messageCantInferPackagesFromManyInputs;
 
@@ -8234,6 +8256,13 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSpreadElement = messageSpreadElement;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSpreadElement = const MessageCode("SpreadElement",
+    severity: Severity.context, message: r"""Iterable spread.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
@@ -8267,6 +8296,15 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSpreadMapElement = messageSpreadMapElement;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSpreadMapElement = const MessageCode(
+    "SpreadMapElement",
+    severity: Severity.context,
+    message: r"""Map spread.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
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 5deb216..a81d124 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -817,18 +817,22 @@
         (node.valueType is ImplicitTypeArgument));
     bool inferenceNeeded = node.keyType is ImplicitTypeArgument;
     KernelLibraryBuilder library = inferrer.library;
+    bool typeContextIsMap = false;
+    bool typeContextIsIterable = false;
     if (library != null &&
         library.loader.target.enableSetLiterals &&
-        inferenceNeeded &&
-        node.entries.isEmpty) {
+        inferenceNeeded) {
       // Ambiguous set/map literal
       DartType context =
           inferrer.typeSchemaEnvironment.unfutureType(typeContext);
       if (context is InterfaceType) {
-        if (inferrer.classHierarchy.isSubtypeOf(
-                context.classNode, inferrer.coreTypes.iterableClass) &&
-            !inferrer.classHierarchy
-                .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass)) {
+        typeContextIsMap = inferrer.classHierarchy
+            .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass);
+        typeContextIsIterable = inferrer.classHierarchy
+            .isSubtypeOf(context.classNode, inferrer.coreTypes.iterableClass);
+        if (node.entries.isEmpty &&
+            typeContextIsIterable &&
+            !typeContextIsMap) {
           // Set literal
           SetLiteralJudgment setLiteral = new SetLiteralJudgment([],
               typeArgument: const ImplicitTypeArgument(), isConst: node.isConst)
@@ -867,13 +871,24 @@
         cachedValues[i] = node.entries[i].value;
       }
     }
+    int iterableSpreadOffset = null;
+    int mapSpreadOffset = null;
+    int mapEntryOffset = null;
     if (inferenceNeeded || typeChecksNeeded) {
+      DartType spreadTypeContext = const UnknownType();
+      if (typeContextIsIterable && !typeContextIsMap) {
+        spreadTypeContext = inferrer.typeSchemaEnvironment
+            .getTypeAsInstanceOf(typeContext, inferrer.coreTypes.iterableClass);
+      } else if (!typeContextIsIterable && typeContextIsMap) {
+        spreadTypeContext =
+            new InterfaceType(inferrer.coreTypes.mapClass, inferredTypes);
+      }
       for (int i = 0; i < node.entries.length; ++i) {
         MapEntry entry = node.entries[i];
         if (entry is SpreadMapEntry) {
           DartType spreadMapEntryType = inferrer.inferExpression(
               entry.expression,
-              new InterfaceType(inferrer.coreTypes.mapClass, inferredTypes),
+              spreadTypeContext,
               inferenceNeeded || typeChecksNeeded,
               isVoidAllowed: true);
           if (inferenceNeeded) {
@@ -883,6 +898,19 @@
           if (typeChecksNeeded) {
             spreadMapEntryTypes[i] = spreadMapEntryType;
           }
+
+          bool isMap = inferrer.typeSchemaEnvironment.isSubtypeOf(
+              spreadMapEntryType, inferrer.coreTypes.mapClass.rawType);
+          bool isSet = inferrer.typeSchemaEnvironment.isSubtypeOf(
+              spreadMapEntryType, inferrer.coreTypes.iterableClass.rawType);
+
+          if (isMap && !isSet) {
+            mapSpreadOffset = entry.expression.fileOffset;
+          }
+          if (!isMap && isSet) {
+            iterableSpreadOffset = entry.expression.fileOffset;
+          }
+
           // Use 'dynamic' for error recovery.
           int length = actualTypes.length;
           actualTypes.add(const DynamicType());
@@ -901,10 +929,62 @@
           if (inferenceNeeded) {
             formalTypes.addAll(mapType.typeArguments);
           }
+
+          mapEntryOffset = entry.fileOffset;
         }
       }
     }
     if (inferenceNeeded) {
+      bool canBeSet = mapSpreadOffset == null &&
+          mapEntryOffset == null &&
+          !typeContextIsMap;
+      bool canBeMap = iterableSpreadOffset == null && !typeContextIsIterable;
+      if (canBeSet && !canBeMap) {
+        List<Expression> setElements = <Expression>[];
+        for (int i = 0; i < node.entries.length; ++i) {
+          SpreadMapEntry entry = node.entries[i];
+          // TODO(dmitryas):  Add support for null-aware spreads.
+          setElements.add(new SpreadElement(entry.expression, false));
+        }
+        SetLiteralJudgment setLiteral = new SetLiteralJudgment(setElements,
+            typeArgument: const ImplicitTypeArgument(), isConst: node.isConst)
+          ..fileOffset = node.fileOffset;
+        node.parent.replaceChild(node, setLiteral);
+        visitSetLiteralJudgment(setLiteral, typeContext);
+        node.inferredType = setLiteral.inferredType;
+        return;
+      }
+      if (canBeSet && canBeMap && node.entries.isNotEmpty) {
+        node.parent.replaceChild(
+            node,
+            inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                .buildProblem(messageCantDisambiguateNotEnoughInformation,
+                    node.fileOffset, 1)));
+        node.inferredType = const BottomType();
+        return;
+      }
+      if (!canBeSet && !canBeMap) {
+        LocatedMessage iterableContextMessage = messageSpreadElement
+            .withLocation(library.uri, iterableSpreadOffset, 1);
+        LocatedMessage mapContextMessage = messageSpreadMapElement.withLocation(
+            library.uri, mapSpreadOffset, 1);
+        List<LocatedMessage> context = <LocatedMessage>[];
+        if (iterableSpreadOffset < mapSpreadOffset) {
+          context.add(iterableContextMessage);
+          context.add(mapContextMessage);
+        } else {
+          context.add(mapContextMessage);
+          context.add(iterableContextMessage);
+        }
+        node.parent.replaceChild(
+            node,
+            inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                .buildProblem(messageCantDisambiguateAmbiguousInformation,
+                    node.fileOffset, 1,
+                    context: context)));
+        node.inferredType = const BottomType();
+        return;
+      }
       inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
           mapType,
           mapClass.typeParameters,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 4cdc182..9ebcc33 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -35,6 +35,11 @@
 
 import '../fasta_codes.dart'
     show
+        LocatedMessage,
+        messageCantDisambiguateAmbiguousInformation,
+        messageCantDisambiguateNotEnoughInformation,
+        messageSpreadElement,
+        messageSpreadMapElement,
         messageSwitchExpressionNotAssignableCause,
         messageVoidExpression,
         noLength,
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index b644869..69520ef 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -30,6 +30,10 @@
 CannotReadSdkSpecification/analyzerCode: Fail
 CannotReadSdkSpecification/example: Fail
 CantDetermineConstness/analyzerCode: Fail
+CantDisambiguateAmbiguousInformation/analyzerCode: Fail # There's no analyzer code for that error yet.
+CantDisambiguateAmbiguousInformation/script: Fail # Can't be tested until 'spread-collections' flag is on.
+CantDisambiguateNotEnoughInformation/analyzerCode: Fail # There's no analyzer code for that error yet.
+CantDisambiguateNotEnoughInformation/script: Fail # Can't be tested until 'spread-collections' flag is on.
 CantInferPackagesFromManyInputs/analyzerCode: Fail
 CantInferPackagesFromManyInputs/example: Fail
 CantInferPackagesFromPackageUri/analyzerCode: Fail
@@ -343,7 +347,7 @@
 SpreadMapEntryTypeMismatch/analyzerCode: Fail # Can't be tested until 'spread-collections' flag is on.
 SpreadMapEntryTypeMismatch/script1: Fail # Can't be tested until 'spread-collections' flag is on.
 SpreadMapEntryTypeMismatch/script2: Fail # Can't be tested until 'spread-collections' flag is on.
-SpreadTypeMismatch/analyzerCode: Fail # There's not analyzer code for that error yet.
+SpreadTypeMismatch/analyzerCode: Fail # There's no analyzer code for that error yet.
 SpreadTypeMismatch/script1: Fail # Can't be tested until 'spread-collections' flag is on.
 SpreadTypeMismatch/script2: Fail # Can't be tested until 'spread-collections' flag is on.
 StackOverflow/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index aa63668..e713239 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -3530,3 +3530,26 @@
       Map<String, int> a = <String, int>{"foo": 42};
       Map<String, String> b = <String, String>{...a};
     }
+
+CantDisambiguateNotEnoughInformation:
+  template: "Not enough type information to disambiguate between literal set and literal map."
+  tip: "Try providing type arguments for the literal explicitly to disambiguate it."
+  script: >
+    foo(dynamic spread) {
+      var a = {...spread};
+    }
+
+CantDisambiguateAmbiguousInformation:
+  template: "Both Iterable and Map spread elements encountered in ambiguous literal."
+  script: >
+    foo(Iterable<int> iterableSpread, Map<int, int> mapSpread) {
+      var c = {...iterableSpread, ...mapSpread};
+    }
+
+SpreadElement:
+  template: "Iterable spread."
+  severity: CONTEXT
+
+SpreadMapElement:
+  template: "Map spread."
+  severity: CONTEXT
diff --git a/pkg/front_end/testcases/spread_collection.dart.strong.expect b/pkg/front_end/testcases/spread_collection.dart.strong.expect
index 9e18ed0..a05138f 100644
--- a/pkg/front_end/testcases/spread_collection.dart.strong.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.strong.expect
@@ -1,4 +1,12 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection.dart:9:21: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   final aSetOrMap = {...foo()};
+//                     ^
+//
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
@@ -17,9 +25,9 @@
   final core::Map<core::int, core::int> aMap = block {
     final core::Map<core::int, core::int> #t5 = <core::int, core::int>{};
     #t5.{core::Map::[]=}(1, 1);
-    for (final core::MapEntry<core::int, core::int> #t6 in <dynamic, dynamic>{2: 2})
+    for (final core::MapEntry<core::int, core::int> #t6 in <core::int, core::int>{2: 2})
       #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-    for (final core::MapEntry<core::int, core::int> #t7 in <dynamic, dynamic>{3: 3})
+    for (final core::MapEntry<core::int, core::int> #t7 in <core::int, core::int>{3: 3})
       #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
   } =>#t5;
   final core::Set<core::int> aSet = block {
@@ -32,11 +40,10 @@
       for (final core::int #t11 in #t10)
         #t8.{core::Set::add}(#t11);
   } =>#t8;
-  final core::Map<dynamic, dynamic> aSetOrMap = block {
-    final core::Map<dynamic, dynamic> #t12 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t13 in self::foo() as{TypeError} core::Map<dynamic, dynamic>)
-      #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
-  } =>#t12;
+  final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/spread_collection.dart:9:21: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  final aSetOrMap = {...foo()};
+                    ^";
   core::print(aList);
   core::print(aSet);
   core::print(aMap);
diff --git a/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
index 9e18ed0..a05138f 100644
--- a/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
@@ -1,4 +1,12 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/spread_collection.dart:9:21: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   final aSetOrMap = {...foo()};
+//                     ^
+//
 import self as self;
 import "dart:core" as core;
 import "dart:collection" as col;
@@ -17,9 +25,9 @@
   final core::Map<core::int, core::int> aMap = block {
     final core::Map<core::int, core::int> #t5 = <core::int, core::int>{};
     #t5.{core::Map::[]=}(1, 1);
-    for (final core::MapEntry<core::int, core::int> #t6 in <dynamic, dynamic>{2: 2})
+    for (final core::MapEntry<core::int, core::int> #t6 in <core::int, core::int>{2: 2})
       #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-    for (final core::MapEntry<core::int, core::int> #t7 in <dynamic, dynamic>{3: 3})
+    for (final core::MapEntry<core::int, core::int> #t7 in <core::int, core::int>{3: 3})
       #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
   } =>#t5;
   final core::Set<core::int> aSet = block {
@@ -32,11 +40,10 @@
       for (final core::int #t11 in #t10)
         #t8.{core::Set::add}(#t11);
   } =>#t8;
-  final core::Map<dynamic, dynamic> aSetOrMap = block {
-    final core::Map<dynamic, dynamic> #t12 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t13 in self::foo() as{TypeError} core::Map<dynamic, dynamic>)
-      #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
-  } =>#t12;
+  final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/spread_collection.dart:9:21: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  final aSetOrMap = {...foo()};
+                    ^";
   core::print(aList);
   core::print(aSet);
   core::print(aMap);
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart b/pkg/front_end/testcases/spread_collection_inference.dart
index 474905a..8547fed 100644
--- a/pkg/front_end/testcases/spread_collection_inference.dart
+++ b/pkg/front_end/testcases/spread_collection_inference.dart
@@ -21,13 +21,21 @@
   var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
     /*@typeArgs=dynamic, dynamic*/ {}};
 
+  var /*@type=Map<dynamic, dynamic>*/ map10ambiguous =
+    /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
+
   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
 
   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
 
+  var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
+
   var /*@type=Map<String, int>*/ map20 = /*@typeArgs=String, int*/
     {...mapSpread, "baz": 42};
 
+  var /*@type=Map<String, int>*/ map20ambiguous = /*@typeArgs=String, int*/
+    {...mapSpread};
+
   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
       dynamic)];
 
@@ -35,12 +43,17 @@
       dynamic), 42};
 
   var /*@type=Map<dynamic, dynamic>*/ map21 = /*@typeArgs=dynamic, dynamic*/
-    {...(spread as dynamic), "baz": 42};
+    {...(mapSpread as dynamic), "baz": 42};
+
+  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+    (mapSpread as dynamic)};
 
   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
 
   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
 
+  Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
+
   Map<String, int> map22 = /*@typeArgs=String, int*/
     {... /*@typeArgs=String, int*/ {}};
 
@@ -50,16 +63,28 @@
   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
     [/*@typeArgs=int*/ []], <int>[42]};
 
+  Set<List<int>> set23ambiguous = /*@typeArgs=List<int>*/
+    {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
+
   Map<String, List<int>> map23 = /*@typeArgs=String, List<int>*/
     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 
+  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+    spread, ...mapSpread};
+
   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
 
   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
 
+  int set30ambiguous = /*@error=InvalidAssignment*/ /*@typeArgs=int*/
+    {...spread};
+
   int map30 = /*@error=InvalidAssignment*/ /*@typeArgs=String, int*/
     {...mapSpread, "baz": 42};
 
+  int map30ambiguous = /*@error=InvalidAssignment*/ /*@typeArgs=String, int*/
+    {...mapSpread};
+
   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
     notSpreadInt];
 
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
index 3507169..a976974 100644
--- a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
@@ -18,139 +18,219 @@
 //     /*@typeArgs=dynamic, dynamic*/ {}};
 //                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:24:54: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:25:37: Error: Unexpected token '...'.
+//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
+//                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:25:73: Error: Expected ':' after this.
+//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
+//                                                                         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:27:54: Error: Unexpected token '...'.
 //   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
 //                                                      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:26:53: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:29:53: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
 //                                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:31:65: Error: Expected ':' after this.
+//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
+//                                                                 ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:34:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:9: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:34:9: Error: Expected ':' after this.
 //     {...mapSpread, "baz": 42};
 //         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:37:6: Error: Unexpected token '...'.
+//     {...mapSpread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:37:9: Error: Expected ':' after this.
+//     {...mapSpread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:39:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:34:61: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:42:61: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
 //                                                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:38:6: Error: Unexpected token '...'.
-//     {...(spread as dynamic), "baz": 42};
+// pkg/front_end/testcases/spread_collection_inference.dart:46:6: Error: Unexpected token '...'.
+//     {...(mapSpread as dynamic), "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:38:17: Error: Expected ':' after this.
-//     {...(spread as dynamic), "baz": 42};
-//                 ^
+// pkg/front_end/testcases/spread_collection_inference.dart:46:20: Error: Expected ':' after this.
+//     {...(mapSpread as dynamic), "baz": 42};
+//                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:40:40: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:48:77: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:49:16: Error: Expected ':' after this.
+//     (mapSpread as dynamic)};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:51:40: Error: Unexpected token '...'.
 //   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
 //                                        ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:42:39: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:53:39: Error: Unexpected token '...'.
 //   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
 //                                       ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:45:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:55:48: Error: Unexpected token '...'.
+//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
+//                                                ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:55:70: Error: Expected ':' after this.
+//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
+//                                                                      ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:58:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, int*/ {}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:45:36: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:58:36: Error: Expected ':' after this.
 //     {... /*@typeArgs=String, int*/ {}};
 //                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:47:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:60:52: Error: Unexpected token '...'.
 //   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:50:51: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:63:51: Error: Unexpected token '...'.
 //   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
 //                                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:54:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:67:6: Error: Unexpected token '...'.
+//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:67:34: Error: Expected ':' after this.
+//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
+//                                  ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:70:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:54:42: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:70:42: Error: Expected ':' after this.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //                                          ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:56:63: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:72:77: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:13: Error: Unexpected token '...'.
+//     spread, ...mapSpread};
+//             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Expected ':' after this.
+//     spread, ...mapSpread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Error: Expected ':' after this.
+//     spread, ...mapSpread};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:75:63: Error: Unexpected token '...'.
 //   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
 //                                                               ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:63: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:77:63: Error: Unexpected token '...'.
 //   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
 //                                                               ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:6: Error: Unexpected token '...'.
+//     {...spread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:80:9: Error: Expected ':' after this.
+//     {...spread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:83:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:9: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:83:9: Error: Expected ':' after this.
 //     {...mapSpread, "baz": 42};
 //         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:63:35: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:86:6: Error: Unexpected token '...'.
+//     {...mapSpread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:86:9: Error: Expected ':' after this.
+//     {...mapSpread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:88:35: Error: Unexpected token '...'.
 //   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:66:34: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:34: Error: Unexpected token '...'.
 //   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
 //                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:69:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:94:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:97:36: Error: Unexpected token '...'.
 //   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:35: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:100:35: Error: Unexpected token '...'.
 //   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:78:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:103:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:81:33: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:106:33: Error: Unexpected token '...'.
 //   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
 //                                 ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:84:32: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:109:32: Error: Unexpected token '...'.
 //   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
 //                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:111:36: Error: Unexpected token '...'.
 //   Map<int, int> map60 = <int, int>{...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
 //                                                     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:89:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:114:48: Error: Unexpected token '...'.
 //   Map<String, String> map61 = <String, String>{...
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
 //                                                       ^
 //
@@ -165,21 +245,30 @@
   dynamic lhs10 = <dynamic>[<dynamic>[]];
   dynamic set10 = <dynamic>{<dynamic>[]};
   dynamic map10 = <dynamic, dynamic>{};
+  dynamic map10ambiguous = <dynamic, dynamic>{};
   dynamic lhs20 = <dynamic>[spread];
   dynamic set20 = <dynamic>{spread, 42};
+  dynamic set20ambiguous = <dynamic, dynamic>{};
   dynamic map20 = <dynamic, dynamic>{"baz": 42};
+  dynamic map20ambiguous = <dynamic, dynamic>{};
   dynamic lhs21 = <dynamic>[spread as dynamic];
   dynamic set21 = <dynamic>{spread as dynamic, 42};
   dynamic map21 = <dynamic, dynamic>{"baz": 42};
+  dynamic map21ambiguous = <dynamic, dynamic>{};
   core::List<core::int> lhs22 = <dynamic>[<dynamic>[]];
   core::Set<core::int> set22 = <dynamic>{<dynamic>[], 42};
+  core::Set<core::int> set22ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::int> map22 = <dynamic, dynamic>{};
   core::List<core::List<core::int>> lhs23 = <dynamic>[<dynamic>[<dynamic>[]]];
   core::Set<core::List<core::int>> set23 = <dynamic>{<dynamic>[<dynamic>[]], <core::int>[42]};
+  core::Set<core::List<core::int>> set23ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::List<core::int>> map23 = <dynamic, dynamic>{};
+  dynamic map24ambiguous = <dynamic, dynamic>{};
   core::int lhs30 = <dynamic>[spread];
   core::int set30 = <dynamic>{spread, 42};
+  core::int set30ambiguous = <dynamic, dynamic>{};
   core::int map30 = <dynamic, dynamic>{"baz": 42};
+  core::int map30ambiguous = <dynamic, dynamic>{};
   core::List<dynamic> lhs40 = <dynamic>[notSpreadInt];
   core::Set<dynamic> set40 = <dynamic>{notSpreadInt};
   core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
index 3507169..a976974 100644
--- a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
@@ -18,139 +18,219 @@
 //     /*@typeArgs=dynamic, dynamic*/ {}};
 //                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:24:54: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:25:37: Error: Unexpected token '...'.
+//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
+//                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:25:73: Error: Expected ':' after this.
+//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
+//                                                                         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:27:54: Error: Unexpected token '...'.
 //   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
 //                                                      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:26:53: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:29:53: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
 //                                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:31:65: Error: Expected ':' after this.
+//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
+//                                                                 ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:34:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:9: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:34:9: Error: Expected ':' after this.
 //     {...mapSpread, "baz": 42};
 //         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:37:6: Error: Unexpected token '...'.
+//     {...mapSpread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:37:9: Error: Expected ':' after this.
+//     {...mapSpread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:39:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:34:61: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:42:61: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
 //                                                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:38:6: Error: Unexpected token '...'.
-//     {...(spread as dynamic), "baz": 42};
+// pkg/front_end/testcases/spread_collection_inference.dart:46:6: Error: Unexpected token '...'.
+//     {...(mapSpread as dynamic), "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:38:17: Error: Expected ':' after this.
-//     {...(spread as dynamic), "baz": 42};
-//                 ^
+// pkg/front_end/testcases/spread_collection_inference.dart:46:20: Error: Expected ':' after this.
+//     {...(mapSpread as dynamic), "baz": 42};
+//                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:40:40: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:48:77: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:49:16: Error: Expected ':' after this.
+//     (mapSpread as dynamic)};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:51:40: Error: Unexpected token '...'.
 //   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
 //                                        ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:42:39: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:53:39: Error: Unexpected token '...'.
 //   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
 //                                       ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:45:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:55:48: Error: Unexpected token '...'.
+//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
+//                                                ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:55:70: Error: Expected ':' after this.
+//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
+//                                                                      ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:58:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, int*/ {}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:45:36: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:58:36: Error: Expected ':' after this.
 //     {... /*@typeArgs=String, int*/ {}};
 //                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:47:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:60:52: Error: Unexpected token '...'.
 //   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:50:51: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:63:51: Error: Unexpected token '...'.
 //   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
 //                                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:54:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:67:6: Error: Unexpected token '...'.
+//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:67:34: Error: Expected ':' after this.
+//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
+//                                  ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:70:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:54:42: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:70:42: Error: Expected ':' after this.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //                                          ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:56:63: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:72:77: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:13: Error: Unexpected token '...'.
+//     spread, ...mapSpread};
+//             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Expected ':' after this.
+//     spread, ...mapSpread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Error: Expected ':' after this.
+//     spread, ...mapSpread};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:75:63: Error: Unexpected token '...'.
 //   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
 //                                                               ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:63: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:77:63: Error: Unexpected token '...'.
 //   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
 //                                                               ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:6: Error: Unexpected token '...'.
+//     {...spread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:80:9: Error: Expected ':' after this.
+//     {...spread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:83:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:9: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:83:9: Error: Expected ':' after this.
 //     {...mapSpread, "baz": 42};
 //         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:63:35: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:86:6: Error: Unexpected token '...'.
+//     {...mapSpread};
+//      ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:86:9: Error: Expected ':' after this.
+//     {...mapSpread};
+//         ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:88:35: Error: Unexpected token '...'.
 //   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:66:34: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:34: Error: Unexpected token '...'.
 //   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
 //                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:69:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:94:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:97:36: Error: Unexpected token '...'.
 //   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:35: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:100:35: Error: Unexpected token '...'.
 //   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:78:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:103:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:81:33: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:106:33: Error: Unexpected token '...'.
 //   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
 //                                 ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:84:32: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:109:32: Error: Unexpected token '...'.
 //   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
 //                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:111:36: Error: Unexpected token '...'.
 //   Map<int, int> map60 = <int, int>{...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
 //                                                     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:89:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:114:48: Error: Unexpected token '...'.
 //   Map<String, String> map61 = <String, String>{...
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Expected ':' after this.
+// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Expected ':' after this.
 //     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
 //                                                       ^
 //
@@ -165,21 +245,30 @@
   dynamic lhs10 = <dynamic>[<dynamic>[]];
   dynamic set10 = <dynamic>{<dynamic>[]};
   dynamic map10 = <dynamic, dynamic>{};
+  dynamic map10ambiguous = <dynamic, dynamic>{};
   dynamic lhs20 = <dynamic>[spread];
   dynamic set20 = <dynamic>{spread, 42};
+  dynamic set20ambiguous = <dynamic, dynamic>{};
   dynamic map20 = <dynamic, dynamic>{"baz": 42};
+  dynamic map20ambiguous = <dynamic, dynamic>{};
   dynamic lhs21 = <dynamic>[spread as dynamic];
   dynamic set21 = <dynamic>{spread as dynamic, 42};
   dynamic map21 = <dynamic, dynamic>{"baz": 42};
+  dynamic map21ambiguous = <dynamic, dynamic>{};
   core::List<core::int> lhs22 = <dynamic>[<dynamic>[]];
   core::Set<core::int> set22 = <dynamic>{<dynamic>[], 42};
+  core::Set<core::int> set22ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::int> map22 = <dynamic, dynamic>{};
   core::List<core::List<core::int>> lhs23 = <dynamic>[<dynamic>[<dynamic>[]]];
   core::Set<core::List<core::int>> set23 = <dynamic>{<dynamic>[<dynamic>[]], <core::int>[42]};
+  core::Set<core::List<core::int>> set23ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::List<core::int>> map23 = <dynamic, dynamic>{};
+  dynamic map24ambiguous = <dynamic, dynamic>{};
   core::int lhs30 = <dynamic>[spread];
   core::int set30 = <dynamic>{spread, 42};
+  core::int set30ambiguous = <dynamic, dynamic>{};
   core::int map30 = <dynamic, dynamic>{"baz": 42};
+  core::int map30ambiguous = <dynamic, dynamic>{};
   core::List<dynamic> lhs40 = <dynamic>[notSpreadInt];
   core::Set<dynamic> set40 = <dynamic>{notSpreadInt};
   core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
index a8ade16..a45078f 100644
--- a/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
@@ -2,61 +2,88 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:56:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+//                                                                            ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+//                                                                            ^
+// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Context: Iterable spread.
+//     spread, ...mapSpread};
+//     ^
+// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Context: Map spread.
+//     spread, ...mapSpread};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
 //                                                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
 //                                                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     {...spread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread, "baz": 42};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:64:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+//  - 'Map' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     {...mapSpread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:67:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:76:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:82:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //     spread];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:84:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
 //                                                                         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
 //     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
 //                                                     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
 //     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
 //                                                       ^
 //
@@ -84,129 +111,179 @@
     for (final core::MapEntry<dynamic, dynamic> #t6 in <dynamic, dynamic>{})
       #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
   } =>#t5;
-  core::List<core::int> lhs20 = block {
-    final core::List<core::int> #t7 = <core::int>[];
-    for (final core::int #t8 in spread)
-      #t7.{core::List::add}(#t8);
+  core::Map<dynamic, dynamic> map10ambiguous = block {
+    final core::Map<dynamic, dynamic> #t7 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t8 in <dynamic, dynamic>{})
+      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t7;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
+  core::List<core::int> lhs20 = block {
+    final core::List<core::int> #t9 = <core::int>[];
     for (final core::int #t10 in spread)
-      #t9.{core::Set::add}(#t10);
-    #t9.{core::Set::add}(42);
+      #t9.{core::List::add}(#t10);
   } =>#t9;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t11 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t12 in mapSpread)
-      #t11.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
-    #t11.{core::Map::[]=}("baz", 42);
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t12 in spread)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
   } =>#t11;
-  core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t13 = <dynamic>[];
-    for (final dynamic #t14 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t13.{core::List::add}(#t14);
+  core::Set<core::int> set20ambiguous = block {
+    final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t14 in spread)
+      #t13.{core::Set::add}(#t14);
   } =>#t13;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t15 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t16 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t15.{core::Set::add}(#t16);
-    #t15.{core::Set::add}(42);
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t16 in mapSpread)
+      #t15.{core::Map::[]=}(#t16.{core::MapEntry::key}, #t16.{core::MapEntry::value});
+    #t15.{core::Map::[]=}("baz", 42);
   } =>#t15;
-  core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t17 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t18 in (spread as dynamic) as{TypeError} core::Map<dynamic, dynamic>)
+  core::Map<core::String, core::int> map20ambiguous = block {
+    final core::Map<core::String, core::int> #t17 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t18 in mapSpread)
       #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-    #t17.{core::Map::[]=}("baz", 42);
   } =>#t17;
-  core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t19 = <core::int>[];
-    for (final core::int #t20 in <core::int>[])
+  core::List<dynamic> lhs21 = block {
+    final core::List<dynamic> #t19 = <dynamic>[];
+    for (final dynamic #t20 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
       #t19.{core::List::add}(#t20);
   } =>#t19;
-  core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t22 in <core::int>[])
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t21 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t22 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
       #t21.{core::Set::add}(#t22);
     #t21.{core::Set::add}(42);
   } =>#t21;
-  core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t23 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t24 in <core::String, core::int>{})
+  core::Map<dynamic, dynamic> map21 = block {
+    final core::Map<dynamic, dynamic> #t23 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t24 in (mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>)
       #t23.{core::Map::[]=}(#t24.{core::MapEntry::key}, #t24.{core::MapEntry::value});
+    #t23.{core::Map::[]=}("baz", 42);
   } =>#t23;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t25 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t26 in <core::List<core::int>>[<core::int>[]])
+  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+                                                                           ^";
+  core::List<core::int> lhs22 = block {
+    final core::List<core::int> #t25 = <core::int>[];
+    for (final core::int #t26 in <core::int>[])
       #t25.{core::List::add}(#t26);
   } =>#t25;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t27 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final core::List<core::int> #t28 in <core::List<core::int>>[<core::int>[]])
+  core::Set<core::int> set22 = block {
+    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t28 in <core::int>[])
       #t27.{core::Set::add}(#t28);
-    #t27.{core::Set::add}(<core::int>[42]);
+    #t27.{core::Set::add}(42);
   } =>#t27;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t29 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t30 in <core::String, core::List<core::int>>{"baz": <core::int>[]})
-      #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+  core::Set<core::int> set22ambiguous = block {
+    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t30 in <core::int>[])
+      #t29.{core::Set::add}(#t30);
   } =>#t29;
-  core::int lhs30 = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:56:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  core::Map<core::String, core::int> map22 = block {
+    final core::Map<core::String, core::int> #t31 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t32 in <core::String, core::int>{})
+      #t31.{core::Map::[]=}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
+  } =>#t31;
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t33 = <core::List<core::int>>[];
+    for (final core::List<core::int> #t34 in <core::List<core::int>>[<core::int>[]])
+      #t33.{core::List::add}(#t34);
+  } =>#t33;
+  core::Set<core::List<core::int>> set23 = block {
+    final core::Set<core::List<core::int>> #t35 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
+      #t35.{core::Set::add}(#t36);
+    #t35.{core::Set::add}(<core::int>[42]);
+  } =>#t35;
+  core::Set<core::List<core::int>> set23ambiguous = block {
+    final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
+      #t37.{core::Set::add}(#t38);
+  } =>#t37;
+  core::Map<core::String, core::List<core::int>> map23 = block {
+    final core::Map<core::String, core::List<core::int>> #t39 = <core::String, core::List<core::int>>{};
+    for (final core::MapEntry<core::String, core::List<core::int>> #t40 in <core::String, core::List<core::int>>{"baz": <core::int>[]})
+      #t39.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+  } =>#t39;
+  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+                                                                           ^";
+  core::int lhs30 = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
                                                              ^" in ( block {
-    final core::List<core::int> #t32 = <core::int>[];
-    for (final core::int #t33 in spread)
-      #t32.{core::List::add}(#t33);
-  } =>#t32) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:58:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+    final core::List<core::int> #t42 = <core::int>[];
+    for (final core::int #t43 in spread)
+      #t42.{core::List::add}(#t43);
+  } =>#t42) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
                                                              ^" in ( block {
-    final core::Set<core::int> #t35 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t36 in spread)
-      #t35.{core::Set::add}(#t36);
-    #t35.{core::Set::add}(42);
-  } =>#t35) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:61:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t46 in spread)
+      #t45.{core::Set::add}(#t46);
+    #t45.{core::Set::add}(42);
+  } =>#t45) as{TypeError} core::int;
+  core::int set30ambiguous = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    {...spread};
+    ^" in ( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+  } =>#t48) as{TypeError} core::int;
+  core::int map30 = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread, \"baz\": 42};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t38 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t39 in mapSpread)
-      #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", 42);
-  } =>#t38) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:64:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    final core::Map<core::String, core::int> #t51 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t52 in mapSpread)
+      #t51.{core::Map::[]=}(#t52.{core::MapEntry::key}, #t52.{core::MapEntry::value});
+    #t51.{core::Map::[]=}("baz", 42);
+  } =>#t51) as{TypeError} core::int;
+  core::int map30ambiguous = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    {...mapSpread};
+    ^" in ( block {
+    final core::Map<core::String, core::int> #t54 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t55 in mapSpread)
+      #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
+  } =>#t54) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt];
     ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t40 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t41 = #t40.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:67:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt};
-    ^") in #t40;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+    ^") in #t56;
+  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
                                           ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction];
     ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t42 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t43 = #t42.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:76:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t58 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t59 = #t58.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction};
-    ^") in #t42;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+    ^") in #t58;
+  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
                                           ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
     spread];
     ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t44 = col::LinkedHashSet::•<core::String>() in let final dynamic #t45 = #t44.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:84:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String> set60 = let final core::Set<core::String> #t60 = col::LinkedHashSet::•<core::String>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-                                                                        ^") in #t44;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+                                                                        ^") in #t60;
+  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
                                                     ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
                                                       ^"};
 }
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
index 34ef7b6..0f75319 100644
--- a/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
@@ -2,61 +2,88 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:56:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+//                                                                            ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+//                                                                            ^
+// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Context: Iterable spread.
+//     spread, ...mapSpread};
+//     ^
+// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Context: Map spread.
+//     spread, ...mapSpread};
+//                ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
 //                                                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
 //                                                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:61:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     {...spread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread, "baz": 42};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:64:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+//  - 'Map' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     {...mapSpread};
+//     ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:67:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:76:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
 //     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
 //                                           ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:82:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //     spread];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:84:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
 //                                                                         ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
 //     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
 //                                                     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
 //     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
 //                                                       ^
 //
@@ -84,129 +111,179 @@
     for (final core::MapEntry<dynamic, dynamic> #t6 in <dynamic, dynamic>{})
       #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
   } =>#t5;
-  core::List<core::int> lhs20 = block {
-    final core::List<core::int> #t7 = <core::int>[];
-    for (final core::int #t8 in spread)
-      #t7.{core::List::add}(#t8);
+  core::Map<dynamic, dynamic> map10ambiguous = block {
+    final core::Map<dynamic, dynamic> #t7 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t8 in <dynamic, dynamic>{})
+      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t7;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
+  core::List<core::int> lhs20 = block {
+    final core::List<core::int> #t9 = <core::int>[];
     for (final core::int #t10 in spread)
-      #t9.{core::Set::add}(#t10);
-    #t9.{core::Set::add}(42);
+      #t9.{core::List::add}(#t10);
   } =>#t9;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t11 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t12 in mapSpread)
-      #t11.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
-    #t11.{core::Map::[]=}("baz", 42);
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t12 in spread)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
   } =>#t11;
-  core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t13 = <dynamic>[];
-    for (final dynamic #t14 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t13.{core::List::add}(#t14);
+  core::Set<core::int> set20ambiguous = block {
+    final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t14 in spread)
+      #t13.{core::Set::add}(#t14);
   } =>#t13;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t15 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t16 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t15.{core::Set::add}(#t16);
-    #t15.{core::Set::add}(42);
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t16 in mapSpread)
+      #t15.{core::Map::[]=}(#t16.{core::MapEntry::key}, #t16.{core::MapEntry::value});
+    #t15.{core::Map::[]=}("baz", 42);
   } =>#t15;
-  core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t17 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t18 in (spread as dynamic) as{TypeError} core::Map<dynamic, dynamic>)
+  core::Map<core::String, core::int> map20ambiguous = block {
+    final core::Map<core::String, core::int> #t17 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t18 in mapSpread)
       #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-    #t17.{core::Map::[]=}("baz", 42);
   } =>#t17;
-  core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t19 = <core::int>[];
-    for (final core::int #t20 in <core::int>[])
+  core::List<dynamic> lhs21 = block {
+    final core::List<dynamic> #t19 = <dynamic>[];
+    for (final dynamic #t20 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
       #t19.{core::List::add}(#t20);
   } =>#t19;
-  core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t22 in <core::int>[])
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t21 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t22 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
       #t21.{core::Set::add}(#t22);
     #t21.{core::Set::add}(42);
   } =>#t21;
-  core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t23 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t24 in <core::String, core::int>{})
+  core::Map<dynamic, dynamic> map21 = block {
+    final core::Map<dynamic, dynamic> #t23 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t24 in (mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>)
       #t23.{core::Map::[]=}(#t24.{core::MapEntry::key}, #t24.{core::MapEntry::value});
+    #t23.{core::Map::[]=}("baz", 42);
   } =>#t23;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t25 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t26 in <core::List<core::int>>[<core::int>[]])
+  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+                                                                           ^";
+  core::List<core::int> lhs22 = block {
+    final core::List<core::int> #t25 = <core::int>[];
+    for (final core::int #t26 in <core::int>[])
       #t25.{core::List::add}(#t26);
   } =>#t25;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t27 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final core::List<core::int> #t28 in <core::List<core::int>>[<core::int>[]])
+  core::Set<core::int> set22 = block {
+    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t28 in <core::int>[])
       #t27.{core::Set::add}(#t28);
-    #t27.{core::Set::add}(<core::int>[42]);
+    #t27.{core::Set::add}(42);
   } =>#t27;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t29 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t30 in <core::String, core::List<core::int>>{"baz": <core::int>[]})
-      #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+  core::Set<core::int> set22ambiguous = block {
+    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t30 in <core::int>[])
+      #t29.{core::Set::add}(#t30);
   } =>#t29;
-  core::int lhs30 = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:56:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  core::Map<core::String, core::int> map22 = block {
+    final core::Map<core::String, core::int> #t31 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t32 in <core::String, core::int>{})
+      #t31.{core::Map::[]=}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
+  } =>#t31;
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t33 = <core::List<core::int>>[];
+    for (final core::List<core::int> #t34 in <core::List<core::int>>[<core::int>[]])
+      #t33.{core::List::add}(#t34);
+  } =>#t33;
+  core::Set<core::List<core::int>> set23 = block {
+    final core::Set<core::List<core::int>> #t35 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
+      #t35.{core::Set::add}(#t36);
+    #t35.{core::Set::add}(<core::int>[42]);
+  } =>#t35;
+  core::Set<core::List<core::int>> set23ambiguous = block {
+    final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
+      #t37.{core::Set::add}(#t38);
+  } =>#t37;
+  core::Map<core::String, core::List<core::int>> map23 = block {
+    final core::Map<core::String, core::List<core::int>> #t39 = <core::String, core::List<core::int>>{};
+    for (final core::MapEntry<core::String, core::List<core::int>> #t40 in <core::String, core::List<core::int>>{"baz": <core::int>[]})
+      #t39.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+  } =>#t39;
+  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+                                                                           ^";
+  core::int lhs30 = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
                                                              ^" in ( block {
-    final core::List<core::int> #t32 = <core::int>[];
-    for (final core::int #t33 in spread)
-      #t32.{core::List::add}(#t33);
-  } =>#t32) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:58:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+    final core::List<core::int> #t42 = <core::int>[];
+    for (final core::int #t43 in spread)
+      #t42.{core::List::add}(#t43);
+  } =>#t42) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
                                                              ^" in ( block {
-    final core::Set<core::int> #t35 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t36 in spread)
-      #t35.{core::Set::add}(#t36);
-    #t35.{core::Set::add}(42);
-  } =>#t35) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:61:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t46 in spread)
+      #t45.{core::Set::add}(#t46);
+    #t45.{core::Set::add}(42);
+  } =>#t45) as{TypeError} core::int;
+  core::int set30ambiguous = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    {...spread};
+    ^" in ( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+  } =>#t48) as{TypeError} core::int;
+  core::int map30 = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread, \"baz\": 42};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t38 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t39 in mapSpread)
-      #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", 42);
-  } =>#t38) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:64:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    final core::Map<core::String, core::int> #t51 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t52 in mapSpread)
+      #t51.{core::Map::[]=}(#t52.{core::MapEntry::key}, #t52.{core::MapEntry::value});
+    #t51.{core::Map::[]=}("baz", 42);
+  } =>#t51) as{TypeError} core::int;
+  core::int map30ambiguous = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    {...mapSpread};
+    ^" in ( block {
+    final core::Map<core::String, core::int> #t54 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t55 in mapSpread)
+      #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
+  } =>#t54) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt];
     ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t40 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t41 = #t40.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:67:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt};
-    ^") in #t40;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:70:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+    ^") in #t56;
+  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
                                           ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:73:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction];
     ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t42 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t43 = #t42.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:76:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t58 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t59 = #t58.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction};
-    ^") in #t42;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:79:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+    ^") in #t58;
+  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
                                           ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
     spread];
     ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t44 = col::LinkedHashSet::•<core::String>() in let final core::bool #t45 = #t44.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:84:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String> set60 = let final core::Set<core::String> #t60 = col::LinkedHashSet::•<core::String>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-                                                                        ^") in #t44;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:87:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+                                                                        ^") in #t60;
+  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
                                                     ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:90:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
                                                       ^"};
 }