Version 2.14.0-239.0.dev

Merge commit 'f81bf604a94d84594c090c7604f4a6e09210d226' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7d5d4ba3..5119c30 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -103,7 +103,7 @@
   underscore.
 - fix false negative in `prefer_final_parameters` where first parameter
   is final.
-- improve `directives_ordering` sorting of directives with dot paths and 
+- improve `directives_ordering` sorting of directives with dot paths and
   dot-separated package names.
 - (internal) migrate to `SecurityLintCode` instead of deprecated
   `SecurityLintCodeWithUniqueName`.
@@ -208,6 +208,16 @@
     }
     ```
 
+## 2.13.4 - 2021-06-28
+
+This is a patch release that fixes:
+
+* a Dart VM compiler crash (issue [flutter/flutter#84212][]).
+* a DDC compiler crash (issue [flutter/flutter#82838][]).
+
+[flutter/flutter#84212]: https://github.com/flutter/flutter/issues/84212
+[flutter/flutter#82838]: https://github.com/flutter/flutter/issues/82838
+
 ## 2.13.3 - 2021-06-10
 
 This is a patch release that fixes:
diff --git a/build/fuchsia/config/clang/BUILD.gn b/build/fuchsia/config/clang/BUILD.gn
index be74d08..6a1ebe9 100644
--- a/build/fuchsia/config/clang/BUILD.gn
+++ b/build/fuchsia/config/clang/BUILD.gn
@@ -21,9 +21,9 @@
 
   sys = target_os
   sources = [
-    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libc++.so.2.0",
-    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libc++abi.so.1.0",
-    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libunwind.so.1.0",
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/libc++.so.2.0",
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/libc++abi.so.1.0",
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/libunwind.so.1.0",
   ]
   outputs = [
     "${root_out_dir}/lib/{{source_name_part}}",
diff --git a/pkg/compiler/lib/src/kernel/transformations/list_factory_specializer.dart b/pkg/compiler/lib/src/kernel/transformations/list_factory_specializer.dart
index b14d9e2..c315199 100644
--- a/pkg/compiler/lib/src/kernel/transformations/list_factory_specializer.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/list_factory_specializer.dart
@@ -6,6 +6,7 @@
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
 import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/type_algebra.dart';
 import 'factory_specializer.dart';
 
 /// Replaces invocation of List factory constructors.
@@ -41,16 +42,16 @@
     });
   }
 
-  Member _intPlus;
-  Member get intPlus =>
+  Procedure _intPlus;
+  Procedure get intPlus =>
       _intPlus ??= hierarchy.getInterfaceMember(_intClass, Name('+'));
 
-  Member _intLess;
-  Member get intLess =>
+  Procedure _intLess;
+  Procedure get intLess =>
       _intLess ??= hierarchy.getInterfaceMember(_intClass, Name('<'));
 
-  Member _jsArrayIndexSet;
-  Member get jsArrayIndexSet => _jsArrayIndexSet ??=
+  Procedure _jsArrayIndexSet;
+  Procedure get jsArrayIndexSet => _jsArrayIndexSet ??=
       hierarchy.getInterfaceMember(_jsArrayClass, Name('[]='));
 
   /// Replace calls to `List.generate(length, (i) => e)` with an expansion
@@ -131,20 +132,30 @@
       // initializers: _i = 0
       [indexVariable],
       // condition: _i < _length
-      MethodInvocation(
+      InstanceInvocation(
+        InstanceAccessKind.Instance,
         VariableGet(indexVariable)..fileOffset = node.fileOffset,
         Name('<'),
         Arguments([getLength()]),
-      )..interfaceTarget = intLess,
+        interfaceTarget: intLess,
+        functionType: intLess.getterType,
+      ),
       // updates: _i++
       [
         VariableSet(
           indexVariable,
-          MethodInvocation(
-            VariableGet(indexVariable)..fileOffset = node.fileOffset,
-            Name('+'),
-            Arguments([IntLiteral(1)]),
-          )..interfaceTarget = intPlus,
+          InstanceInvocation(
+              InstanceAccessKind.Instance,
+              VariableGet(indexVariable)..fileOffset = node.fileOffset,
+              Name('+'),
+              Arguments([IntLiteral(1)]),
+              interfaceTarget: intPlus,
+              functionType: FunctionType(
+                  [intType],
+                  intType,
+                  contextMember.isNonNullableByDefault
+                      ? Nullability.nonNullable
+                      : Nullability.legacy)),
         )..fileOffset = node.fileOffset,
       ],
       // body, e.g. _list[_i] = expression;
@@ -315,15 +326,18 @@
     final value = expression == null ? NullLiteral() : clone(expression);
     // TODO(sra): Indicate that this indexed setter is safe.
     return ExpressionStatement(
-      MethodInvocation(
-        VariableGet(listVariable)..fileOffset = constructorFileOffset,
-        Name('[]='),
-        Arguments([
-          VariableGet(argument)..fileOffset = node.fileOffset,
-          value,
-        ]),
-      )
-        ..interfaceTarget = listFactorySpecializer.jsArrayIndexSet
+      InstanceInvocation(
+          InstanceAccessKind.Instance,
+          VariableGet(listVariable)..fileOffset = constructorFileOffset,
+          Name('[]='),
+          Arguments([
+            VariableGet(argument)..fileOffset = node.fileOffset,
+            value,
+          ]),
+          interfaceTarget: listFactorySpecializer.jsArrayIndexSet,
+          functionType: Substitution.fromInterfaceType(listVariable.type)
+              .substituteType(
+                  listFactorySpecializer.jsArrayIndexSet.getterType))
         ..isInvariant = true
         ..isBoundsSafe = true
         ..fileOffset = constructorFileOffset,
diff --git a/pkg/compiler/test/kernel/data/list_generate_1.dart.expect b/pkg/compiler/test/kernel/data/list_generate_1.dart.expect
index be2484b..62d51f9 100644
--- a/pkg/compiler/test/kernel/data/list_generate_1.dart.expect
+++ b/pkg/compiler/test/kernel/data/list_generate_1.dart.expect
@@ -5,23 +5,23 @@
 
 static field core::List<core::int*>* list1 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
-    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
   }
 } =>_list;
 static field core::List<core::int*>* list2 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
-    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
   }
 } =>_list;
 static field core::List<core::int*>* list3 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateFixed<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
-    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+    _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
   }
 } =>_list;
 static field core::List<core::int*>* list4 = core::List::generate<core::int*>(10, (core::int* i) → core::int* => i, growable: self::someGrowable);
diff --git a/pkg/compiler/test/kernel/data/list_generate_2.dart.expect b/pkg/compiler/test/kernel/data/list_generate_2.dart.expect
index 51e385e..b58c1b6 100644
--- a/pkg/compiler/test/kernel/data/list_generate_2.dart.expect
+++ b/pkg/compiler/test/kernel/data/list_generate_2.dart.expect
@@ -6,16 +6,16 @@
 static method main() → void {
   core::print( block {
     final _in::JSArray<core::List<core::int*>*> _list = _in::JSArray::allocateGrowable<core::List<core::int*>*>(10);
-    for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
       core::int* i = i;
       _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, block {
         final core::int _length = i;
         final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(_length);
-        for (core::int i = 0; i.{core::num::<}(_length); i = i.{core::num::+}(1)) {
+        for (core::int i = 0; i.{core::num::<}(_length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
           core::int* i = i;
-          _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i.{core::num::+}(1){(core::num*) →* core::int*});
+          _list.{_in::JSArray::[]=}(i, i.{core::num::+}(1){(core::num*) →* core::int*}){(core::int, core::int*) → void};
         }
-      } =>_list);
+      } =>_list){(core::int, core::List<core::int*>*) → void};
     }
   } =>_list);
 }
diff --git a/pkg/compiler/test/kernel/data/list_generate_3.dart.expect b/pkg/compiler/test/kernel/data/list_generate_3.dart.expect
index 9a50e1e..c8614fa 100644
--- a/pkg/compiler/test/kernel/data/list_generate_3.dart.expect
+++ b/pkg/compiler/test/kernel/data/list_generate_3.dart.expect
@@ -5,28 +5,28 @@
 
 static field core::List<core::int*>* list1 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
     {
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
     }
   }
 } =>_list;
 static field core::List<core::int*>* list2 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateGrowable<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
     {
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
     }
   }
 } =>_list;
 static field core::List<core::int*>* list3 = block {
   final _in::JSArray<core::int*> _list = _in::JSArray::allocateFixed<core::int*>(10);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int) →* core::int}) {
     core::int* i = i;
     {
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i);
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i){(core::int, core::int*) → void};
     }
   }
 } =>_list;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 953a360..fa29641 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6304,12 +6304,20 @@
   void handleTypeArgumentApplication(Token openAngleBracket) {
     /// TODO(johnniwinther, paulberry): add support for this construct when the
     /// "constructor-tearoffs" feature is enabled.
-    pop(); // typeArguments
-    addProblem(
-        templateExperimentNotEnabled.withArguments('constructor-tearoffs',
-            libraryBuilder.enableConstructorTearoffsVersionInLibrary.toText()),
-        openAngleBracket.charOffset,
-        noLength);
+    List<UnresolvedType> typeArguments = pop(); // typeArguments
+    if (libraryBuilder.enableConstructorTearOffsInLibrary) {
+      Generator generator = pop();
+      push(generator.applyTypeArguments(
+          openAngleBracket.charOffset, typeArguments));
+    } else {
+      addProblem(
+          templateExperimentNotEnabled.withArguments(
+              'constructor-tearoffs',
+              libraryBuilder.enableConstructorTearOffsVersionInLibrary
+                  .toText()),
+          openAngleBracket.charOffset,
+          noLength);
+    }
   }
 
   @override
@@ -6597,7 +6605,7 @@
     // "constructor-tearoffs" feature is enabled.
     addProblem(
         templateExperimentNotEnabled.withArguments('constructor-tearoffs',
-            libraryBuilder.enableConstructorTearoffsVersionInLibrary.toText()),
+            libraryBuilder.enableConstructorTearOffsVersionInLibrary.toText()),
         token.charOffset,
         token.length);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 3069d7d..1efc687 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -253,6 +253,13 @@
         offsetForToken(token), unaryName, buildSimpleRead());
   }
 
+  /*Expression|Generator*/ applyTypeArguments(
+      int fileOffset, List<UnresolvedType> typeArguments) {
+    return new Instantiation(
+        buildSimpleRead(), _helper.buildDartTypeArguments(typeArguments))
+      ..fileOffset = fileOffset;
+  }
+
   /// Returns a [TypeBuilder] for this subexpression instantiated with the
   /// type [arguments]. If no type arguments are provided [arguments] is `null`.
   ///
@@ -2940,6 +2947,7 @@
 ///
 class TypeUseGenerator extends ReadOnlyAccessGenerator {
   final TypeDeclarationBuilder declaration;
+  List<UnresolvedType> typeArguments;
 
   TypeUseGenerator(ExpressionGeneratorHelper helper, Token token,
       this.declaration, String targetName)
@@ -3038,7 +3046,8 @@
             _helper.buildDartType(
                 new UnresolvedType(
                     buildTypeWithResolvedArguments(
-                        _helper.libraryBuilder.nonNullableBuilder, null),
+                        _helper.libraryBuilder.nonNullableBuilder,
+                        typeArguments),
                     fileOffset,
                     _uri),
                 nonInstanceAccessIsError: true));
@@ -3160,6 +3169,12 @@
           isTypeArgumentsInForest: isTypeArgumentsInForest);
     }
   }
+
+  @override
+  applyTypeArguments(int fileOffset, List<UnresolvedType> typeArguments) {
+    return new TypeUseGenerator(_helper, token, declaration, targetName)
+      ..typeArguments = typeArguments;
+  }
 }
 
 enum ReadOnlyAccessKind {
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index f9c2d18..ff56187 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -153,6 +153,9 @@
           bodyBuilder.parseFieldInitializer(initializerToken);
       initializerToken = null;
 
+      // The type is needed in the inference below, so the helper should be set.
+      typeInferrer.helper = bodyBuilder;
+
       ExpressionInferenceResult result = typeInferrer.inferExpression(
           initializer, const UnknownType(), true,
           isVoidAllowed: true);
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 4d5889c..a78e798 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1370,9 +1370,11 @@
   }
 
   void visitShadowInvalidInitializer(ShadowInvalidInitializer node) {
-    inferrer.inferExpression(
+    ExpressionInferenceResult initializerResult = inferrer.inferExpression(
         node.variable.initializer, const UnknownType(), !inferrer.isTopLevel,
         isVoidAllowed: false);
+    node.variable.initializer = initializerResult.expression
+      ..parent = node.variable;
   }
 
   void visitShadowInvalidFieldInitializer(ShadowInvalidFieldInitializer node) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 3e30a03..eb47f3f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1229,7 +1229,9 @@
     if (loader.target.context.options
         .isExperimentEnabledGlobally(ExperimentalFlag.valueClass)) {
       valueClass.transformComponent(
-          component, loader.coreTypes, loader.hierarchy, environment);
+          component, loader.coreTypes, loader.hierarchy, environment,
+          useNewMethodInvocationEncoding:
+              backendTarget.supportsNewMethodInvocationEncoding);
       ticker.logMs("Lowered value classes");
     }
 
@@ -1301,7 +1303,7 @@
 
   void verify() {
     // TODO(ahe): How to handle errors.
-    verifyComponent(component,
+    verifyComponent(component, context.options.target,
         skipPlatform: context.options.skipPlatformVerification);
     ClassHierarchy hierarchy =
         new ClassHierarchy(component, new CoreTypes(component),
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 9a23516..d9b6147 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -9,6 +9,7 @@
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/target/targets.dart';
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
@@ -34,22 +35,24 @@
         getRedirectingFactoryBody,
         isRedirectingFactory;
 
-List<LocatedMessage> verifyComponent(Component component,
+List<LocatedMessage> verifyComponent(Component component, Target target,
     {bool isOutline, bool afterConst, bool skipPlatform: false}) {
   FastaVerifyingVisitor verifier =
-      new FastaVerifyingVisitor(isOutline, afterConst, skipPlatform);
+      new FastaVerifyingVisitor(target, isOutline, afterConst, skipPlatform);
   component.accept(verifier);
   return verifier.errors;
 }
 
 class FastaVerifyingVisitor extends VerifyingVisitor {
+  final Target target;
   final List<LocatedMessage> errors = <LocatedMessage>[];
 
   Uri fileUri;
   final List<TreeNode> treeNodeStack = <TreeNode>[];
   final bool skipPlatform;
 
-  FastaVerifyingVisitor(bool isOutline, bool afterConst, this.skipPlatform)
+  FastaVerifyingVisitor(
+      this.target, bool isOutline, bool afterConst, this.skipPlatform)
       : super(isOutline: isOutline, afterConst: afterConst);
 
   /// Invoked by all visit methods if the visited node is a [TreeNode].
@@ -426,6 +429,39 @@
   }
 
   @override
+  void visitMethodInvocation(MethodInvocation node) {
+    if (target.supportsNewMethodInvocationEncoding) {
+      problem(
+          node,
+          "New method invocation encoding is supported, "
+          "but found a MethodInvocation.");
+    }
+    super.visitMethodInvocation(node);
+  }
+
+  @override
+  void visitPropertyGet(PropertyGet node) {
+    if (target.supportsNewMethodInvocationEncoding) {
+      problem(
+          node,
+          "New method invocation encoding is supported, "
+          "but found a PropertyGet.");
+    }
+    super.visitPropertyGet(node);
+  }
+
+  @override
+  void visitPropertySet(PropertySet node) {
+    if (target.supportsNewMethodInvocationEncoding) {
+      problem(
+          node,
+          "New method invocation encoding is supported, "
+          "but found a PropertySet.");
+    }
+    super.visitPropertySet(node);
+  }
+
+  @override
   void defaultTreeNode(TreeNode node) {
     enterTreeNode(node);
     super.defaultTreeNode(node);
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index f857afd..1b40d03 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2186,7 +2186,7 @@
     // "constructor-tearoffs" feature is enabled.
     addProblem(
         templateExperimentNotEnabled.withArguments('constructor-tearoffs',
-            libraryBuilder.enableConstructorTearoffsVersionInLibrary.toText()),
+            libraryBuilder.enableConstructorTearOffsVersionInLibrary.toText()),
         token.charOffset,
         token.length);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 5c72e58..317a63f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -319,6 +319,7 @@
   bool _enableExtensionMethodsInLibrary;
   bool _enableGenericMetadataInLibrary;
   bool _enableExtensionTypesInLibrary;
+  bool _enableConstructorTearOffsInLibrary;
 
   bool get enableConstFunctionsInLibrary => _enableConstFunctionsInLibrary ??=
       loader.target.isExperimentEnabledInLibraryByVersion(
@@ -352,7 +353,14 @@
           .getExperimentEnabledVersionInLibrary(
               ExperimentalFlag.nonNullable, _packageUri ?? importUri);
 
-  Version get enableConstructorTearoffsVersionInLibrary =>
+  bool get enableConstructorTearOffsInLibrary =>
+      _enableConstructorTearOffsInLibrary ??= loader.target
+          .isExperimentEnabledInLibraryByVersion(
+              ExperimentalFlag.constructorTearoffs,
+              _packageUri ?? importUri,
+              languageVersion.version);
+
+  Version get enableConstructorTearOffsVersionInLibrary =>
       _enableConstructorTearoffsVersionInLibrary ??= loader.target
           .getExperimentEnabledVersionInLibrary(
               ExperimentalFlag.constructorTearoffs, _packageUri ?? importUri);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 6bb19ed..a02f453 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -737,12 +737,19 @@
               <Expression>[new NullLiteral()..fileOffset = fileOffset]))
         ..fileOffset = fileOffset;
     }
-    PropertyGet tearOff =
-        new PropertyGet(new VariableGet(t), callName, callMember)
-          ..fileOffset = fileOffset;
+    Expression tearOff;
     DartType tearoffType =
         getGetterTypeForMemberTarget(callMember, expressionType)
             .withDeclaredNullability(expressionType.nullability);
+    if (useNewMethodInvocationEncoding) {
+      tearOff = new InstanceTearOff(
+          InstanceAccessKind.Instance, new VariableGet(t), callName,
+          interfaceTarget: callMember, resultType: tearoffType)
+        ..fileOffset = fileOffset;
+    } else {
+      tearOff = new PropertyGet(new VariableGet(t), callName, callMember)
+        ..fileOffset = fileOffset;
+    }
     ConditionalExpression conditional = new ConditionalExpression(nullCheck,
         new NullLiteral()..fileOffset = fileOffset, tearOff, tearoffType);
     return new TypedTearoff(
@@ -3543,24 +3550,38 @@
               ..fileOffset = nullAwareAction.fileOffset);
       } else if (nullAwareAction is InstanceInvocation &&
           nullAwareAction.receiver == originalPropertyGet) {
+        // TODO(johnniwinther): Remove this when [MethodInvocation] is no longer
+        // used and [originalPropertyGet] can be an [InstanceGet].
+        InstanceGet instanceGet = originalPropertyGet;
         invocationResult = new ExpressionInferenceResult(
             invocationResult.inferredType,
-            new MethodInvocation(originalReceiver, originalName,
-                nullAwareAction.arguments, originalTarget)
+            new InstanceGetterInvocation(instanceGet.kind, originalReceiver,
+                originalName, nullAwareAction.arguments,
+                interfaceTarget: originalTarget,
+                functionType: nullAwareAction.functionType)
               ..fileOffset = nullAwareAction.fileOffset);
       } else if (nullAwareAction is DynamicInvocation &&
           nullAwareAction.receiver == originalPropertyGet) {
+        // TODO(johnniwinther): Remove this when [MethodInvocation] is no longer
+        // used and [originalPropertyGet] can be an [InstanceGet].
+        InstanceGet instanceGet = originalPropertyGet;
         invocationResult = new ExpressionInferenceResult(
             invocationResult.inferredType,
-            new MethodInvocation(originalReceiver, originalName,
-                nullAwareAction.arguments, originalTarget)
+            new InstanceGetterInvocation(instanceGet.kind, originalReceiver,
+                originalName, nullAwareAction.arguments,
+                interfaceTarget: originalTarget, functionType: null)
               ..fileOffset = nullAwareAction.fileOffset);
       } else if (nullAwareAction is FunctionInvocation &&
           nullAwareAction.receiver == originalPropertyGet) {
+        // TODO(johnniwinther): Remove this when [MethodInvocation] is no longer
+        // used and [originalPropertyGet] can be an [InstanceGet].
+        InstanceGet instanceGet = originalPropertyGet;
         invocationResult = new ExpressionInferenceResult(
             invocationResult.inferredType,
-            new MethodInvocation(originalReceiver, originalName,
-                nullAwareAction.arguments, originalTarget)
+            new InstanceGetterInvocation(instanceGet.kind, originalReceiver,
+                originalName, nullAwareAction.arguments,
+                interfaceTarget: originalTarget,
+                functionType: nullAwareAction.functionType)
               ..fileOffset = nullAwareAction.fileOffset);
       }
     }
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index b9737cc..f7c635b 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -104,7 +104,8 @@
     List<int> summary = null;
     if (buildSummary) {
       if (options.verify) {
-        for (LocatedMessage error in verifyComponent(summaryComponent)) {
+        for (LocatedMessage error
+            in verifyComponent(summaryComponent, options.target)) {
           options.report(error, Severity.error);
         }
       }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 198db8a..04c1037 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -1979,7 +1979,8 @@
     return await CompilerContext.runWithOptions(options,
         (compilerContext) async {
       compilerContext.uriToSource.addAll(component.uriToSource);
-      List<LocatedMessage> verificationErrors = verifyComponent(component,
+      List<LocatedMessage> verificationErrors = verifyComponent(
+          component, options.target,
           isOutline: !fullCompile, skipPlatform: true);
       assert(verificationErrors.isEmpty || messages.isNotEmpty);
       if (messages.isEmpty) {
diff --git a/pkg/front_end/test/issue_34856_test.dart b/pkg/front_end/test/issue_34856_test.dart
index 8d41b6f..396a0bb 100644
--- a/pkg/front_end/test/issue_34856_test.dart
+++ b/pkg/front_end/test/issue_34856_test.dart
@@ -97,7 +97,7 @@
   List<Object> errors = await CompilerContext.runWithOptions(
       new ProcessedOptions(options: options, inputs: inputs),
       (_) => new Future<List<Object>>.value(
-          verifyComponent(component, skipPlatform: true)));
+          verifyComponent(component, options.target, skipPlatform: true)));
 
   serializeComponent(component);
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
index 31c797b..b9e60e0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.expect
@@ -14,56 +14,26 @@
 // A<X> Function<X>(X) test3() => A.new; // Error.
 //                                  ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test4() => A<int>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test4() => A<int>.new; // Error.
 //                                       ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
 //                                               ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
 //                                               ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
 //                                               ^^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
index 5b92215..216d862 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.strong.transformed.expect
@@ -14,56 +14,26 @@
 // A<X> Function<X>(X) test3() => A.new; // Error.
 //                                  ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test4() => A<int>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test4() => A<int>.new; // Error.
 //                                       ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
 //                                               ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
 //                                               ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
 //                                               ^^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
index 31c797b..b9e60e0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.expect
@@ -14,56 +14,26 @@
 // A<X> Function<X>(X) test3() => A.new; // Error.
 //                                  ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test4() => A<int>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test4() => A<int>.new; // Error.
 //                                       ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
 //                                               ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
 //                                               ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
 //                                               ^^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
index 5b92215..216d862 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.transformed.expect
@@ -14,56 +14,26 @@
 // A<X> Function<X>(X) test3() => A.new; // Error.
 //                                  ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test4() => A<int>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:39: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test4() => A<int>.new; // Error.
 //                                       ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:47: Error: Getter not found: 'new'.
 // A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
 //                                               ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:39: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:47: Error: Getter not found: 'foo1'.
 // A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
 //                                               ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:39: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
 //                                       ^^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:33: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
-//                                 ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:47: Error: Getter not found: 'foo2'.
 // A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
 //                                               ^^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
index 264979c..bc6e6db 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.expect
@@ -6,11 +6,6 @@
 // testFoo() => A.foo; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooArgs() => A<int>.foo; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
 // testFooArgs() => A<int>.foo; // Ok.
 //                         ^^^
@@ -19,29 +14,14 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewArgs() => A<int>.new; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
 // testNewArgs() => A<int>.new; // Ok.
 //                         ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int, String>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int, String>.foo; // Error.
 //                                      ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int, String>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int, String>.new; // Error.
 //                                      ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
index 264979c..bc6e6db 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.strong.transformed.expect
@@ -6,11 +6,6 @@
 // testFoo() => A.foo; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooArgs() => A<int>.foo; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
 // testFooArgs() => A<int>.foo; // Ok.
 //                         ^^^
@@ -19,29 +14,14 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewArgs() => A<int>.new; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
 // testNewArgs() => A<int>.new; // Ok.
 //                         ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int, String>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int, String>.foo; // Error.
 //                                      ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int, String>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int, String>.new; // Error.
 //                                      ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
index 264979c..bc6e6db 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.expect
@@ -6,11 +6,6 @@
 // testFoo() => A.foo; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooArgs() => A<int>.foo; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
 // testFooArgs() => A<int>.foo; // Ok.
 //                         ^^^
@@ -19,29 +14,14 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewArgs() => A<int>.new; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
 // testNewArgs() => A<int>.new; // Ok.
 //                         ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int, String>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int, String>.foo; // Error.
 //                                      ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int, String>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int, String>.new; // Error.
 //                                      ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
index 264979c..bc6e6db 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.transformed.expect
@@ -6,11 +6,6 @@
 // testFoo() => A.foo; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooArgs() => A<int>.foo; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:11:25: Error: Getter not found: 'foo'.
 // testFooArgs() => A<int>.foo; // Ok.
 //                         ^^^
@@ -19,29 +14,14 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewArgs() => A<int>.new; // Ok.
-//                   ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:13:25: Error: Getter not found: 'new'.
 // testNewArgs() => A<int>.new; // Ok.
 //                         ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int, String>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:15:38: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int, String>.foo; // Error.
 //                                      ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int, String>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:16:38: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int, String>.new; // Error.
 //                                      ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
index 7444b68..fac585b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.expect
@@ -26,20 +26,10 @@
 // A<dynamic> Function(String) test6() => A.new; // Error.
 //                                          ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
 // A<dynamic> Function(num) test7() => A<num>.foo; // Error.
 //                                            ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test8() => A<num>.new; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
 // A<dynamic> Function(num) test8() => A<num>.new; // Error.
 //                                            ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
index 3a5a5ad..3bcaa2b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.strong.transformed.expect
@@ -26,20 +26,10 @@
 // A<dynamic> Function(String) test6() => A.new; // Error.
 //                                          ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
 // A<dynamic> Function(num) test7() => A<num>.foo; // Error.
 //                                            ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test8() => A<num>.new; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
 // A<dynamic> Function(num) test8() => A<num>.new; // Error.
 //                                            ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
index 7444b68..fac585b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.expect
@@ -26,20 +26,10 @@
 // A<dynamic> Function(String) test6() => A.new; // Error.
 //                                          ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
 // A<dynamic> Function(num) test7() => A<num>.foo; // Error.
 //                                            ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test8() => A<num>.new; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
 // A<dynamic> Function(num) test8() => A<num>.new; // Error.
 //                                            ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
index 3a5a5ad..3bcaa2b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.transformed.expect
@@ -26,20 +26,10 @@
 // A<dynamic> Function(String) test6() => A.new; // Error.
 //                                          ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test7() => A<num>.foo; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:44: Error: Getter not found: 'foo'.
 // A<dynamic> Function(num) test7() => A<num>.foo; // Error.
 //                                            ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// A<dynamic> Function(num) test8() => A<num>.new; // Error.
-//                                      ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:18:44: Error: Getter not found: 'new'.
 // A<dynamic> Function(num) test8() => A<num>.new; // Error.
 //                                            ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
index 4374264..a888351 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.expect
@@ -10,20 +10,10 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int>.foo; // Error.
 //                              ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int>.new; // Error.
 //                              ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
index 4374264..a888351 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.strong.transformed.expect
@@ -10,20 +10,10 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int>.foo; // Error.
 //                              ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int>.new; // Error.
 //                              ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
index 4374264..a888351 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.expect
@@ -10,20 +10,10 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int>.foo; // Error.
 //                              ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int>.new; // Error.
 //                              ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
index 4374264..a888351 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.transformed.expect
@@ -10,20 +10,10 @@
 // testNew() => A.new; // Ok.
 //                ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testFooExtraArgs() => A<int>.foo; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:13:30: Error: Getter not found: 'foo'.
 // testFooExtraArgs() => A<int>.foo; // Error.
 //                              ^^^
 //
-// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
-// testNewExtraArgs() => A<int>.new; // Error.
-//                        ^
-//
 // pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:14:30: Error: Getter not found: 'new'.
 // testNewExtraArgs() => A<int>.new; // Error.
 //                              ^^^
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart
new file mode 100644
index 0000000..74e7330
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() => List<int>;
+
+bar() {
+  Type listString = List<String>;
+  return listString;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.expect
new file mode 100644
index 0000000..1b3499a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic
+  return #C1;
+static method bar() → dynamic {
+  core::Type listString = #C2;
+  return listString;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::List<core::int>)
+  #C2 = TypeLiteralConstant(core::List<core::String>)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.transformed.expect
new file mode 100644
index 0000000..1b3499a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic
+  return #C1;
+static method bar() → dynamic {
+  core::Type listString = #C2;
+  return listString;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::List<core::int>)
+  #C2 = TypeLiteralConstant(core::List<core::String>)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.textual_outline.expect
new file mode 100644
index 0000000..aef55ff
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+foo() => List<int>;
+bar() {}
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.expect
new file mode 100644
index 0000000..1e0382a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic
+  return #C1;
+static method bar() → dynamic {
+  core::Type listString = #C2;
+  return listString;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::List<core::int*>*)
+  #C2 = TypeLiteralConstant(core::List<core::String*>*)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.outline.expect
new file mode 100644
index 0000000..0409188
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.outline.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method foo() → dynamic
+  ;
+static method bar() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.transformed.expect
new file mode 100644
index 0000000..1e0382a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic
+  return #C1;
+static method bar() → dynamic {
+  core::Type listString = #C2;
+  return listString;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::List<core::int*>*)
+  #C2 = TypeLiteralConstant(core::List<core::String*>*)
+}
diff --git a/pkg/front_end/testcases/dart2js/list_generate.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/list_generate.dart.strong.transformed.expect
index c99286d..13f5e0e 100644
--- a/pkg/front_end/testcases/dart2js/list_generate.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/list_generate.dart.strong.transformed.expect
@@ -6,9 +6,9 @@
 static method main() → dynamic {
   block {
     final _in::JSArray<core::int> _list = _in::JSArray::allocateGrowable<core::int>(10);
-    for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int*) → core::int*}) {
       core::int i = i;
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i.{core::num::*}(2){(core::num) → core::int});
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i.{core::num::*}(2){(core::num) → core::int}){(core::int, core::int) → void};
     }
   } =>_list;
 }
diff --git a/pkg/front_end/testcases/dart2js/list_generate.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/list_generate.dart.weak.transformed.expect
index c99286d..13f5e0e 100644
--- a/pkg/front_end/testcases/dart2js/list_generate.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/list_generate.dart.weak.transformed.expect
@@ -6,9 +6,9 @@
 static method main() → dynamic {
   block {
     final _in::JSArray<core::int> _list = _in::JSArray::allocateGrowable<core::int>(10);
-    for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int*) → core::int*}) {
       core::int i = i;
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i.{core::num::*}(2){(core::num) → core::int});
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, i.{core::num::*}(2){(core::num) → core::int}){(core::int, core::int) → void};
     }
   } =>_list;
 }
diff --git a/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.strong.transformed.expect
index e8cb15b..286ab36 100644
--- a/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.strong.transformed.expect
@@ -8,9 +8,9 @@
     return i.{core::num::*}(2){(core::num) → core::int};
   block {
     final _in::JSArray<core::int> _list = _in::JSArray::allocateGrowable<core::int>(10);
-    for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int*) → core::int*}) {
       core::int i = i;
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, localFunction(i){(core::int) → core::int});
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, localFunction(i){(core::int) → core::int}){(core::int, core::int) → void};
     }
   } =>_list;
 }
diff --git a/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.transformed.expect
index e8cb15b..286ab36 100644
--- a/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.transformed.expect
@@ -8,9 +8,9 @@
     return i.{core::num::*}(2){(core::num) → core::int};
   block {
     final _in::JSArray<core::int> _list = _in::JSArray::allocateGrowable<core::int>(10);
-    for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::int*) → core::int*}) {
       core::int i = i;
-      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, localFunction(i){(core::int) → core::int});
+      _list.{_in::JSArray::[]=}{Invariant,BoundsSafe}(i, localFunction(i){(core::int) → core::int}){(core::int, core::int) → void};
     }
   } =>_list;
 }
diff --git a/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect b/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
index 59ee272..175aec2 100644
--- a/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
@@ -3,5 +3,5 @@
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
   return block {
     final dart.core::Set<dart.core::String*>* #t1 = new dart.collection::_CompactLinkedHashSet::•<dart.core::String*>();
-    #t1.{dart.core::Set::add}("a"){(dart.core::String*) →* dart.core::bool*};
+    #t1.{dart.core::Set::add}{Invariant}("a"){(dart.core::String*) →* dart.core::bool*};
   } =>#t1;
diff --git a/pkg/front_end/testcases/general/bug32426.dart.weak.expect b/pkg/front_end/testcases/general/bug32426.dart.weak.expect
index 5a79b65..3e48d58 100644
--- a/pkg/front_end/testcases/general/bug32426.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug32426.dart.weak.expect
@@ -36,7 +36,7 @@
 }
 static method main() → dynamic {
   self::I* i = new self::C::•();
-  ([core::int*]) →* void f = (let final self::I* #t1 = i in #t1 == null ?{() →* void} null : #t1.{self::I::call}) as{TypeError} ([core::int*]) →* void;
+  ([core::int*]) →* void f = (let final self::I* #t1 = i in #t1 == null ?{() →* void} null : #t1.{self::I::call}{() →* void}) as{TypeError} ([core::int*]) →* void;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/bug32426.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug32426.dart.weak.transformed.expect
index 5a79b65..3e48d58 100644
--- a/pkg/front_end/testcases/general/bug32426.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug32426.dart.weak.transformed.expect
@@ -36,7 +36,7 @@
 }
 static method main() → dynamic {
   self::I* i = new self::C::•();
-  ([core::int*]) →* void f = (let final self::I* #t1 = i in #t1 == null ?{() →* void} null : #t1.{self::I::call}) as{TypeError} ([core::int*]) →* void;
+  ([core::int*]) →* void f = (let final self::I* #t1 = i in #t1 == null ?{() →* void} null : #t1.{self::I::call}{() →* void}) as{TypeError} ([core::int*]) →* void;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/bug32629.dart.weak.expect b/pkg/front_end/testcases/general/bug32629.dart.weak.expect
index 4965806..7b0256f 100644
--- a/pkg/front_end/testcases/general/bug32629.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug32629.dart.weak.expect
@@ -32,6 +32,6 @@
 static method test() → void {
   self::foo<core::String*>(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/general/bug32629.dart:16:19: Error: The argument type 'dynamic Function(dynamic, dynamic)' can't be assigned to the parameter type 'String Function(String, dynamic)'.
   foo<String>(new A());
-                  ^" in (let final self::A* #t2 = new self::A::•() in #t2 == null ?{(dynamic, dynamic) →* dynamic} null : #t2.{self::A::call}) as{TypeError} (core::String*, dynamic) →* core::String*);
+                  ^" in (let final self::A* #t2 = new self::A::•() in #t2 == null ?{(dynamic, dynamic) →* dynamic} null : #t2.{self::A::call}{(dynamic, dynamic) →* dynamic}) as{TypeError} (core::String*, dynamic) →* core::String*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug32629.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug32629.dart.weak.transformed.expect
index 4965806..7b0256f 100644
--- a/pkg/front_end/testcases/general/bug32629.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug32629.dart.weak.transformed.expect
@@ -32,6 +32,6 @@
 static method test() → void {
   self::foo<core::String*>(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/general/bug32629.dart:16:19: Error: The argument type 'dynamic Function(dynamic, dynamic)' can't be assigned to the parameter type 'String Function(String, dynamic)'.
   foo<String>(new A());
-                  ^" in (let final self::A* #t2 = new self::A::•() in #t2 == null ?{(dynamic, dynamic) →* dynamic} null : #t2.{self::A::call}) as{TypeError} (core::String*, dynamic) →* core::String*);
+                  ^" in (let final self::A* #t2 = new self::A::•() in #t2 == null ?{(dynamic, dynamic) →* dynamic} null : #t2.{self::A::call}{(dynamic, dynamic) →* dynamic}) as{TypeError} (core::String*, dynamic) →* core::String*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.weak.expect b/pkg/front_end/testcases/general/bug33298.dart.weak.expect
index aec468a..06e4055 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.weak.expect
@@ -63,14 +63,14 @@
 static method test() → dynamic {
   self::A* a = new self::A::•();
   core::List<core::String*>* list1 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(a.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
-  core::List<core::String*>* list2 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list2 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   self::B<core::String*>* b = new self::B::•<core::String*>();
   core::List<core::String*>* list3 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
-  core::List<core::String*>* list4 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list4 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   self::C* c = new self::C::•();
   core::List<core::String*>* list5 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(c.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}<core::String*>){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final Never* #t3 = invalid-expression "pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
-                                           ^" in (let final self::C* #t4 = c in #t4 == null ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*} as{TypeError} core::List<core::String*>*;
+                                           ^" in (let final self::C* #t4 = c in #t4 == null ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}) as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*} as{TypeError} core::List<core::String*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
index 842cb5d..8558dba 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.weak.transformed.expect
@@ -63,14 +63,14 @@
 static method test() → dynamic {
   self::A* a = new self::A::•();
   core::List<core::String*>* list1 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(a.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
-  core::List<core::String*>* list2 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list2 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   self::B<core::String*>* b = new self::B::•<core::String*>();
   core::List<core::String*>* list3 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
-  core::List<core::String*>* list4 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list4 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   self::C* c = new self::C::•();
   core::List<core::String*>* list5 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<core::String*>(c.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}<core::String*>){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
   core::List<core::String*>* list6 = core::_GrowableList::_literal3<core::String*>("a", "b", "c").{core::Iterable::map}<dynamic>(let final Never* #t3 = invalid-expression "pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
-                                           ^" in (let final self::C* #t4 = c in #t4 == null ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*} as{TypeError} core::List<core::String*>*;
+                                           ^" in (let final self::C* #t4 = c in #t4 == null ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}) as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*} as{TypeError} core::List<core::String*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.weak.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.expect
index 17e5cd7..12996fd 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.expect
@@ -402,7 +402,7 @@
 static const field core::List<core::String*>* bar = #C10;
 static field core::List<core::String*>* barAsVar = block {
   final core::List<core::String*>* #t1 = core::List::of<core::String*>(#C8);
-  #t1.{core::List::add}("!"){(core::String*) →* void};
+  #t1.{core::List::add}{Invariant}("!"){(core::String*) →* void};
 } =>#t1;
 static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
 static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
@@ -476,7 +476,7 @@
   core::print(#C22);
   core::print( block {
     final core::Set<core::String*>* #t2 = col::LinkedHashSet::•<core::String*>();
-    #t2.{core::Set::add}("hello"){(core::String*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}("hello"){(core::String*) →* core::bool*};
   } =>#t2);
   core::print(#C26);
 }
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.transformed.expect
index 7255d4a..dd0ac62 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.transformed.expect
@@ -402,7 +402,7 @@
 static const field core::List<core::String*>* bar = #C10;
 static field core::List<core::String*>* barAsVar = block {
   final core::List<core::String*>* #t1 = core::List::of<core::String*>(#C8);
-  #t1.{core::List::add}("!"){(core::String*) →* void};
+  #t1.{core::List::add}{Invariant}("!"){(core::String*) →* void};
 } =>#t1;
 static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
 static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
@@ -476,7 +476,7 @@
   core::print(#C22);
   core::print( block {
     final core::Set<core::String*>* #t2 = new col::_CompactLinkedHashSet::•<core::String*>();
-    #t2.{core::Set::add}("hello"){(core::String*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}("hello"){(core::String*) →* core::bool*};
   } =>#t2);
   core::print(#C26);
 }
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.weak.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.expect
index 4d5fd14..ca02ce0 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.weak.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.expect
@@ -7,61 +7,61 @@
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[1];
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
     else
-      #t1.{core::List::add}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4){(core::int*) →* void};
+        #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t1.{core::List::add}(i){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(i){(core::int*) →* void};
+        #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t1.{core::List::add}(i){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4){(core::int*) →* core::bool*};
+        #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+        #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1){(core::int*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(2, 2){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(3, 3){(core::int*, core::int*) →* void};
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(){() →* core::int*}, 1.{core::int::unary-}(){() →* core::int*}){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(){() →* core::int*}, 1.{core::int::unary-}(){() →* core::int*}){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(4, 4){(core::int*, core::int*) →* void};
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.transformed.expect
index f427951..a7fe03f 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.transformed.expect
@@ -7,19 +7,19 @@
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = core::_GrowableList::_literal1<core::int*>(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
     else
-      #t1.{core::List::add}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4){(core::int*) →* void};
+        #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
     {
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(5, 6, 7).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t1.{core::List::add}(i){(core::int*) →* void};
+        #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
       }
     }
     {
@@ -27,29 +27,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t1.{core::List::add}(i){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t1.{core::List::add}(i){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::bool*};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4){(core::int*) →* core::bool*};
+        #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
     {
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(5, 6, 7).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+        #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
       }
     }
     {
@@ -57,29 +57,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+          #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t2.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1){(core::int*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(2, 2){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(3, 3){(core::int*, core::int*) →* void};
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(){() →* core::int*}, 1.{core::int::unary-}(){() →* core::int*}){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(){() →* core::int*}, 1.{core::int::unary-}(){() →* core::int*}){(core::int*, core::int*) →* void};
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(4, 4){(core::int*, core::int*) →* void};
     {
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(5, 6, 7).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
       }
     }
     {
@@ -87,11 +87,11 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+          #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t3.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.expect
index 6c11dcc..2a12c98 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.expect
@@ -454,181 +454,181 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t3.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar){(dynamic) →* void};
+      #t4.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar){(dynamic) →* core::bool*};
-    #t5.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t5.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar){(core::String*, dynamic) →* void};
-    #t6.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t6.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(<core::int*>[42]){(core::List<core::int*>*) →* void};
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* void};
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
-    #t8.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
-    #t9.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
+    #t9.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t10.{core::List::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+      #t10.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
   } =>#t10;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t11.{core::Set::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
-    #t11.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t11.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t11.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t11;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t12 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::int*>* #t13 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t12.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t12;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t14 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t14.{core::List::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+      #t14.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
   } =>#t14;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t15 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t15.{core::Set::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
-    #t15.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t15.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t15.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t15;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t16 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, dynamic>* #t17 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}{core::String*}, #t17.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
-    #t16.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{core::String*}, #t17.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t16.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t16;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t18 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t18.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t18.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t18;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t19 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t19.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t19.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t19.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t19.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t19;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t20 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t21 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}{core::String*}, #t21.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t20.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::String*}, #t21.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t20.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t20;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t22 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t22.{core::List::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+        #t22.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
   } =>#t22;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t23 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t23.{core::Set::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
-    #t23.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t23.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t23.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t23;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t24 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::int*>* #t25 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-          #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}{core::String*}, #t25.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t24.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}{core::String*}, #t25.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t24.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t24;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t26 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t26.{core::List::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+        #t26.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
   } =>#t26;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t27 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t27.{core::Set::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
-    #t27.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t27.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t27.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t27;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t28 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, dynamic>* #t29 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
-          #t28.{core::Map::[]=}(#t29.{core::MapEntry::key}{core::String*}, #t29.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
-    #t28.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+          #t28.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}{core::String*}, #t29.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t28.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t28;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t30 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t30.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t30.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t30;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t31 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t31.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t31.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t31.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t31.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t31;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t32 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t32.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t32.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t32;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t34 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t34.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t34.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t34;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t35 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t35.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t35.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t35.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t35.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t35;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -636,279 +636,279 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t36 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t36.{core::List::addAll}( block {
+      #t36.{core::List::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
-        #t37.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+        #t37.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
       } =>#t37){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t36;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t38 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t38.{core::Set::addAll}( block {
+      #t38.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
-        #t39.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+        #t39.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
       } =>#t39){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t38.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+    #t38.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t38;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t40.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t40.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t40;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t41 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t41.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t41.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t41.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t41.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t41;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}{core::String*}, #t43.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t42.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}{core::String*}, #t43.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t42.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t42;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t44 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t44.{core::List::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+      #t44.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
   } =>#t44;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t45 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t45.{core::Set::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
-    #t45.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t45.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t45.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t45;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t46 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::int*>* #t47 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t46.{core::Map::[]=}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t46.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+        #t46.{core::Map::[]=}{Invariant}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t46.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t46;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t48 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t48.{core::List::addAll}( block {
+      #t48.{core::List::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t49 = col::LinkedHashSet::•<core::int*>();
       } =>#t49){(core::Iterable<core::int*>*) →* void};
   } =>#t48;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t50 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t50.{core::Set::addAll}( block {
+      #t50.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
       } =>#t51){(core::Iterable<core::int*>*) →* void};
-    #t50.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t50.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t50;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t52 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t52.{core::List::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+        #t52.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
   } =>#t52;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t53 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t53.{core::Set::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
-    #t53.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t53.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t53.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t53;
   core::Map<core::String*, core::int*>* map52 = block {
     final core::Map<core::String*, core::int*>* #t54 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::int*>* #t55 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-          #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::String*}, #t55.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t54.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t54.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::String*}, #t55.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t54.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t54;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t56.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t56.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t56;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t57 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t57.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t57.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t57.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t57.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t57;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t58 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t59 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-        #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}{core::String*}, #t59.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t58.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}{core::String*}, #t59.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t58.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t58;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t60 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t60.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t60.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t60;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t61 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t61.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t61.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t61.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t61.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t61;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}{core::String*}, #t63.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t62.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t62.{core::Map::[]=}{Invariant}(#t63.{core::MapEntry::key}{core::String*}, #t63.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t62.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t62;
   core::List<core::List<core::int*>*>* list70 = block {
     final core::List<core::List<core::int*>*>* #t64 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t64.{core::List::add}(<core::int*>[]){(core::List<core::int*>*) →* void};
+      #t64.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
   } =>#t64;
   core::Set<core::List<core::int*>*>* set70 = block {
     final core::Set<core::List<core::int*>*>* #t65 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t65.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
-    #t65.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t65.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t65.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t65;
   core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t66 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t66.{core::List::add}(<core::int*>[]){(core::List<core::int*>*) →* void};
+        #t66.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
   } =>#t66;
   core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t67 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t67.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
-    #t67.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t67.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t67.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t67;
   core::List<core::num*>* list80 = block {
     final core::List<core::num*>* #t68 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t68.{core::List::add}(42){(core::num*) →* void};
+      #t68.{core::List::add}{Invariant}(42){(core::num*) →* void};
     else
-      #t68.{core::List::add}(3.14){(core::num*) →* void};
+      #t68.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
   } =>#t68;
   core::Set<core::num*>* set80 = block {
     final core::Set<core::num*>* #t69 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t69.{core::Set::add}(42){(core::num*) →* core::bool*};
+      #t69.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
     else
-      #t69.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t69.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t69.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t69.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t69;
   core::Map<core::String*, core::num*>* map80 = block {
     final core::Map<core::String*, core::num*>* #t70 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t70.{core::Map::[]=}("bar", 42){(core::String*, core::num*) →* void};
+      #t70.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
     else
-      #t70.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t70.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+      #t70.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t70.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t70;
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t71 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t71.{core::List::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t71.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t71.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+      #t71.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t71;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t72 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t72.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t72.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t72.{core::Set::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
-    #t72.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t72.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t72.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t72;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t73 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::num*>* #t74 in mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-        #t73.{core::Map::[]=}(#t74.{core::MapEntry::key}{core::String*}, #t74.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+        #t73.{core::Map::[]=}{Invariant}(#t74.{core::MapEntry::key}{core::String*}, #t74.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
     else
       for (final core::MapEntry<core::String*, core::num*>* #t75 in mapToDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}{core::String*}, #t75.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
-    #t73.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+        #t73.{core::Map::[]=}{Invariant}(#t75.{core::MapEntry::key}{core::String*}, #t75.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    #t73.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t73;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t76 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t76.{core::List::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+      #t76.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
     else
-      #t76.{core::List::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+      #t76.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
   } =>#t76;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t77.{core::Set::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+      #t77.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
     else
-      #t77.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t77.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t77.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t77.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t77;
   core::Set<dynamic>* map82 = block {
     final core::Set<dynamic>* #t78 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t78.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t78.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^"){(dynamic) →* core::bool*};
     else
-      #t78.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t78.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t78.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t78.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t78;
   core::List<core::num*>* list83 = block {
     final core::List<core::num*>* #t79 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t79.{core::List::add}(42){(core::num*) →* void};
+      #t79.{core::List::add}{Invariant}(42){(core::num*) →* void};
     else
-      #t79.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+      #t79.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t79;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t80 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t80.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t80.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t80.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t80.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t80.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t80.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t80;
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t81 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::num*>* #t82 in mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-        #t81.{core::Map::[]=}(#t82.{core::MapEntry::key}{core::String*}, #t82.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+        #t81.{core::Map::[]=}{Invariant}(#t82.{core::MapEntry::key}{core::String*}, #t82.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
     else
-      #t81.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t81.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+      #t81.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t81.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t81;
   core::List<core::int*>* list90 = block {
     final core::List<core::int*>* #t83 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t83.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+      #t83.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
   } =>#t83;
   core::Set<core::int*>* set90 = block {
     final core::Set<core::int*>* #t84 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t84.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t84.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t84.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t84.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t84;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t85 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t85.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
-    #t85.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t85.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t85.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t85;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t86 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t87 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
         final core::int* #t88 = #t87 as{TypeError} core::int*;
-        #t86.{core::List::add}(#t88){(core::int*) →* void};
+        #t86.{core::List::add}{Invariant}(#t88){(core::int*) →* void};
       }
   } =>#t86;
   core::Set<core::int*>* set91 = block {
@@ -916,9 +916,9 @@
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t90 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
         final core::int* #t91 = #t90 as{TypeError} core::int*;
-        #t89.{core::Set::add}(#t91){(core::int*) →* core::bool*};
+        #t89.{core::Set::add}{Invariant}(#t91){(core::int*) →* core::bool*};
       }
-    #t89.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t89.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t89;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t92 = <core::String*, core::int*>{};
@@ -926,64 +926,64 @@
       for (final core::MapEntry<dynamic, dynamic>* #t93 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}) {
         final core::String* #t94 = #t93.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
         final core::int* #t95 = #t93.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-        #t92.{core::Map::[]=}(#t94, #t95){(core::String*, core::int*) →* void};
+        #t92.{core::Map::[]=}{Invariant}(#t94, #t95){(core::String*, core::int*) →* void};
       }
-    #t92.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t92.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t92;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t96 = <core::int*>[];
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t96.{core::List::add}(42){(core::int*) →* void};
+      #t96.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t96;
   core::Set<core::int*>* set100 = block {
     final core::Set<core::int*>* #t97 = col::LinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t97.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t97.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t97;
   core::Map<core::int*, core::int*>* map100 = block {
     final core::Map<core::int*, core::int*>* #t98 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::Map::[]=}(42, 42){(core::int*, core::int*) →* void};
+      #t98.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
   } =>#t98;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
     final core::List<core::int*>* #t99 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::List::add}(let final Never* #t100 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t99.{core::List::add}{Invariant}(let final Never* #t100 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
   } =>#t99;
   block {
     final core::Set<core::int*>* #t101 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t101.{core::Set::add}(let final Never* #t102 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t101.{core::Set::add}{Invariant}(let final Never* #t102 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
-    #t101.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t101.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t101;
   block {
     final core::Map<core::String*, core::int*>* #t103 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t103.{core::Map::[]=}("bar", let final Never* #t104 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t103.{core::Map::[]=}{Invariant}("bar", let final Never* #t104 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*){(core::String*, core::int*) →* void};
-    #t103.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t103.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t103;
   block {
     final core::List<core::int*>* #t105 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t105.{core::List::addAll}(<core::int*>[let final Never* #t106 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t105.{core::List::addAll}{Invariant}(<core::int*>[let final Never* #t106 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
   } =>#t105;
   block {
     final core::Set<core::int*>* #t107 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t107.{core::Set::addAll}(<core::int*>[let final Never* #t108 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t107.{core::Set::addAll}{Invariant}(<core::int*>[let final Never* #t108 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
-    #t107.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t107.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t107;
   block {
     final core::Map<core::String*, core::int*>* #t109 = <core::String*, core::int*>{};
@@ -991,13 +991,13 @@
       for (final core::MapEntry<core::String*, core::int*>* #t110 in <core::String*, core::int*>{"bar": let final Never* #t111 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t109.{core::Map::[]=}(#t110.{core::MapEntry::key}{core::String*}, #t110.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t109.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+        #t109.{core::Map::[]=}{Invariant}(#t110.{core::MapEntry::key}{core::String*}, #t110.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t109.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t109;
   block {
     final core::List<core::int*>* #t112 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t112.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t112.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^"){(core::int*) →* void};
@@ -1005,11 +1005,11 @@
   block {
     final core::Set<core::int*>* #t113 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t113.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t113.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^"){(core::int*) →* core::bool*};
-    #t113.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t113.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t113;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1021,58 +1021,58 @@
   block {
     final core::List<core::String*>* #t114 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t114.{core::List::add}(let final Never* #t115 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t114.{core::List::add}{Invariant}(let final Never* #t115 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
     else
-      #t114.{core::List::add}(let final Never* #t116 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t114.{core::List::add}{Invariant}(let final Never* #t116 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
   } =>#t114;
   block {
     final core::Set<core::String*>* #t117 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t117.{core::Set::add}(let final Never* #t118 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t117.{core::Set::add}{Invariant}(let final Never* #t118 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
     else
-      #t117.{core::Set::add}(let final Never* #t119 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t117.{core::Set::add}{Invariant}(let final Never* #t119 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
-    #t117.{core::Set::add}(null){(core::String*) →* core::bool*};
+    #t117.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
   } =>#t117;
   block {
     final core::Map<core::String*, core::String*>* #t120 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t120.{core::Map::[]=}("bar", let final Never* #t121 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t120.{core::Map::[]=}{Invariant}("bar", let final Never* #t121 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
     else
-      #t120.{core::Map::[]=}("baz", let final Never* #t122 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t120.{core::Map::[]=}{Invariant}("baz", let final Never* #t122 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
-    #t120.{core::Map::[]=}("baz", null){(core::String*, core::String*) →* void};
+    #t120.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
   } =>#t120;
   block {
     final core::List<core::int*>* #t123 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t123.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t123.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^"){(core::int*) →* void};
     else
-      #t123.{core::List::add}(42){(core::int*) →* void};
+      #t123.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t123;
   block {
     final core::Set<core::int*>* #t124 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t124.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^"){(core::int*) →* core::bool*};
     else
-      #t124.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t124.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t124.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t124.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t124;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1084,9 +1084,9 @@
   block {
     final core::List<core::int*>* #t125 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::List::add}(42){(core::int*) →* void};
+      #t125.{core::List::add}{Invariant}(42){(core::int*) →* void};
     else
-      #t125.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t125.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^"){(core::int*) →* void};
@@ -1094,13 +1094,13 @@
   block {
     final core::Set<core::int*>* #t126 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t126.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^"){(core::int*) →* core::bool*};
     else
-      #t126.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t126.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t126.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t126.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t126;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1132,63 +1132,63 @@
     if(let final Never* #t128 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t127.{core::List::add}(42){(core::int*) →* void};
+      #t127.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t127;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t129 = col::LinkedHashSet::•<core::int*>();
     if(let final Never* #t130 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t129.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t129.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t129;
   core::Map<core::int*, core::int*>* map30 = block {
     final core::Map<core::int*, core::int*>* #t131 = <core::int*, core::int*>{};
     if(let final Never* #t132 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t131.{core::Map::[]=}(42, 42){(core::int*, core::int*) →* void};
+      #t131.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
   } =>#t131;
   core::List<core::String*>* list40 = block {
     final core::List<core::String*>* #t133 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t133.{core::List::add}(let final Never* #t134 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t133.{core::List::add}{Invariant}(let final Never* #t134 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*){(core::String*) →* void};
     else
-      #t133.{core::List::add}(let final Never* #t135 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t133.{core::List::add}{Invariant}(let final Never* #t135 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
   } =>#t133;
   core::Set<core::String*>* set40 = block {
     final core::Set<core::String*>* #t136 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t136.{core::Set::add}(let final Never* #t137 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t136.{core::Set::add}{Invariant}(let final Never* #t137 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*){(core::String*) →* core::bool*};
     else
-      #t136.{core::Set::add}(let final Never* #t138 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t136.{core::Set::add}{Invariant}(let final Never* #t138 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
   } =>#t136;
   core::Map<core::String*, core::int*>* map40 = block {
     final core::Map<core::String*, core::int*>* #t139 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(let final Never* #t140 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t139.{core::Map::[]=}{Invariant}(let final Never* #t140 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
     else
-      #t139.{core::Map::[]=}(let final Never* #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t139.{core::Map::[]=}{Invariant}(let final Never* #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
   } =>#t139;
   core::Map<core::int*, core::String*>* map41 = block {
     final core::Map<core::int*, core::String*>* #t142 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Map::[]=}(42, let final Never* #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t142.{core::Map::[]=}{Invariant}(42, let final Never* #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*){(core::int*, core::String*) →* void};
     else
-      #t142.{core::Map::[]=}(42, let final Never* #t144 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t142.{core::Map::[]=}{Invariant}(42, let final Never* #t144 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*){(core::int*, core::String*) →* void};
   } =>#t142;
@@ -1197,481 +1197,481 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t145 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t145.{core::List::add}(42){(core::int*) →* void};
+      #t145.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t145;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t146 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t146.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t146.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t146.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t146.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t146;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t147 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t147.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t147.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t147.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t147.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t147;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t148 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t148.{core::List::add}(dynVar){(dynamic) →* void};
+      #t148.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
   } =>#t148;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t149 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t149.{core::Set::add}(dynVar){(dynamic) →* core::bool*};
-    #t149.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t149.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t149.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t149;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t150 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t150.{core::Map::[]=}("bar", dynVar){(core::String*, dynamic) →* void};
-    #t150.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t150.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t150.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t150;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t151 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t151.{core::List::add}(<core::int*>[42]){(core::List<core::int*>*) →* void};
+      #t151.{core::List::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* void};
   } =>#t151;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t152 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t152.{core::Set::add}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
-    #t152.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t152.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+    #t152.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t152;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t153 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t153.{core::Map::[]=}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
-    #t153.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t153.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
+    #t153.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t153;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t154 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t154.{core::List::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+      #t154.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
   } =>#t154;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t155 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t155.{core::Set::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
-    #t155.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t155.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t155.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t155;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t156 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, core::int*>* #t157 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t156.{core::Map::[]=}(#t157.{core::MapEntry::key}{core::String*}, #t157.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t156.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+        #t156.{core::Map::[]=}{Invariant}(#t157.{core::MapEntry::key}{core::String*}, #t157.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t156.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t156;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t158 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t158.{core::List::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+      #t158.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
   } =>#t158;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t159 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t159.{core::Set::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
-    #t159.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t159.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t159.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t159;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t160 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, dynamic>* #t161 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
-        #t160.{core::Map::[]=}(#t161.{core::MapEntry::key}{core::String*}, #t161.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
-    #t160.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+        #t160.{core::Map::[]=}{Invariant}(#t161.{core::MapEntry::key}{core::String*}, #t161.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t160.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t160;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t162 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t162.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t162.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t162;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t163 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t163.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t163.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t163.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t163.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t163;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t164 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t165 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-        #t164.{core::Map::[]=}(#t165.{core::MapEntry::key}{core::String*}, #t165.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t164.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t164.{core::Map::[]=}{Invariant}(#t165.{core::MapEntry::key}{core::String*}, #t165.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t164.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t164;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t166 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t166.{core::List::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+        #t166.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
   } =>#t166;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t167.{core::Set::addAll}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
-    #t167.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t167.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t167.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t167;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t168 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::int*>* #t169 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-          #t168.{core::Map::[]=}(#t169.{core::MapEntry::key}{core::String*}, #t169.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t168.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t168.{core::Map::[]=}{Invariant}(#t169.{core::MapEntry::key}{core::String*}, #t169.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t168.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t168;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t170 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t170.{core::List::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+        #t170.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
   } =>#t170;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t171 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t171.{core::Set::addAll}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
-    #t171.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t171.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t171.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t171;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t172 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, dynamic>* #t173 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
-          #t172.{core::Map::[]=}(#t173.{core::MapEntry::key}{core::String*}, #t173.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
-    #t172.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+          #t172.{core::Map::[]=}{Invariant}(#t173.{core::MapEntry::key}{core::String*}, #t173.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t172.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t172;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t174 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t174.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t174.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t174;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t175 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t175.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t175.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t175.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t175.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t175;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t176 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t177 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t176.{core::Map::[]=}(#t177.{core::MapEntry::key}{core::String*}, #t177.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t176.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t176.{core::Map::[]=}{Invariant}(#t177.{core::MapEntry::key}{core::String*}, #t177.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t176.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t176;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t178 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t178.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t178.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t178;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t179 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t179.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t179.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t179.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t179.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t179;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t180 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t181 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-        #t180.{core::Map::[]=}(#t181.{core::MapEntry::key}{core::String*}, #t181.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t180.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t180.{core::Map::[]=}{Invariant}(#t181.{core::MapEntry::key}{core::String*}, #t181.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t180.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t180;
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t182 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t182.{core::List::addAll}( block {
+      #t182.{core::List::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t183 = col::LinkedHashSet::•<core::List<core::int*>*>();
-        #t183.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+        #t183.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
       } =>#t183){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t182;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t184 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t184.{core::Set::addAll}( block {
+      #t184.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t185 = col::LinkedHashSet::•<core::List<core::int*>*>();
-        #t185.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+        #t185.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
       } =>#t185){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t184.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+    #t184.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t184;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t186 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t186.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t186.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t186;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t187 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t187.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t187.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t187.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t187.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t187;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t188 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t189 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t188.{core::Map::[]=}(#t189.{core::MapEntry::key}{core::String*}, #t189.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t188.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t188.{core::Map::[]=}{Invariant}(#t189.{core::MapEntry::key}{core::String*}, #t189.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t188.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t188;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t190 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t190.{core::List::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+      #t190.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
   } =>#t190;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t191 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t191.{core::Set::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
-    #t191.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t191.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t191.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t191;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t192 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, core::int*>* #t193 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t192.{core::Map::[]=}(#t193.{core::MapEntry::key}{core::String*}, #t193.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t192.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+        #t192.{core::Map::[]=}{Invariant}(#t193.{core::MapEntry::key}{core::String*}, #t193.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t192.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t192;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t194 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t194.{core::List::addAll}( block {
+      #t194.{core::List::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t195 = col::LinkedHashSet::•<core::int*>();
       } =>#t195){(core::Iterable<core::int*>*) →* void};
   } =>#t194;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t196 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t196.{core::Set::addAll}( block {
+      #t196.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t197 = col::LinkedHashSet::•<core::int*>();
       } =>#t197){(core::Iterable<core::int*>*) →* void};
-    #t196.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t196.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t196;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t198 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t198.{core::List::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+        #t198.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
   } =>#t198;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t199.{core::Set::addAll}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
-    #t199.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t199.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t199.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t199;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t200 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t200.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t200.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t200;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t201 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t201.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t201.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t201.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t201.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t201;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t202 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t203 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-        #t202.{core::Map::[]=}(#t203.{core::MapEntry::key}{core::String*}, #t203.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t202.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t202.{core::Map::[]=}{Invariant}(#t203.{core::MapEntry::key}{core::String*}, #t203.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t202.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t202;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t204 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t204.{core::List::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t204.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t204;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t205 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t205.{core::Set::addAll}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t205.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t205.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t205.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t205;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t206 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t207 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-          #t206.{core::Map::[]=}(#t207.{core::MapEntry::key}{core::String*}, #t207.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
-    #t206.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+          #t206.{core::Map::[]=}{Invariant}(#t207.{core::MapEntry::key}{core::String*}, #t207.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t206.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t206;
   core::List<core::List<core::int*>*>* list70 = block {
     final core::List<core::List<core::int*>*>* #t208 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t208.{core::List::add}(<core::int*>[]){(core::List<core::int*>*) →* void};
+      #t208.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
   } =>#t208;
   core::Set<core::List<core::int*>*>* set70 = block {
     final core::Set<core::List<core::int*>*>* #t209 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t209.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
-    #t209.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t209.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t209.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t209;
   core::Map<core::String*, core::List<core::int*>*>* map70 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t210 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t210.{core::Map::[]=}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
-    #t210.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t210.{core::Map::[]=}{Invariant}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
+    #t210.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t210;
   core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t211 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t211.{core::List::add}(<core::int*>[]){(core::List<core::int*>*) →* void};
+        #t211.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
   } =>#t211;
   core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t212 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t212.{core::Set::add}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
-    #t212.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t212.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t212.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t212;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t213.{core::Map::[]=}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
-    #t213.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t213.{core::Map::[]=}{Invariant}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
+    #t213.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t213;
   core::List<core::num*>* list80 = block {
     final core::List<core::num*>* #t214 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t214.{core::List::add}(42){(core::num*) →* void};
+        #t214.{core::List::add}{Invariant}(42){(core::num*) →* void};
       else
-        #t214.{core::List::add}(3.14){(core::num*) →* void};
+        #t214.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
   } =>#t214;
   core::Set<core::num*>* set80 = block {
     final core::Set<core::num*>* #t215 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t215.{core::Set::add}(42){(core::num*) →* core::bool*};
+        #t215.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
       else
-        #t215.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t215.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t215.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t215.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t215;
   core::Map<core::String*, core::num*>* map80 = block {
     final core::Map<core::String*, core::num*>* #t216 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t216.{core::Map::[]=}("bar", 42){(core::String*, core::num*) →* void};
+        #t216.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
       else
-        #t216.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t216.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+        #t216.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t216.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t216;
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t217 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t217.{core::List::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t217.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t217.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+        #t217.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t217;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t218 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t218.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t218.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t218.{core::Set::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
-    #t218.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t218.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t218.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t218;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t219 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::num*>* #t220 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}{core::String*}, #t220.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+          #t219.{core::Map::[]=}{Invariant}(#t220.{core::MapEntry::key}{core::String*}, #t220.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
       else
         for (final core::MapEntry<core::String*, core::num*>* #t221 in mapStringDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-          #t219.{core::Map::[]=}(#t221.{core::MapEntry::key}{core::String*}, #t221.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
-    #t219.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+          #t219.{core::Map::[]=}{Invariant}(#t221.{core::MapEntry::key}{core::String*}, #t221.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    #t219.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t219;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t222 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t222.{core::List::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+        #t222.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
       else
-        #t222.{core::List::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+        #t222.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
   } =>#t222;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t223.{core::Set::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+        #t223.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
       else
-        #t223.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t223.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t223.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t223.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t223;
   core::Map<dynamic, dynamic>* map82 = block {
     final core::Map<dynamic, dynamic>* #t224 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<dynamic, dynamic>* #t225 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-          #t224.{core::Map::[]=}(#t225.{core::MapEntry::key}{dynamic}, #t225.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+          #t224.{core::Map::[]=}{Invariant}(#t225.{core::MapEntry::key}{dynamic}, #t225.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
       else
         for (final core::MapEntry<dynamic, dynamic>* #t226 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-          #t224.{core::Map::[]=}(#t226.{core::MapEntry::key}{dynamic}, #t226.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
-    #t224.{core::Map::[]=}("baz", null){(dynamic, dynamic) →* void};
+          #t224.{core::Map::[]=}{Invariant}(#t226.{core::MapEntry::key}{dynamic}, #t226.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+    #t224.{core::Map::[]=}{Invariant}("baz", null){(dynamic, dynamic) →* void};
   } =>#t224;
   core::List<core::num*>* list83 = block {
     final core::List<core::num*>* #t227 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t227.{core::List::add}(42){(core::num*) →* void};
+        #t227.{core::List::add}{Invariant}(42){(core::num*) →* void};
       else
-        #t227.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+        #t227.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t227;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t228 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t228.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t228.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t228.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t228.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t228.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t228.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t228;
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t229 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::num*>* #t230 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
-          #t229.{core::Map::[]=}(#t230.{core::MapEntry::key}{core::String*}, #t230.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}{core::String*}, #t230.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
       else
-        #t229.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t229.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+        #t229.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t229.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t229;
   core::List<core::int*>* list90 = block {
     final core::List<core::int*>* #t231 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t231.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+      #t231.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
   } =>#t231;
   core::Set<core::int*>* set90 = block {
     final core::Set<core::int*>* #t232 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t232.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t232.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t232.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t232.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t232;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t233 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t233.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
-    #t233.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t233.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t233.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t233;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t234 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final dynamic #t235 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
         final core::int* #t236 = #t235 as{TypeError} core::int*;
-        #t234.{core::List::add}(#t236){(core::int*) →* void};
+        #t234.{core::List::add}{Invariant}(#t236){(core::int*) →* void};
       }
   } =>#t234;
   core::Set<core::int*>* set91 = block {
@@ -1679,9 +1679,9 @@
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final dynamic #t238 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
         final core::int* #t239 = #t238 as{TypeError} core::int*;
-        #t237.{core::Set::add}(#t239){(core::int*) →* core::bool*};
+        #t237.{core::Set::add}{Invariant}(#t239){(core::int*) →* core::bool*};
       }
-    #t237.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t237.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t237;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t240 = <core::String*, core::int*>{};
@@ -1689,117 +1689,117 @@
       for (final core::MapEntry<dynamic, dynamic>* #t241 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}) {
         final core::String* #t242 = #t241.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
         final core::int* #t243 = #t241.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-        #t240.{core::Map::[]=}(#t242, #t243){(core::String*, core::int*) →* void};
+        #t240.{core::Map::[]=}{Invariant}(#t242, #t243){(core::String*, core::int*) →* void};
       }
-    #t240.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t240.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t240;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t244 = <core::int*>[];
     for (final core::int* #t245 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t244.{core::List::add}(42){(core::int*) →* void};
+      #t244.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t244;
   core::Set<core::int*>* set100 = block {
     final core::Set<core::int*>* #t246 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t247 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t246.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t246.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t246;
   core::Map<core::String*, core::int*>* map100 = block {
     final core::Map<core::String*, core::int*>* #t248 = <core::String*, core::int*>{};
     for (final core::int* #t249 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t248.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
+      #t248.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
   } =>#t248;
   core::List<core::int*>* list110 = block {
     final core::List<core::int*>* #t250 = <core::int*>[];
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t250.{core::List::add}(i){(core::int*) →* void};
+      #t250.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t250;
   core::Set<core::int*>* set110 = block {
     final core::Set<core::int*>* #t251 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t251.{core::Set::add}(i){(core::int*) →* core::bool*};
-    #t251.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t251.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t251.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t251;
   core::Map<core::String*, core::int*>* map110 = block {
     final core::Map<core::String*, core::int*>* #t252 = <core::String*, core::int*>{};
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t252.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
-    #t252.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t252.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t252.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t252;
   core::List<core::int*>* list120 = block {
     final core::List<core::int*>* #t253 = <core::int*>[];
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t253.{core::List::add}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+      #t253.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
   } =>#t253;
   core::Set<core::int*>* set120 = block {
     final core::Set<core::int*>* #t254 = col::LinkedHashSet::•<core::int*>();
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t254.{core::Set::add}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t254.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t254.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t254.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t254;
   core::Map<core::String*, core::int*>* map120 = block {
     final core::Map<core::String*, core::int*>* #t255 = <core::String*, core::int*>{};
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t255.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
-    #t255.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t255.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t255.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t255;
   core::List<core::int*>* list130 = block {
     final core::List<core::int*>* #t256 = <core::int*>[];
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t256.{core::List::add}(i){(core::int*) →* void};
+      #t256.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t256;
   core::Set<core::int*>* set130 = block {
     final core::Set<core::int*>* #t257 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t257.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t257.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t257;
   core::Map<core::int*, core::int*>* map130 = block {
     final core::Map<core::int*, core::int*>* #t258 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t258.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+      #t258.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
   } =>#t258;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
   block {
     final core::List<core::int*>* #t259 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t259.{core::List::add}(let final Never* #t260 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t259.{core::List::add}{Invariant}(let final Never* #t260 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
   } =>#t259;
   block {
     final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t261.{core::Set::add}(let final Never* #t262 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t261.{core::Set::add}{Invariant}(let final Never* #t262 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
-    #t261.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t261.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t261;
   block {
     final core::Map<core::int*, core::int*>* #t263 = <core::int*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t263.{core::Map::[]=}(let final Never* #t264 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t263.{core::Map::[]=}{Invariant}(let final Never* #t264 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                  ^" in "bar" as{TypeError} core::int*, let final Never* #t265 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*){(core::int*, core::int*) →* void};
-    #t263.{core::Map::[]=}(let final Never* #t266 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    #t263.{core::Map::[]=}{Invariant}(let final Never* #t266 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
   } =>#t263;
   block {
     final core::List<core::int*>* #t267 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t267.{core::List::addAll}(<core::int*>[let final Never* #t268 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t267.{core::List::addAll}{Invariant}(<core::int*>[let final Never* #t268 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
   } =>#t267;
   block {
     final core::Set<core::int*>* #t269 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t269.{core::Set::addAll}(<core::int*>[let final Never* #t270 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t269.{core::Set::addAll}{Invariant}(<core::int*>[let final Never* #t270 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
-    #t269.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t269.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t269;
   block {
     final core::Map<core::int*, core::int*>* #t271 = <core::int*, core::int*>{};
@@ -1809,15 +1809,15 @@
                                                      ^" in "bar" as{TypeError} core::int*: let final Never* #t274 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
-        #t271.{core::Map::[]=}(#t272.{core::MapEntry::key}{core::int*}, #t272.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
-    #t271.{core::Map::[]=}(let final Never* #t275 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+        #t271.{core::Map::[]=}{Invariant}(#t272.{core::MapEntry::key}{core::int*}, #t272.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+    #t271.{core::Map::[]=}{Invariant}(let final Never* #t275 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
   } =>#t271;
   block {
     final core::List<core::int*>* #t276 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t276.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t276.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^"){(core::int*) →* void};
@@ -1825,11 +1825,11 @@
   block {
     final core::Set<core::int*>* #t277 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t277.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t277.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^"){(core::int*) →* core::bool*};
-    #t277.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t277.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t277;
   <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1842,11 +1842,11 @@
     final core::List<core::String*>* #t278 = <core::String*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t278.{core::List::add}(let final Never* #t279 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t278.{core::List::add}{Invariant}(let final Never* #t279 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
       else
-        #t278.{core::List::add}(let final Never* #t280 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t278.{core::List::add}{Invariant}(let final Never* #t280 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
   } =>#t278;
@@ -1854,50 +1854,50 @@
     final core::Set<core::String*>* #t281 = col::LinkedHashSet::•<core::String*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t281.{core::Set::add}(let final Never* #t282 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t281.{core::Set::add}{Invariant}(let final Never* #t282 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
       else
-        #t281.{core::Set::add}(let final Never* #t283 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t281.{core::Set::add}{Invariant}(let final Never* #t283 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
-    #t281.{core::Set::add}(null){(core::String*) →* core::bool*};
+    #t281.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
   } =>#t281;
   block {
     final core::Map<core::String*, core::String*>* #t284 = <core::String*, core::String*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t284.{core::Map::[]=}("bar", let final Never* #t285 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t284.{core::Map::[]=}{Invariant}("bar", let final Never* #t285 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
       else
-        #t284.{core::Map::[]=}("bar", let final Never* #t286 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t284.{core::Map::[]=}{Invariant}("bar", let final Never* #t286 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
-    #t284.{core::Map::[]=}("baz", null){(core::String*, core::String*) →* void};
+    #t284.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
   } =>#t284;
   block {
     final core::List<core::int*>* #t287 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t287.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t287.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^"){(core::int*) →* void};
       else
-        #t287.{core::List::add}(42){(core::int*) →* void};
+        #t287.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t287;
   block {
     final core::Set<core::int*>* #t288 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t288.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t288.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^"){(core::int*) →* core::bool*};
       else
-        #t288.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t288.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t288.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t288.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t288;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1910,9 +1910,9 @@
     final core::List<core::int*>* #t289 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t289.{core::List::add}(42){(core::int*) →* void};
+        #t289.{core::List::add}{Invariant}(42){(core::int*) →* void};
       else
-        #t289.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t289.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^"){(core::int*) →* void};
@@ -1921,13 +1921,13 @@
     final core::Set<core::int*>* #t290 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t290.{core::Set::add}(42){(core::int*) →* core::bool*};
+        #t290.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
       else
-        #t290.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t290.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^"){(core::int*) →* core::bool*};
-    #t290.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t290.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t290;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1943,7 +1943,7 @@
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
   <int>[for (i in <int>[1]) i];
              ^";
-      #t291.{core::List::add}(i){(core::int*) →* void};
+      #t291.{core::List::add}{Invariant}(i){(core::int*) →* void};
     }
   } =>#t291;
   block {
@@ -1952,9 +1952,9 @@
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
   <int>{for (i in <int>[1]) i, null};
              ^";
-      #t293.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t293.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
     }
-    #t293.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t293.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t293;
   block {
     final core::Map<core::String*, core::int*>* #t295 = <core::String*, core::int*>{};
@@ -1962,9 +1962,9 @@
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-      #t295.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+      #t295.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
     }
-    #t295.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t295.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t295;
   core::List<dynamic>* list10 = block {
     final core::List<dynamic>* #t297 = <dynamic>[];
@@ -1972,7 +1972,7 @@
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t297.{core::List::add}(i){(dynamic) →* void};
+      #t297.{core::List::add}{Invariant}(i){(dynamic) →* void};
   } =>#t297;
   core::Set<dynamic>* set10 = block {
     final core::Set<dynamic>* #t299 = col::LinkedHashSet::•<dynamic>();
@@ -1980,8 +1980,8 @@
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t299.{core::Set::add}(i){(dynamic) →* core::bool*};
-    #t299.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t299.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
+    #t299.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t299;
   core::Map<core::String*, dynamic>* map10 = block {
     final core::Map<core::String*, dynamic>* #t301 = <core::String*, dynamic>{};
@@ -1989,8 +1989,8 @@
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t301.{core::Map::[]=}("bar", i){(core::String*, dynamic) →* void};
-    #t301.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t301.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
+    #t301.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t301;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t303 = <core::int*>[];
@@ -1999,7 +1999,7 @@
                                ^" in "not" as{TypeError} core::int*, let final Never* #t305 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                       ^" in "int" as{TypeError} core::int*])
-      #t303.{core::List::add}(i){(core::int*) →* void};
+      #t303.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t303;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t306 = col::LinkedHashSet::•<core::int*>();
@@ -2008,8 +2008,8 @@
                               ^" in "not" as{TypeError} core::int*, let final Never* #t308 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t306.{core::Set::add}(i){(core::int*) →* core::bool*};
-    #t306.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t306.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t306.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t306;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t309 = <core::String*, core::int*>{};
@@ -2018,8 +2018,8 @@
                               ^" in "not" as{TypeError} core::int*, let final Never* #t311 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t309.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
-    #t309.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t309.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t309.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t309;
   core::List<dynamic>* list30 = block {
     final core::List<dynamic>* #t312 = <dynamic>[];
@@ -2027,7 +2027,7 @@
  - 'Stream' is from 'dart:async'.
   var list30 = [await for (var i in \"not stream\") i];
                                     ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t312.{core::List::add}(i){(dynamic) →* void};
+      #t312.{core::List::add}{Invariant}(i){(dynamic) →* void};
   } =>#t312;
   core::Set<dynamic>* set30 = block {
     final core::Set<dynamic>* #t314 = col::LinkedHashSet::•<dynamic>();
@@ -2035,8 +2035,8 @@
  - 'Stream' is from 'dart:async'.
   var set30 = {await for (var i in \"not stream\") i, null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t314.{core::Set::add}(i){(dynamic) →* core::bool*};
-    #t314.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t314.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
+    #t314.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t314;
   core::Map<core::String*, dynamic>* map30 = block {
     final core::Map<core::String*, dynamic>* #t316 = <core::String*, dynamic>{};
@@ -2044,8 +2044,8 @@
  - 'Stream' is from 'dart:async'.
   var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t316.{core::Map::[]=}("bar", i){(core::String*, dynamic) →* void};
-    #t316.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t316.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
+    #t316.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t316;
   core::List<core::int*>* list40 = block {
     final core::List<core::int*>* #t318 = <core::int*>[];
@@ -2054,7 +2054,7 @@
                                                          ^" in "not" as{TypeError} core::int*, let final Never* #t320 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                 ^" in "int" as{TypeError} core::int*]))
-      #t318.{core::List::add}(i){(core::int*) →* void};
+      #t318.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t318;
   core::Set<core::int*>* set40 = block {
     final core::Set<core::int*>* #t321 = col::LinkedHashSet::•<core::int*>();
@@ -2063,8 +2063,8 @@
                                                         ^" in "not" as{TypeError} core::int*, let final Never* #t323 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t321.{core::Set::add}(i){(core::int*) →* core::bool*};
-    #t321.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t321.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t321.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t321;
   core::Map<core::String*, core::int*>* map40 = block {
     final core::Map<core::String*, core::int*>* #t324 = <core::String*, core::int*>{};
@@ -2073,82 +2073,82 @@
                                                         ^" in "not" as{TypeError} core::int*, let final Never* #t326 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t324.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
-    #t324.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t324.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t324.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t324;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t327 = <core::int*>[];
     for (; ; )
-      #t327.{core::List::add}(42){(core::int*) →* void};
+      #t327.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t327;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t328 = col::LinkedHashSet::•<core::int*>();
     for (; ; )
-      #t328.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t328.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t328.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t328.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t328;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t329 = <core::String*, core::int*>{};
     for (; ; )
-      #t329.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t329.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t329.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t329.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t329;
   core::List<core::int*>* list60 = block {
     final core::List<core::int*>* #t330 = <core::int*>[];
     for (; let final Never* #t331 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-      #t330.{core::List::add}(42){(core::int*) →* void};
+      #t330.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t330;
   core::Set<core::int*>* set60 = block {
     final core::Set<core::int*>* #t332 = col::LinkedHashSet::•<core::int*>();
     for (; let final Never* #t333 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t332.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t332.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t332.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t332.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t332;
   core::Map<core::String*, core::int*>* map60 = block {
     final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
     for (; let final Never* #t335 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t334.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t334.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t334.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t334.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t334;
 }
 static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
   block {
     final core::List<core::int*>* #t336 = <core::int*>[];
     await for (core::int* i in stream)
-      #t336.{core::List::add}(i){(core::int*) →* void};
+      #t336.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t336;
   block {
     final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t337.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t337.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t337;
   block {
     final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t338.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+      #t338.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
   } =>#t338;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t339 = <core::int*>[];
     if(a is self::B*)
-      #t339.{core::List::add}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* void};
+      #t339.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* void};
   } =>#t339;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t340.{core::Set::add}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* core::bool*};
+      #t340.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* core::bool*};
   } =>#t340;
   core::Map<core::int*, core::int*>* map10 = block {
     final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t341.{core::Map::[]=}(a{self::B*}.{self::B::foo}{core::int*}, a{self::B*}.{self::B::foo}{core::int*}){(core::int*, core::int*) →* void};
+      #t341.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}, a{self::B*}.{self::B::foo}{core::int*}){(core::int*, core::int*) →* void};
   } =>#t341;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.transformed.expect
index 36c13cd..03f6ecb 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.transformed.expect
@@ -455,64 +455,64 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t3.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = core::_GrowableList::•<dynamic>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar){(dynamic) →* void};
+      #t4.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar){(dynamic) →* core::bool*};
-    #t5.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t5.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar){(core::String*, dynamic) →* void};
-    #t6.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t6.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* void};
+      #t7.{core::List::add}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* void};
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
-    #t8.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t8.{core::Set::add}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", core::_GrowableList::_literal1<core::int*>(42)){(core::String*, core::List<core::int*>*) →* void};
-    #t9.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t9.{core::Map::[]=}{Invariant}("bar", core::_GrowableList::_literal1<core::int*>(42)){(core::String*, core::List<core::int*>*) →* void};
+    #t9.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t10.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+      #t10.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
   } =>#t10;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t11 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t11.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
-    #t11.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t11.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+    #t11.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t11;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t12 = <core::String*, core::int*>{};
@@ -520,21 +520,21 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t12.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t12;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t14 = core::_GrowableList::•<dynamic>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t14.{core::List::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+      #t14.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
   } =>#t14;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t15 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t15.{core::Set::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
-    #t15.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t15.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+    #t15.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t15;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t16 = <core::String*, dynamic>{};
@@ -542,21 +542,21 @@
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, dynamic>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, dynamic>* #t17 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, dynamic>};
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}{core::String*}, #t17.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{core::String*}, #t17.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
       }
     }
-    #t16.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+    #t16.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t16;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t18 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t18.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t18.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t18;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t19 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t19.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t19.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t19.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t19.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t19;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t20 = <core::String*, core::List<core::int*>*>{};
@@ -564,23 +564,23 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::_literal1<core::int*>(42)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t21 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}{core::String*}, #t21.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::String*}, #t21.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
-    #t20.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t20.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t20;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t22 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t22.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+        #t22.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
   } =>#t22;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t23 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t23.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
-    #t23.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t23.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+    #t23.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t23;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t24 = <core::String*, core::int*>{};
@@ -589,23 +589,23 @@
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::int*>* #t25 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-          #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}{core::String*}, #t25.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+          #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}{core::String*}, #t25.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
         }
       }
-    #t24.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t24.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t24;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t26 = core::_GrowableList::•<dynamic>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t26.{core::List::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+        #t26.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
   } =>#t26;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t27 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t27.{core::Set::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
-    #t27.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t27.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+    #t27.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t27;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t28 = <core::String*, dynamic>{};
@@ -614,23 +614,23 @@
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, dynamic>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, dynamic>* #t29 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, dynamic>};
-          #t28.{core::Map::[]=}(#t29.{core::MapEntry::key}{core::String*}, #t29.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+          #t28.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}{core::String*}, #t29.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
         }
       }
-    #t28.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+    #t28.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t28;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t30 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t30.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t30.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t30;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t31 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t31.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t31.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t31.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t31.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t31;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t32 = <core::String*, core::List<core::int*>*>{};
@@ -639,21 +639,21 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::_literal1<core::int*>(42)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t32.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t32.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t32;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t34 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t34.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t34.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t34;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t35 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t35.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t35.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t35.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t35.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t35;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -661,32 +661,32 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t36 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t36.{core::List::addAll}( block {
+      #t36.{core::List::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-        #t37.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+        #t37.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
       } =>#t37){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t36;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t38 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t38.{core::Set::addAll}( block {
+      #t38.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-        #t39.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+        #t39.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
       } =>#t39){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t38.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+    #t38.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t38;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t40 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t40.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t40.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t40;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t41 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t41.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t41.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t41.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t41.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t41;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
@@ -695,21 +695,21 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}{core::String*}, #t43.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}{core::String*}, #t43.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t42.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t42.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t42;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t44 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t44.{core::List::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+      #t44.{core::List::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
   } =>#t44;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t45 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t45.{core::Set::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
-    #t45.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t45.{core::Set::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+    #t45.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t45;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t46 = <core::String*, core::int*>{};
@@ -717,38 +717,38 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t47 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t46.{core::Map::[]=}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t46.{core::Map::[]=}{Invariant}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t46.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t46.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t46;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t48 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t48.{core::List::addAll}( block {
+      #t48.{core::List::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t49 = new col::_CompactLinkedHashSet::•<core::int*>();
       } =>#t49){(core::Iterable<core::int*>*) →* void};
   } =>#t48;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t50 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t50.{core::Set::addAll}( block {
+      #t50.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
       } =>#t51){(core::Iterable<core::int*>*) →* void};
-    #t50.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t50.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t50;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t52 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t52.{core::List::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+        #t52.{core::List::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
   } =>#t52;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t53 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t53.{core::Set::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
-    #t53.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t53.{core::Set::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+    #t53.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t53;
   core::Map<core::String*, core::int*>* map52 = block {
     final core::Map<core::String*, core::int*>* #t54 = <core::String*, core::int*>{};
@@ -757,21 +757,21 @@
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::int*>* #t55 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-          #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::String*}, #t55.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+          #t54.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::String*}, #t55.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
         }
       }
-    #t54.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t54.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t54;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t56 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t56.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t56.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t56;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t57 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t57.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t57.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t57.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t57.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t57;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t58 = <core::String*, core::List<core::int*>*>{};
@@ -779,23 +779,23 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t59 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}{core::String*}, #t59.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}{core::String*}, #t59.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
-    #t58.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t58.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t58;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t60 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t60.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t60.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t60;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t61 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t61.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t61.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t61.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t61.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t61;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
@@ -804,72 +804,72 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}{core::String*}, #t63.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t62.{core::Map::[]=}{Invariant}(#t63.{core::MapEntry::key}{core::String*}, #t63.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t62.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t62.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t62;
   core::List<core::List<core::int*>*>* list70 = block {
     final core::List<core::List<core::int*>*>* #t64 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t64.{core::List::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
+      #t64.{core::List::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
   } =>#t64;
   core::Set<core::List<core::int*>*>* set70 = block {
     final core::Set<core::List<core::int*>*>* #t65 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t65.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
-    #t65.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t65.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+    #t65.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t65;
   core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t66 = core::_GrowableList::•<core::List<core::int*>*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t66.{core::List::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
+        #t66.{core::List::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
   } =>#t66;
   core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t67 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t67.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
-    #t67.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t67.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+    #t67.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t67;
   core::List<core::num*>* list80 = block {
     final core::List<core::num*>* #t68 = core::_GrowableList::•<core::num*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t68.{core::List::add}(42){(core::num*) →* void};
+      #t68.{core::List::add}{Invariant}(42){(core::num*) →* void};
     else
-      #t68.{core::List::add}(3.14){(core::num*) →* void};
+      #t68.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
   } =>#t68;
   core::Set<core::num*>* set80 = block {
     final core::Set<core::num*>* #t69 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t69.{core::Set::add}(42){(core::num*) →* core::bool*};
+      #t69.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
     else
-      #t69.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t69.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t69.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t69.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t69;
   core::Map<core::String*, core::num*>* map80 = block {
     final core::Map<core::String*, core::num*>* #t70 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t70.{core::Map::[]=}("bar", 42){(core::String*, core::num*) →* void};
+      #t70.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
     else
-      #t70.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t70.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+      #t70.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t70.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t70;
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t71 = core::_GrowableList::•<core::num*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t71.{core::List::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t71.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t71.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+      #t71.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t71;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t72 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t72.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t72.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t72.{core::Set::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
-    #t72.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t72.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t72.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t72;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t73 = <core::String*, core::num*>{};
@@ -877,58 +877,58 @@
       core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::num*>* #t74 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-        #t73.{core::Map::[]=}(#t74.{core::MapEntry::key}{core::String*}, #t74.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+        #t73.{core::Map::[]=}{Invariant}(#t74.{core::MapEntry::key}{core::String*}, #t74.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
       }
     }
     else {
       core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapToDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::num*>* #t75 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}{core::String*}, #t75.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+        #t73.{core::Map::[]=}{Invariant}(#t75.{core::MapEntry::key}{core::String*}, #t75.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
       }
     }
-    #t73.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+    #t73.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t73;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t76 = core::_GrowableList::•<dynamic>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t76.{core::List::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+      #t76.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
     else
-      #t76.{core::List::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+      #t76.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
   } =>#t76;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t77.{core::Set::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+      #t77.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
     else
-      #t77.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t77.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t77.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t77.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t77;
   core::Set<dynamic>* map82 = block {
     final core::Set<dynamic>* #t78 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t78.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t78.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^"){(dynamic) →* core::bool*};
     else
-      #t78.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t78.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t78.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t78.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t78;
   core::List<core::num*>* list83 = block {
     final core::List<core::num*>* #t79 = core::_GrowableList::•<core::num*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t79.{core::List::add}(42){(core::num*) →* void};
+      #t79.{core::List::add}{Invariant}(42){(core::num*) →* void};
     else
-      #t79.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+      #t79.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t79;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t80 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t80.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+      #t80.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
     else
-      #t80.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t80.{core::Set::add}(null){(core::num*) →* core::bool*};
+      #t80.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t80.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t80;
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t81 = <core::String*, core::num*>{};
@@ -936,29 +936,29 @@
       core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::num*>* #t82 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-        #t81.{core::Map::[]=}(#t82.{core::MapEntry::key}{core::String*}, #t82.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+        #t81.{core::Map::[]=}{Invariant}(#t82.{core::MapEntry::key}{core::String*}, #t82.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
       }
     }
     else
-      #t81.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t81.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+      #t81.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t81.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t81;
   core::List<core::int*>* list90 = block {
     final core::List<core::int*>* #t83 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t83.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+      #t83.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
   } =>#t83;
   core::Set<core::int*>* set90 = block {
     final core::Set<core::int*>* #t84 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t84.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t84.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t84.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t84.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t84;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t85 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t85.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
-    #t85.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t85.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t85.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t85;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t86 = core::_GrowableList::•<core::int*>(0);
@@ -968,7 +968,7 @@
         final dynamic #t87 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t88 = #t87 as{TypeError} core::int*;
-          #t86.{core::List::add}(#t88){(core::int*) →* void};
+          #t86.{core::List::add}{Invariant}(#t88){(core::int*) →* void};
         }
       }
     }
@@ -981,11 +981,11 @@
         final dynamic #t90 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t91 = #t90 as{TypeError} core::int*;
-          #t89.{core::Set::add}(#t91){(core::int*) →* core::bool*};
+          #t89.{core::Set::add}{Invariant}(#t91){(core::int*) →* core::bool*};
         }
       }
     }
-    #t89.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t89.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t89;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t92 = <core::String*, core::int*>{};
@@ -996,66 +996,66 @@
         {
           final core::String* #t94 = #t93.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
           final core::int* #t95 = #t93.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-          #t92.{core::Map::[]=}(#t94, #t95){(core::String*, core::int*) →* void};
+          #t92.{core::Map::[]=}{Invariant}(#t94, #t95){(core::String*, core::int*) →* void};
         }
       }
     }
-    #t92.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t92.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t92;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t96 = core::_GrowableList::•<core::int*>(0);
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t96.{core::List::add}(42){(core::int*) →* void};
+      #t96.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t96;
   core::Set<core::int*>* set100 = block {
     final core::Set<core::int*>* #t97 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t97.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t97.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t97;
   core::Map<core::int*, core::int*>* map100 = block {
     final core::Map<core::int*, core::int*>* #t98 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::Map::[]=}(42, 42){(core::int*, core::int*) →* void};
+      #t98.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
   } =>#t98;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
     final core::List<core::int*>* #t99 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::List::add}(let final Never* #t100 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t99.{core::List::add}{Invariant}(let final Never* #t100 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
   } =>#t99;
   block {
     final core::Set<core::int*>* #t101 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t101.{core::Set::add}(let final Never* #t102 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t101.{core::Set::add}{Invariant}(let final Never* #t102 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
-    #t101.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t101.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t101;
   block {
     final core::Map<core::String*, core::int*>* #t103 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t103.{core::Map::[]=}("bar", let final Never* #t104 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t103.{core::Map::[]=}{Invariant}("bar", let final Never* #t104 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*){(core::String*, core::int*) →* void};
-    #t103.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t103.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t103;
   block {
     final core::List<core::int*>* #t105 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t105.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(let final Never* #t106 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t105.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(let final Never* #t106 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*)){(core::Iterable<core::int*>*) →* void};
   } =>#t105;
   block {
     final core::Set<core::int*>* #t107 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t107.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(let final Never* #t108 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t107.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(let final Never* #t108 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*)){(core::Iterable<core::int*>*) →* void};
-    #t107.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t107.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t107;
   block {
     final core::Map<core::String*, core::int*>* #t109 = <core::String*, core::int*>{};
@@ -1065,15 +1065,15 @@
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t111 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t109.{core::Map::[]=}(#t111.{core::MapEntry::key}{core::String*}, #t111.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t109.{core::Map::[]=}{Invariant}(#t111.{core::MapEntry::key}{core::String*}, #t111.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t109.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t109.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t109;
   block {
     final core::List<core::int*>* #t112 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t112.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t112.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^"){(core::int*) →* void};
@@ -1081,11 +1081,11 @@
   block {
     final core::Set<core::int*>* #t113 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t113.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t113.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^"){(core::int*) →* core::bool*};
-    #t113.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t113.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t113;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1097,58 +1097,58 @@
   block {
     final core::List<core::String*>* #t114 = core::_GrowableList::•<core::String*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t114.{core::List::add}(let final Never* #t115 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t114.{core::List::add}{Invariant}(let final Never* #t115 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
     else
-      #t114.{core::List::add}(let final Never* #t116 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t114.{core::List::add}{Invariant}(let final Never* #t116 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
   } =>#t114;
   block {
     final core::Set<core::String*>* #t117 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t117.{core::Set::add}(let final Never* #t118 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t117.{core::Set::add}{Invariant}(let final Never* #t118 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
     else
-      #t117.{core::Set::add}(let final Never* #t119 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t117.{core::Set::add}{Invariant}(let final Never* #t119 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
-    #t117.{core::Set::add}(null){(core::String*) →* core::bool*};
+    #t117.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
   } =>#t117;
   block {
     final core::Map<core::String*, core::String*>* #t120 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t120.{core::Map::[]=}("bar", let final Never* #t121 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t120.{core::Map::[]=}{Invariant}("bar", let final Never* #t121 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
     else
-      #t120.{core::Map::[]=}("baz", let final Never* #t122 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t120.{core::Map::[]=}{Invariant}("baz", let final Never* #t122 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
-    #t120.{core::Map::[]=}("baz", null){(core::String*, core::String*) →* void};
+    #t120.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
   } =>#t120;
   block {
     final core::List<core::int*>* #t123 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t123.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t123.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^"){(core::int*) →* void};
     else
-      #t123.{core::List::add}(42){(core::int*) →* void};
+      #t123.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t123;
   block {
     final core::Set<core::int*>* #t124 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t124.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^"){(core::int*) →* core::bool*};
     else
-      #t124.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t124.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t124.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t124.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t124;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1160,9 +1160,9 @@
   block {
     final core::List<core::int*>* #t125 = core::_GrowableList::•<core::int*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::List::add}(42){(core::int*) →* void};
+      #t125.{core::List::add}{Invariant}(42){(core::int*) →* void};
     else
-      #t125.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t125.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^"){(core::int*) →* void};
@@ -1170,13 +1170,13 @@
   block {
     final core::Set<core::int*>* #t126 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t126.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^"){(core::int*) →* core::bool*};
     else
-      #t126.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t126.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t126.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t126.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t126;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -1208,63 +1208,63 @@
     if(let final Never* #t128 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t127.{core::List::add}(42){(core::int*) →* void};
+      #t127.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t127;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t129 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(let final Never* #t130 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t129.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t129.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t129;
   core::Map<core::int*, core::int*>* map30 = block {
     final core::Map<core::int*, core::int*>* #t131 = <core::int*, core::int*>{};
     if(let final Never* #t132 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t131.{core::Map::[]=}(42, 42){(core::int*, core::int*) →* void};
+      #t131.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
   } =>#t131;
   core::List<core::String*>* list40 = block {
     final core::List<core::String*>* #t133 = core::_GrowableList::•<core::String*>(0);
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t133.{core::List::add}(let final Never* #t134 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t133.{core::List::add}{Invariant}(let final Never* #t134 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*){(core::String*) →* void};
     else
-      #t133.{core::List::add}(let final Never* #t135 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t133.{core::List::add}{Invariant}(let final Never* #t135 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
   } =>#t133;
   core::Set<core::String*>* set40 = block {
     final core::Set<core::String*>* #t136 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t136.{core::Set::add}(let final Never* #t137 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t136.{core::Set::add}{Invariant}(let final Never* #t137 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*){(core::String*) →* core::bool*};
     else
-      #t136.{core::Set::add}(let final Never* #t138 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t136.{core::Set::add}{Invariant}(let final Never* #t138 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
   } =>#t136;
   core::Map<core::String*, core::int*>* map40 = block {
     final core::Map<core::String*, core::int*>* #t139 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(let final Never* #t140 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t139.{core::Map::[]=}{Invariant}(let final Never* #t140 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
     else
-      #t139.{core::Map::[]=}(let final Never* #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t139.{core::Map::[]=}{Invariant}(let final Never* #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
   } =>#t139;
   core::Map<core::int*, core::String*>* map41 = block {
     final core::Map<core::int*, core::String*>* #t142 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Map::[]=}(42, let final Never* #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t142.{core::Map::[]=}{Invariant}(42, let final Never* #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*){(core::int*, core::String*) →* void};
     else
-      #t142.{core::Map::[]=}(42, let final Never* #t144 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t142.{core::Map::[]=}{Invariant}(42, let final Never* #t144 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*){(core::int*, core::String*) →* void};
   } =>#t142;
@@ -1273,64 +1273,64 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t145 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t145.{core::List::add}(42){(core::int*) →* void};
+      #t145.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t145;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t146 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t146.{core::Set::add}(42){(core::int*) →* core::bool*};
-    #t146.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t146.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t146.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t146;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t147 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t147.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-    #t147.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t147.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t147.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t147;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t148 = core::_GrowableList::•<dynamic>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t148.{core::List::add}(dynVar){(dynamic) →* void};
+      #t148.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
   } =>#t148;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t149 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t149.{core::Set::add}(dynVar){(dynamic) →* core::bool*};
-    #t149.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t149.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t149.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t149;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t150 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t150.{core::Map::[]=}("bar", dynVar){(core::String*, dynamic) →* void};
-    #t150.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+      #t150.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t150.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t150;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t151 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t151.{core::List::add}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* void};
+      #t151.{core::List::add}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* void};
   } =>#t151;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t152 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t152.{core::Set::add}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
-    #t152.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t152.{core::Set::add}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
+    #t152.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t152;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t153 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t153.{core::Map::[]=}("bar", core::_GrowableList::_literal1<core::int*>(42)){(core::String*, core::List<core::int*>*) →* void};
-    #t153.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t153.{core::Map::[]=}{Invariant}("bar", core::_GrowableList::_literal1<core::int*>(42)){(core::String*, core::List<core::int*>*) →* void};
+    #t153.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t153;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t154 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t154.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+      #t154.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
   } =>#t154;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t155 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t155.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
-    #t155.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t155.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+    #t155.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t155;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t156 = <core::String*, core::int*>{};
@@ -1338,21 +1338,21 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t157 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t156.{core::Map::[]=}(#t157.{core::MapEntry::key}{core::String*}, #t157.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t156.{core::Map::[]=}{Invariant}(#t157.{core::MapEntry::key}{core::String*}, #t157.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t156.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t156.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t156;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t158 = core::_GrowableList::•<dynamic>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t158.{core::List::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+      #t158.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
   } =>#t158;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t159 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t159.{core::Set::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
-    #t159.{core::Set::add}(null){(dynamic) →* core::bool*};
+      #t159.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+    #t159.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t159;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t160 = <core::String*, dynamic>{};
@@ -1360,21 +1360,21 @@
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, dynamic>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, dynamic>* #t161 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, dynamic>};
-        #t160.{core::Map::[]=}(#t161.{core::MapEntry::key}{core::String*}, #t161.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+        #t160.{core::Map::[]=}{Invariant}(#t161.{core::MapEntry::key}{core::String*}, #t161.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
       }
     }
-    #t160.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+    #t160.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t160;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t162 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t162.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t162.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t162;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t163 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t163.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t163.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t163.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t163.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t163;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t164 = <core::String*, core::List<core::int*>*>{};
@@ -1382,23 +1382,23 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::_literal1<core::int*>(42)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t165 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t164.{core::Map::[]=}(#t165.{core::MapEntry::key}{core::String*}, #t165.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t164.{core::Map::[]=}{Invariant}(#t165.{core::MapEntry::key}{core::String*}, #t165.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
-    #t164.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t164.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t164;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t166 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t166.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+        #t166.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
   } =>#t166;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t167.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
-    #t167.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t167.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::Iterable<core::int*>*) →* void};
+    #t167.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t167;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t168 = <core::String*, core::int*>{};
@@ -1407,23 +1407,23 @@
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::int*>* #t169 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-          #t168.{core::Map::[]=}(#t169.{core::MapEntry::key}{core::String*}, #t169.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+          #t168.{core::Map::[]=}{Invariant}(#t169.{core::MapEntry::key}{core::String*}, #t169.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
         }
       }
-    #t168.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t168.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t168;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t170 = core::_GrowableList::•<dynamic>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t170.{core::List::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+        #t170.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
   } =>#t170;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t171 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t171.{core::Set::addAll}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
-    #t171.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t171.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<dynamic>(dynVar)){(core::Iterable<dynamic>*) →* void};
+    #t171.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t171;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t172 = <core::String*, dynamic>{};
@@ -1432,23 +1432,23 @@
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, dynamic>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, dynamic>* #t173 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, dynamic>};
-          #t172.{core::Map::[]=}(#t173.{core::MapEntry::key}{core::String*}, #t173.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+          #t172.{core::Map::[]=}{Invariant}(#t173.{core::MapEntry::key}{core::String*}, #t173.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
         }
       }
-    #t172.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+    #t172.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
   } =>#t172;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t174 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t174.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t174.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t174;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t175 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t175.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t175.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t175.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::_literal1<core::int*>(42))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t175.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t175;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t176 = <core::String*, core::List<core::int*>*>{};
@@ -1457,21 +1457,21 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::_literal1<core::int*>(42)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t177 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t176.{core::Map::[]=}(#t177.{core::MapEntry::key}{core::String*}, #t177.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t176.{core::Map::[]=}{Invariant}(#t177.{core::MapEntry::key}{core::String*}, #t177.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t176.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t176.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t176;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t178 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t178.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t178.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t178;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t179 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t179.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t179.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t179.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t179.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t179;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t180 = <core::String*, core::List<core::int*>*>{};
@@ -1479,40 +1479,40 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t181 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t180.{core::Map::[]=}(#t181.{core::MapEntry::key}{core::String*}, #t181.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t180.{core::Map::[]=}{Invariant}(#t181.{core::MapEntry::key}{core::String*}, #t181.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
-    #t180.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t180.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t180;
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t182 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t182.{core::List::addAll}( block {
+      #t182.{core::List::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t183 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-        #t183.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+        #t183.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
       } =>#t183){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t182;
   core::Set<core::List<core::int*>*>* set41 = block {
     final core::Set<core::List<core::int*>*>* #t184 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t184.{core::Set::addAll}( block {
+      #t184.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::List<core::int*>*>* #t185 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-        #t185.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+        #t185.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
       } =>#t185){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t184.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+    #t184.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t184;
   core::List<core::List<core::int*>*>* list42 = block {
     final core::List<core::List<core::int*>*>* #t186 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t186.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t186.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t186;
   core::Set<core::List<core::int*>*>* set42 = block {
     final core::Set<core::List<core::int*>*>* #t187 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t187.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t187.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t187.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t187.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t187;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t188 = <core::String*, core::List<core::int*>*>{};
@@ -1521,21 +1521,21 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t189 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t188.{core::Map::[]=}(#t189.{core::MapEntry::key}{core::String*}, #t189.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t188.{core::Map::[]=}{Invariant}(#t189.{core::MapEntry::key}{core::String*}, #t189.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t188.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t188.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t188;
   core::List<core::int*>* list50 = block {
     final core::List<core::int*>* #t190 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t190.{core::List::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+      #t190.{core::List::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
   } =>#t190;
   core::Set<core::int*>* set50 = block {
     final core::Set<core::int*>* #t191 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t191.{core::Set::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
-    #t191.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t191.{core::Set::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+    #t191.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t191;
   core::Map<core::String*, core::int*>* map50 = block {
     final core::Map<core::String*, core::int*>* #t192 = <core::String*, core::int*>{};
@@ -1543,49 +1543,49 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t193 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t192.{core::Map::[]=}(#t193.{core::MapEntry::key}{core::String*}, #t193.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t192.{core::Map::[]=}{Invariant}(#t193.{core::MapEntry::key}{core::String*}, #t193.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t192.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t192.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t192;
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t194 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t194.{core::List::addAll}( block {
+      #t194.{core::List::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t195 = new col::_CompactLinkedHashSet::•<core::int*>();
       } =>#t195){(core::Iterable<core::int*>*) →* void};
   } =>#t194;
   core::Set<core::int*>* set51 = block {
     final core::Set<core::int*>* #t196 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t196.{core::Set::addAll}( block {
+      #t196.{core::Set::addAll}{Invariant}( block {
         final core::Set<core::int*>* #t197 = new col::_CompactLinkedHashSet::•<core::int*>();
       } =>#t197){(core::Iterable<core::int*>*) →* void};
-    #t196.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t196.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t196;
   core::List<core::int*>* list52 = block {
     final core::List<core::int*>* #t198 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t198.{core::List::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+        #t198.{core::List::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
   } =>#t198;
   core::Set<core::int*>* set52 = block {
     final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t199.{core::Set::addAll}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
-    #t199.{core::Set::add}(null){(core::int*) →* core::bool*};
+        #t199.{core::Set::addAll}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::Iterable<core::int*>*) →* void};
+    #t199.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t199;
   core::List<core::List<core::int*>*>* list60 = block {
     final core::List<core::List<core::int*>*>* #t200 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t200.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+      #t200.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t200;
   core::Set<core::List<core::int*>*>* set60 = block {
     final core::Set<core::List<core::int*>*>* #t201 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t201.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t201.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t201.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t201.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t201;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t202 = <core::String*, core::List<core::int*>*>{};
@@ -1593,23 +1593,23 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t203 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t202.{core::Map::[]=}(#t203.{core::MapEntry::key}{core::String*}, #t203.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t202.{core::Map::[]=}{Invariant}(#t203.{core::MapEntry::key}{core::String*}, #t203.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
-    #t202.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t202.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t202;
   core::List<core::List<core::int*>*>* list61 = block {
     final core::List<core::List<core::int*>*>* #t204 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t204.{core::List::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+        #t204.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
   } =>#t204;
   core::Set<core::List<core::int*>*>* set61 = block {
     final core::Set<core::List<core::int*>*>* #t205 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t205.{core::Set::addAll}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
-    #t205.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t205.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0))){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t205.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t205;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t206 = <core::String*, core::List<core::int*>*>{};
@@ -1618,90 +1618,90 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t207 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-          #t206.{core::Map::[]=}(#t207.{core::MapEntry::key}{core::String*}, #t207.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+          #t206.{core::Map::[]=}{Invariant}(#t207.{core::MapEntry::key}{core::String*}, #t207.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
         }
       }
-    #t206.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+    #t206.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t206;
   core::List<core::List<core::int*>*>* list70 = block {
     final core::List<core::List<core::int*>*>* #t208 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t208.{core::List::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
+      #t208.{core::List::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
   } =>#t208;
   core::Set<core::List<core::int*>*>* set70 = block {
     final core::Set<core::List<core::int*>*>* #t209 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t209.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
-    #t209.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+      #t209.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+    #t209.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t209;
   core::Map<core::String*, core::List<core::int*>*>* map70 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t210 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t210.{core::Map::[]=}("bar", core::_GrowableList::•<core::int*>(0)){(core::String*, core::List<core::int*>*) →* void};
-    #t210.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+      #t210.{core::Map::[]=}{Invariant}("bar", core::_GrowableList::•<core::int*>(0)){(core::String*, core::List<core::int*>*) →* void};
+    #t210.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t210;
   core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t211 = core::_GrowableList::•<core::List<core::int*>*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t211.{core::List::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
+        #t211.{core::List::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* void};
   } =>#t211;
   core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t212 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t212.{core::Set::add}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
-    #t212.{core::Set::add}(null){(core::List<core::int*>*) →* core::bool*};
+        #t212.{core::Set::add}{Invariant}(core::_GrowableList::•<core::int*>(0)){(core::List<core::int*>*) →* core::bool*};
+    #t212.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
   } =>#t212;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t213.{core::Map::[]=}("bar", core::_GrowableList::•<core::int*>(0)){(core::String*, core::List<core::int*>*) →* void};
-    #t213.{core::Map::[]=}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+        #t213.{core::Map::[]=}{Invariant}("bar", core::_GrowableList::•<core::int*>(0)){(core::String*, core::List<core::int*>*) →* void};
+    #t213.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
   } =>#t213;
   core::List<core::num*>* list80 = block {
     final core::List<core::num*>* #t214 = core::_GrowableList::•<core::num*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t214.{core::List::add}(42){(core::num*) →* void};
+        #t214.{core::List::add}{Invariant}(42){(core::num*) →* void};
       else
-        #t214.{core::List::add}(3.14){(core::num*) →* void};
+        #t214.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
   } =>#t214;
   core::Set<core::num*>* set80 = block {
     final core::Set<core::num*>* #t215 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t215.{core::Set::add}(42){(core::num*) →* core::bool*};
+        #t215.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
       else
-        #t215.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t215.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t215.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t215.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t215;
   core::Map<core::String*, core::num*>* map80 = block {
     final core::Map<core::String*, core::num*>* #t216 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t216.{core::Map::[]=}("bar", 42){(core::String*, core::num*) →* void};
+        #t216.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
       else
-        #t216.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t216.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+        #t216.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t216.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t216;
   core::List<core::num*>* list81 = block {
     final core::List<core::num*>* #t217 = core::_GrowableList::•<core::num*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t217.{core::List::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t217.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t217.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+        #t217.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t217;
   core::Set<core::num*>* set81 = block {
     final core::Set<core::num*>* #t218 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t218.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t218.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t218.{core::Set::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
-    #t218.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t218.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t218.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t218;
   core::Map<core::String*, core::num*>* map81 = block {
     final core::Map<core::String*, core::num*>* #t219 = <core::String*, core::num*>{};
@@ -1710,34 +1710,34 @@
         core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::num*>* #t220 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}{core::String*}, #t220.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+          #t219.{core::Map::[]=}{Invariant}(#t220.{core::MapEntry::key}{core::String*}, #t220.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
         }
       }
       else {
         core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapStringDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::num*>* #t221 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-          #t219.{core::Map::[]=}(#t221.{core::MapEntry::key}{core::String*}, #t221.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+          #t219.{core::Map::[]=}{Invariant}(#t221.{core::MapEntry::key}{core::String*}, #t221.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
         }
       }
-    #t219.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+    #t219.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t219;
   core::List<dynamic>* list82 = block {
     final core::List<dynamic>* #t222 = core::_GrowableList::•<dynamic>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t222.{core::List::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+        #t222.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
       else
-        #t222.{core::List::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+        #t222.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
   } =>#t222;
   core::Set<dynamic>* set82 = block {
     final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t223.{core::Set::addAll}(listInt){(core::Iterable<dynamic>*) →* void};
+        #t223.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
       else
-        #t223.{core::Set::addAll}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
-    #t223.{core::Set::add}(null){(dynamic) →* core::bool*};
+        #t223.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t223.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
   } =>#t223;
   core::Map<dynamic, dynamic>* map82 = block {
     final core::Map<dynamic, dynamic>* #t224 = <dynamic, dynamic>{};
@@ -1746,34 +1746,34 @@
         core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<dynamic, dynamic>* #t225 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-          #t224.{core::Map::[]=}(#t225.{core::MapEntry::key}{dynamic}, #t225.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+          #t224.{core::Map::[]=}{Invariant}(#t225.{core::MapEntry::key}{dynamic}, #t225.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
         }
       }
       else {
         core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<dynamic, dynamic>* #t226 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-          #t224.{core::Map::[]=}(#t226.{core::MapEntry::key}{dynamic}, #t226.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+          #t224.{core::Map::[]=}{Invariant}(#t226.{core::MapEntry::key}{dynamic}, #t226.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
         }
       }
-    #t224.{core::Map::[]=}("baz", null){(dynamic, dynamic) →* void};
+    #t224.{core::Map::[]=}{Invariant}("baz", null){(dynamic, dynamic) →* void};
   } =>#t224;
   core::List<core::num*>* list83 = block {
     final core::List<core::num*>* #t227 = core::_GrowableList::•<core::num*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t227.{core::List::add}(42){(core::num*) →* void};
+        #t227.{core::List::add}{Invariant}(42){(core::num*) →* void};
       else
-        #t227.{core::List::addAll}(listDouble){(core::Iterable<core::num*>*) →* void};
+        #t227.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
   } =>#t227;
   core::Set<core::num*>* set83 = block {
     final core::Set<core::num*>* #t228 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t228.{core::Set::addAll}(listInt){(core::Iterable<core::num*>*) →* void};
+        #t228.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
       else
-        #t228.{core::Set::add}(3.14){(core::num*) →* core::bool*};
-    #t228.{core::Set::add}(null){(core::num*) →* core::bool*};
+        #t228.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t228.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
   } =>#t228;
   core::Map<core::String*, core::num*>* map83 = block {
     final core::Map<core::String*, core::num*>* #t229 = <core::String*, core::num*>{};
@@ -1782,29 +1782,29 @@
         core::Iterator<core::MapEntry<core::String*, core::num*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::num*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::String*, core::num*>* #t230 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::num*>};
-          #t229.{core::Map::[]=}(#t230.{core::MapEntry::key}{core::String*}, #t230.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}{core::String*}, #t230.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
         }
       }
       else
-        #t229.{core::Map::[]=}("bar", 3.14){(core::String*, core::num*) →* void};
-    #t229.{core::Map::[]=}("baz", null){(core::String*, core::num*) →* void};
+        #t229.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t229.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
   } =>#t229;
   core::List<core::int*>* list90 = block {
     final core::List<core::int*>* #t231 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t231.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+      #t231.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
   } =>#t231;
   core::Set<core::int*>* set90 = block {
     final core::Set<core::int*>* #t232 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t232.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t232.{core::Set::add}(null){(core::int*) →* core::bool*};
+      #t232.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t232.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t232;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t233 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t233.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
-    #t233.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+      #t233.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t233.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t233;
   core::List<core::int*>* list91 = block {
     final core::List<core::int*>* #t234 = core::_GrowableList::•<core::int*>(0);
@@ -1814,7 +1814,7 @@
         final dynamic #t235 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t236 = #t235 as{TypeError} core::int*;
-          #t234.{core::List::add}(#t236){(core::int*) →* void};
+          #t234.{core::List::add}{Invariant}(#t236){(core::int*) →* void};
         }
       }
     }
@@ -1827,11 +1827,11 @@
         final dynamic #t238 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t239 = #t238 as{TypeError} core::int*;
-          #t237.{core::Set::add}(#t239){(core::int*) →* core::bool*};
+          #t237.{core::Set::add}{Invariant}(#t239){(core::int*) →* core::bool*};
         }
       }
     }
-    #t237.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t237.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t237;
   core::Map<core::String*, core::int*>* map91 = block {
     final core::Map<core::String*, core::int*>* #t240 = <core::String*, core::int*>{};
@@ -1842,26 +1842,26 @@
         {
           final core::String* #t242 = #t241.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
           final core::int* #t243 = #t241.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-          #t240.{core::Map::[]=}(#t242, #t243){(core::String*, core::int*) →* void};
+          #t240.{core::Map::[]=}{Invariant}(#t242, #t243){(core::String*, core::int*) →* void};
         }
       }
     }
-    #t240.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t240.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t240;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t244 = core::_GrowableList::•<core::int*>(0);
     for (final core::int* #t245 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t244.{core::List::add}(42){(core::int*) →* void};
+      #t244.{core::List::add}{Invariant}(42){(core::int*) →* void};
   } =>#t244;
   core::Set<core::int*>* set100 = block {
     final core::Set<core::int*>* #t246 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (final core::int* #t247 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t246.{core::Set::add}(42){(core::int*) →* core::bool*};
+      #t246.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t246;
   core::Map<core::String*, core::int*>* map100 = block {
     final core::Map<core::String*, core::int*>* #t248 = <core::String*, core::int*>{};
     for (final core::int* #t249 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
-      #t248.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
+      #t248.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
   } =>#t248;
   core::List<core::int*>* list110 = block {
     final core::List<core::int*>* #t250 = core::_GrowableList::•<core::int*>(0);
@@ -1869,7 +1869,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(1, 2, 3).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t250.{core::List::add}(i){(core::int*) →* void};
+        #t250.{core::List::add}{Invariant}(i){(core::int*) →* void};
       }
     }
   } =>#t250;
@@ -1879,10 +1879,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(1, 2, 3).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t251.{core::Set::add}(i){(core::int*) →* core::bool*};
+        #t251.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
       }
     }
-    #t251.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t251.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t251;
   core::Map<core::String*, core::int*>* map110 = block {
     final core::Map<core::String*, core::int*>* #t252 = <core::String*, core::int*>{};
@@ -1890,10 +1890,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = core::_GrowableList::_literal3<core::int*>(1, 2, 3).{core::Iterable::iterator}{core::Iterator<core::int*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-        #t252.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+        #t252.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
       }
     }
-    #t252.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t252.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t252;
   core::List<core::int*>* list120 = block {
     final core::List<core::int*>* #t253 = core::_GrowableList::•<core::int*>(0);
@@ -1901,7 +1901,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t253.{core::List::add}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+        #t253.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
       }
     }
   } =>#t253;
@@ -1911,10 +1911,10 @@
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t254.{core::Set::add}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+        #t254.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
       }
     }
-    #t254.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t254.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t254;
   core::Map<core::String*, core::int*>* map120 = block {
     final core::Map<core::String*, core::int*>* #t255 = <core::String*, core::int*>{};
@@ -1922,25 +1922,25 @@
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t255.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+        #t255.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
       }
     }
-    #t255.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+    #t255.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
   } =>#t255;
   core::List<core::int*>* list130 = block {
     final core::List<core::int*>* #t256 = core::_GrowableList::•<core::int*>(0);
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t256.{core::List::add}(i){(core::int*) →* void};
+      #t256.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t256;
   core::Set<core::int*>* set130 = block {
     final core::Set<core::int*>* #t257 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t257.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t257.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t257;
   core::Map<core::int*, core::int*>* map130 = block {
     final core::Map<core::int*, core::int*>* #t258 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t258.{core::Map::[]=}(i, i){(core::int*, core::int*) →* void};
+      #t258.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
   } =>#t258;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
@@ -1962,44 +1962,44 @@
         block {
           final core::List<core::int*>* #t259 = core::_GrowableList::•<core::int*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t259.{core::List::add}(let final Never* #t260 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t259.{core::List::add}{Invariant}(let final Never* #t260 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
         } =>#t259;
         block {
           final core::Set<core::int*>* #t261 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t261.{core::Set::add}(let final Never* #t262 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t261.{core::Set::add}{Invariant}(let final Never* #t262 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
-          #t261.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t261.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t261;
         block {
           final core::Map<core::int*, core::int*>* #t263 = <core::int*, core::int*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t263.{core::Map::[]=}(let final Never* #t264 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t263.{core::Map::[]=}{Invariant}(let final Never* #t264 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                  ^" in "bar" as{TypeError} core::int*, let final Never* #t265 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*){(core::int*, core::int*) →* void};
-          #t263.{core::Map::[]=}(let final Never* #t266 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t263.{core::Map::[]=}{Invariant}(let final Never* #t266 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
         } =>#t263;
         block {
           final core::List<core::int*>* #t267 = core::_GrowableList::•<core::int*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t267.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(let final Never* #t268 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t267.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(let final Never* #t268 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*)){(core::Iterable<core::int*>*) →* void};
         } =>#t267;
         block {
           final core::Set<core::int*>* #t269 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t269.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(let final Never* #t270 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t269.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(let final Never* #t270 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*)){(core::Iterable<core::int*>*) →* void};
-          #t269.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t269.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t269;
         block {
           final core::Map<core::int*, core::int*>* #t271 = <core::int*, core::int*>{};
@@ -2011,17 +2011,17 @@
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::int*>>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               final core::MapEntry<core::int*, core::int*>* #t274 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::int*>};
-              #t271.{core::Map::[]=}(#t274.{core::MapEntry::key}{core::int*}, #t274.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+              #t271.{core::Map::[]=}{Invariant}(#t274.{core::MapEntry::key}{core::int*}, #t274.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
             }
           }
-          #t271.{core::Map::[]=}(let final Never* #t275 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t271.{core::Map::[]=}{Invariant}(let final Never* #t275 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
         } =>#t271;
         block {
           final core::List<core::int*>* #t276 = core::_GrowableList::•<core::int*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t276.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t276.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^"){(core::int*) →* void};
@@ -2029,11 +2029,11 @@
         block {
           final core::Set<core::int*>* #t277 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-            #t277.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t277.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^"){(core::int*) →* core::bool*};
-          #t277.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t277.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t277;
         <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -2046,11 +2046,11 @@
           final core::List<core::String*>* #t278 = core::_GrowableList::•<core::String*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t278.{core::List::add}(let final Never* #t279 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t278.{core::List::add}{Invariant}(let final Never* #t279 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
             else
-              #t278.{core::List::add}(let final Never* #t280 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t278.{core::List::add}{Invariant}(let final Never* #t280 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
         } =>#t278;
@@ -2058,50 +2058,50 @@
           final core::Set<core::String*>* #t281 = new col::_CompactLinkedHashSet::•<core::String*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t281.{core::Set::add}(let final Never* #t282 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t281.{core::Set::add}{Invariant}(let final Never* #t282 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
             else
-              #t281.{core::Set::add}(let final Never* #t283 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t281.{core::Set::add}{Invariant}(let final Never* #t283 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
-          #t281.{core::Set::add}(null){(core::String*) →* core::bool*};
+          #t281.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
         } =>#t281;
         block {
           final core::Map<core::String*, core::String*>* #t284 = <core::String*, core::String*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t284.{core::Map::[]=}("bar", let final Never* #t285 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t284.{core::Map::[]=}{Invariant}("bar", let final Never* #t285 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
             else
-              #t284.{core::Map::[]=}("bar", let final Never* #t286 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t284.{core::Map::[]=}{Invariant}("bar", let final Never* #t286 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
-          #t284.{core::Map::[]=}("baz", null){(core::String*, core::String*) →* void};
+          #t284.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
         } =>#t284;
         block {
           final core::List<core::int*>* #t287 = core::_GrowableList::•<core::int*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t287.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t287.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^"){(core::int*) →* void};
             else
-              #t287.{core::List::add}(42){(core::int*) →* void};
+              #t287.{core::List::add}{Invariant}(42){(core::int*) →* void};
         } =>#t287;
         block {
           final core::Set<core::int*>* #t288 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t288.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t288.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^"){(core::int*) →* core::bool*};
             else
-              #t288.{core::Set::add}(42){(core::int*) →* core::bool*};
-          #t288.{core::Set::add}(null){(core::int*) →* core::bool*};
+              #t288.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+          #t288.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t288;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -2114,9 +2114,9 @@
           final core::List<core::int*>* #t289 = core::_GrowableList::•<core::int*>(0);
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t289.{core::List::add}(42){(core::int*) →* void};
+              #t289.{core::List::add}{Invariant}(42){(core::int*) →* void};
             else
-              #t289.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t289.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^"){(core::int*) →* void};
@@ -2125,13 +2125,13 @@
           final core::Set<core::int*>* #t290 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t290.{core::Set::add}(42){(core::int*) →* core::bool*};
+              #t290.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
             else
-              #t290.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t290.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^"){(core::int*) →* core::bool*};
-          #t290.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t290.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t290;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
@@ -2151,7 +2151,7 @@
                 invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
   <int>[for (i in <int>[1]) i];
              ^";
-                #t291.{core::List::add}(i){(core::int*) →* void};
+                #t291.{core::List::add}{Invariant}(i){(core::int*) →* void};
               }
             }
           }
@@ -2166,11 +2166,11 @@
                 invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
   <int>{for (i in <int>[1]) i, null};
              ^";
-                #t293.{core::Set::add}(i){(core::int*) →* core::bool*};
+                #t293.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
               }
             }
           }
-          #t293.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t293.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t293;
         block {
           final core::Map<core::String*, core::int*>* #t295 = <core::String*, core::int*>{};
@@ -2182,11 +2182,11 @@
                 invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-                #t295.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+                #t295.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
               }
             }
           }
-          #t295.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t295.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
         } =>#t295;
         core::List<dynamic>* list10 = block {
           final core::List<dynamic>* #t297 = core::_GrowableList::•<dynamic>(0);
@@ -2197,7 +2197,7 @@
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-              #t297.{core::List::add}(i){(dynamic) →* void};
+              #t297.{core::List::add}{Invariant}(i){(dynamic) →* void};
             }
           }
         } =>#t297;
@@ -2210,10 +2210,10 @@
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-              #t299.{core::Set::add}(i){(dynamic) →* core::bool*};
+              #t299.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
             }
           }
-          #t299.{core::Set::add}(null){(dynamic) →* core::bool*};
+          #t299.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
         } =>#t299;
         core::Map<core::String*, dynamic>* map10 = block {
           final core::Map<core::String*, dynamic>* #t301 = <core::String*, dynamic>{};
@@ -2224,10 +2224,10 @@
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator}{core::Iterator<dynamic>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current}{dynamic};
-              #t301.{core::Map::[]=}("bar", i){(core::String*, dynamic) →* void};
+              #t301.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
             }
           }
-          #t301.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+          #t301.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
         } =>#t301;
         core::List<core::int*>* list20 = block {
           final core::List<core::int*>* #t303 = core::_GrowableList::•<core::int*>(0);
@@ -2239,7 +2239,7 @@
                                       ^" in "int" as{TypeError} core::int*).{core::Iterable::iterator}{core::Iterator<core::int*>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-              #t303.{core::List::add}(i){(core::int*) →* void};
+              #t303.{core::List::add}{Invariant}(i){(core::int*) →* void};
             }
           }
         } =>#t303;
@@ -2253,10 +2253,10 @@
                                      ^" in "int" as{TypeError} core::int*).{core::Iterable::iterator}{core::Iterator<core::int*>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-              #t306.{core::Set::add}(i){(core::int*) →* core::bool*};
+              #t306.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
             }
           }
-          #t306.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t306.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t306;
         core::Map<core::String*, core::int*>* map20 = block {
           final core::Map<core::String*, core::int*>* #t309 = <core::String*, core::int*>{};
@@ -2268,10 +2268,10 @@
                                      ^" in "int" as{TypeError} core::int*).{core::Iterable::iterator}{core::Iterator<core::int*>*};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current}{core::int*};
-              #t309.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+              #t309.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
             }
           }
-          #t309.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t309.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
         } =>#t309;
         final core::List<dynamic>* #t312 = core::_GrowableList::•<dynamic>(0);
         {
@@ -2287,7 +2287,7 @@
               [yield] let dynamic #t315 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current}{dynamic};
-                #t312.{core::List::add}(i){(dynamic) →* void};
+                #t312.{core::List::add}{Invariant}(i){(dynamic) →* void};
               }
               else
                 break #L2;
@@ -2313,7 +2313,7 @@
               [yield] let dynamic #t320 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current}{dynamic};
-                #t317.{core::Set::add}(i){(dynamic) →* core::bool*};
+                #t317.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
               }
               else
                 break #L3;
@@ -2325,7 +2325,7 @@
             }
         }
         core::Set<dynamic>* set30 = block {
-          #t317.{core::Set::add}(null){(dynamic) →* core::bool*};
+          #t317.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
         } =>#t317;
         final core::Map<core::String*, dynamic>* #t322 = <core::String*, dynamic>{};
         {
@@ -2341,7 +2341,7 @@
               [yield] let dynamic #t325 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current}{dynamic};
-                #t322.{core::Map::[]=}("bar", i){(core::String*, dynamic) →* void};
+                #t322.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
               }
               else
                 break #L4;
@@ -2353,7 +2353,7 @@
             }
         }
         core::Map<core::String*, dynamic>* map30 = block {
-          #t322.{core::Map::[]=}("baz", null){(core::String*, dynamic) →* void};
+          #t322.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
         } =>#t322;
         final core::List<core::int*>* #t327 = core::_GrowableList::•<core::int*>(0);
         {
@@ -2370,7 +2370,7 @@
               [yield] let dynamic #t331 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current}{core::int*};
-                #t327.{core::List::add}(i){(core::int*) →* void};
+                #t327.{core::List::add}{Invariant}(i){(core::int*) →* void};
               }
               else
                 break #L5;
@@ -2397,7 +2397,7 @@
               [yield] let dynamic #t337 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current}{core::int*};
-                #t333.{core::Set::add}(i){(core::int*) →* core::bool*};
+                #t333.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
               }
               else
                 break #L6;
@@ -2409,7 +2409,7 @@
             }
         }
         core::Set<core::int*>* set40 = block {
-          #t333.{core::Set::add}(null){(core::int*) →* core::bool*};
+          #t333.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t333;
         final core::Map<core::String*, core::int*>* #t339 = <core::String*, core::int*>{};
         {
@@ -2426,7 +2426,7 @@
               [yield] let dynamic #t343 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}, :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current}{core::int*};
-                #t339.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+                #t339.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
               }
               else
                 break #L7;
@@ -2438,47 +2438,47 @@
             }
         }
         core::Map<core::String*, core::int*>* map40 = block {
-          #t339.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+          #t339.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
         } =>#t339;
         core::List<core::int*>* list50 = block {
           final core::List<core::int*>* #t345 = core::_GrowableList::•<core::int*>(0);
           for (; ; )
-            #t345.{core::List::add}(42){(core::int*) →* void};
+            #t345.{core::List::add}{Invariant}(42){(core::int*) →* void};
         } =>#t345;
         core::Set<core::int*>* set50 = block {
           final core::Set<core::int*>* #t346 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; ; )
-            #t346.{core::Set::add}(42){(core::int*) →* core::bool*};
-          #t346.{core::Set::add}(null){(core::int*) →* core::bool*};
+            #t346.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+          #t346.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t346;
         core::Map<core::String*, core::int*>* map50 = block {
           final core::Map<core::String*, core::int*>* #t347 = <core::String*, core::int*>{};
           for (; ; )
-            #t347.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-          #t347.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+            #t347.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+          #t347.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
         } =>#t347;
         core::List<core::int*>* list60 = block {
           final core::List<core::int*>* #t348 = core::_GrowableList::•<core::int*>(0);
           for (; let final Never* #t349 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-            #t348.{core::List::add}(42){(core::int*) →* void};
+            #t348.{core::List::add}{Invariant}(42){(core::int*) →* void};
         } =>#t348;
         core::Set<core::int*>* set60 = block {
           final core::Set<core::int*>* #t350 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; let final Never* #t351 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t350.{core::Set::add}(42){(core::int*) →* core::bool*};
-          #t350.{core::Set::add}(null){(core::int*) →* core::bool*};
+            #t350.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+          #t350.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
         } =>#t350;
         core::Map<core::String*, core::int*>* map60 = block {
           final core::Map<core::String*, core::int*>* #t352 = <core::String*, core::int*>{};
           for (; let final Never* #t353 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t352.{core::Map::[]=}("bar", 42){(core::String*, core::int*) →* void};
-          #t352.{core::Map::[]=}("baz", null){(core::String*, core::int*) →* void};
+            #t352.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+          #t352.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
         } =>#t352;
       }
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
@@ -2497,34 +2497,34 @@
   block {
     final core::List<core::int*>* #t354 = core::_GrowableList::•<core::int*>(0);
     await for (core::int* i in stream)
-      #t354.{core::List::add}(i){(core::int*) →* void};
+      #t354.{core::List::add}{Invariant}(i){(core::int*) →* void};
   } =>#t354;
   block {
     final core::Set<core::int*>* #t355 = new col::_CompactLinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t355.{core::Set::add}(i){(core::int*) →* core::bool*};
+      #t355.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
   } =>#t355;
   block {
     final core::Map<core::String*, core::int*>* #t356 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t356.{core::Map::[]=}("bar", i){(core::String*, core::int*) →* void};
+      #t356.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
   } =>#t356;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t357 = core::_GrowableList::•<core::int*>(0);
     if(a is self::B*)
-      #t357.{core::List::add}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* void};
+      #t357.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* void};
   } =>#t357;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t358 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t358.{core::Set::add}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* core::bool*};
+      #t358.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* core::bool*};
   } =>#t358;
   core::Map<core::int*, core::int*>* map10 = block {
     final core::Map<core::int*, core::int*>* #t359 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t359.{core::Map::[]=}(a{self::B*}.{self::B::foo}{core::int*}, a{self::B*}.{self::B::foo}{core::int*}){(core::int*, core::int*) →* void};
+      #t359.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}, a{self::B*}.{self::B::foo}{core::int*}){(core::int*, core::int*) →* void};
   } =>#t359;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.expect
index b700240..cc17e25 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.expect
@@ -8,6 +8,6 @@
   core::Object* b;
   return block {
     final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>();
-    #t1.{core::Set::add}(let final core::Object* #t2 = a in #t2 == null ?{core::Object*} b : #t2){(core::Object*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2 == null ?{core::Object*} b : #t2){(core::Object*) →* core::bool*};
   } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.transformed.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.transformed.expect
index 1cdc7aa..f6734712 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.transformed.expect
@@ -8,6 +8,6 @@
   core::Object* b;
   return block {
     final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>();
-    #t1.{core::Set::add}(let final core::Object* #t2 = a in #t2 == null ?{core::Object*} b : #t2){(core::Object*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2 == null ?{core::Object*} b : #t2){(core::Object*) →* core::bool*};
   } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/issue37027.dart.weak.expect b/pkg/front_end/testcases/general/issue37027.dart.weak.expect
index 531f7c1..eeb421b 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.weak.expect
@@ -10,7 +10,7 @@
       final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
       for (core::int e in ell)
         if(e.{core::int::isOdd}{core::bool})
-          #t1.{core::Set::add}(2.{core::num::*}(e){(core::num) → core::int}){(core::int) → core::bool};
+          #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e){(core::num) → core::int}){(core::int) → core::bool};
     } =>#t1, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/general/issue37027.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.weak.transformed.expect
index e32389f..ea3bc5b 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           core::int e = :sync-for-iterator.{core::Iterator::current}{core::int};
           if(e.{core::int::isOdd}{core::bool})
-            #t1.{core::Set::add}(2.{core::num::*}(e){(core::num) → core::int}){(core::int) → core::bool};
+            #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e){(core::num) → core::int}){(core::int) → core::bool};
         }
       }
     } =>#t1, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.weak.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.expect
index d64a199..01b31a0 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.weak.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.expect
@@ -8,26 +8,26 @@
     final core::List<core::String*>* #t1 = <core::String*>["foo"];
     final core::Iterable<core::String*>* #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2){(core::Iterable<core::String*>*) →* void};
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
   } =>#t1;
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t3 = col::LinkedHashSet::•<core::String*>();
-    #t3.{core::Set::add}("foo"){(core::String*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}("foo"){(core::String*) →* core::bool*};
     final core::Iterable<core::String*>* #t4 = set;
     if(!(#t4 == null))
-      #t3.{core::Set::addAll}(#t4){(core::Iterable<core::String*>*) →* void};
+      #t3.{core::Set::addAll}{Invariant}(#t4){(core::Iterable<core::String*>*) →* void};
   } =>#t3;
 }
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t5 = <core::int*, core::String*>{};
-    #t5.{core::Map::[]=}(0, "foo"){(core::int*, core::String*) →* void};
+    #t5.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
     final core::Map<core::int*, core::String*>* #t6 = map;
     if(!(#t6 == null))
       for (final core::MapEntry<core::int*, core::String*>* #t7 in #t6.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>})
-        #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}{core::int*}, #t7.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+        #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{core::int*}, #t7.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
   } =>#t5;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.weak.transformed.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.transformed.expect
index a1389b2..1dc0cf1 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.transformed.expect
@@ -8,28 +8,28 @@
     final core::List<core::String*>* #t1 = core::_GrowableList::_literal1<core::String*>("foo");
     final core::Iterable<core::String*>* #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2){(core::Iterable<core::String*>*) →* void};
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
   } =>#t1;
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t3 = new col::_CompactLinkedHashSet::•<core::String*>();
-    #t3.{core::Set::add}("foo"){(core::String*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}("foo"){(core::String*) →* core::bool*};
     final core::Iterable<core::String*>* #t4 = set;
     if(!(#t4 == null))
-      #t3.{core::Set::addAll}(#t4){(core::Iterable<core::String*>*) →* void};
+      #t3.{core::Set::addAll}{Invariant}(#t4){(core::Iterable<core::String*>*) →* void};
   } =>#t3;
 }
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t5 = <core::int*, core::String*>{};
-    #t5.{core::Map::[]=}(0, "foo"){(core::int*, core::String*) →* void};
+    #t5.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
     final core::Map<core::int*, core::String*>* #t6 = map;
     if(!(#t6 == null)) {
       core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = #t6.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::String*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int*, core::String*>* #t7 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::String*>};
-        #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}{core::int*}, #t7.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+        #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{core::int*}, #t7.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
       }
     }
   } =>#t5;
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.weak.expect b/pkg/front_end/testcases/general/spread_collection.dart.weak.expect
index 6200efa..6948e05 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.weak.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.weak.expect
@@ -14,28 +14,28 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[1];
-    #t1.{core::List::addAll}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<core::int*>* #t2 = <core::int*>[3];
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2){(core::Iterable<core::int*>*) →* void};
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::int*>*) →* void};
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1){(core::int*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
     for (final core::MapEntry<core::int*, core::int*>* #t4 in <core::int*, core::int*>{2: 2}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{core::int*}, #t4.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{core::int*}, #t4.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{3: 3};
     if(!(#t5 == null))
       for (final core::MapEntry<core::int*, core::int*>* #t6 in #t5.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
-        #t3.{core::Map::[]=}(#t6.{core::MapEntry::key}{core::int*}, #t6.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{core::int*}, #t6.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
   } =>#t3;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(1){(core::int*) →* core::bool*};
-    #t7.{core::Set::addAll}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
+    #t7.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t7.{core::Set::addAll}{Invariant}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<core::int*>* #t8 = <core::int*>[3];
     if(!(#t8 == null))
-      #t7.{core::Set::addAll}(#t8){(core::Iterable<core::int*>*) →* void};
+      #t7.{core::Set::addAll}{Invariant}(#t8){(core::Iterable<core::int*>*) →* void};
   } =>#t7;
   final Never* aSetOrMap = invalid-expression "pkg/front_end/testcases/general/spread_collection.dart:21: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.
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.weak.transformed.expect
index b25f44b..29f6481 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.weak.transformed.expect
@@ -14,19 +14,19 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = core::_GrowableList::_literal1<core::int*>(1);
-    #t1.{core::List::addAll}(core::_GrowableList::_literal1<core::int*>(2)){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(2)){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<core::int*>* #t2 = core::_GrowableList::_literal1<core::int*>(3);
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2){(core::Iterable<core::int*>*) →* void};
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::int*>*) →* void};
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1){(core::int*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
     {
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{2: 2}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int*, core::int*>* #t4 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::int*>};
-        #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{core::int*}, #t4.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{core::int*}, #t4.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
       }
     }
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{3: 3};
@@ -34,17 +34,17 @@
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = #t5.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int*, core::int*>* #t6 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::int*>};
-        #t3.{core::Map::[]=}(#t6.{core::MapEntry::key}{core::int*}, #t6.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+        #t3.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{core::int*}, #t6.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
       }
     }
   } =>#t3;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t7 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(1){(core::int*) →* core::bool*};
-    #t7.{core::Set::addAll}(core::_GrowableList::_literal1<core::int*>(2)){(core::Iterable<core::int*>*) →* void};
+    #t7.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t7.{core::Set::addAll}{Invariant}(core::_GrowableList::_literal1<core::int*>(2)){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<core::int*>* #t8 = core::_GrowableList::_literal1<core::int*>(3);
     if(!(#t8 == null))
-      #t7.{core::Set::addAll}(#t8){(core::Iterable<core::int*>*) →* void};
+      #t7.{core::Set::addAll}{Invariant}(#t8){(core::Iterable<core::int*>*) →* void};
   } =>#t7;
   final Never* aSetOrMap = invalid-expression "pkg/front_end/testcases/general/spread_collection.dart:21: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.
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.expect
index 44ce1a9..45b2b8f 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.expect
@@ -114,50 +114,50 @@
   core::Map<dynamic, dynamic>* map10 = block {
     final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t4 in <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
   } =>#t3;
   core::Map<dynamic, dynamic>* map10ambiguous = block {
     final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
   } =>#t5;
   core::List<core::int*>* lhs20 = block {
     final core::List<core::int*>* #t7 = core::List::of<core::int*>(spread);
   } =>#t7;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t8 = col::LinkedHashSet::of<core::int*>(spread);
-    #t8.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t10 in spread) {
       final core::int* #t11 = #t10 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
     }
   } =>#t9;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t12 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t13 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t12.{core::Map::[]=}("baz", 42){(core::String*, core::int*) →* void};
+      #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
   } =>#t12;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t15 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String*}, #t15.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String*}, #t15.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
   } =>#t14;
   core::List<dynamic>* lhs21 = block {
     final core::List<dynamic>* #t16 = core::List::of<dynamic>((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*);
   } =>#t16;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t17 = col::LinkedHashSet::of<dynamic>((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*);
-    #t17.{core::Set::add}(42){(dynamic) →* core::bool*};
+    #t17.{core::Set::add}{Invariant}(42){(dynamic) →* core::bool*};
   } =>#t17;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t18 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t19 in ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
-    #t18.{core::Map::[]=}("baz", 42){(dynamic, dynamic) →* void};
+      #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+    #t18.{core::Map::[]=}{Invariant}("baz", 42){(dynamic, dynamic) →* void};
   } =>#t18;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -168,38 +168,38 @@
   } =>#t20;
   core::Set<core::int*>* set22 = block {
     final core::Set<core::int*>* #t21 = col::LinkedHashSet::of<core::int*>(<core::int*>[]);
-    #t21.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t21.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t21;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t23 in <core::int*>[]) {
       final core::int* #t24 = #t23 as{TypeError} core::int*;
-      #t22.{core::Set::add}(#t24){(core::int*) →* core::bool*};
+      #t22.{core::Set::add}{Invariant}(#t24){(core::int*) →* core::bool*};
     }
   } =>#t22;
   core::Map<core::String*, core::int*>* map22 = block {
     final core::Map<core::String*, core::int*>* #t25 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t26 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t25.{core::Map::[]=}(#t26.{core::MapEntry::key}{core::String*}, #t26.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+      #t25.{core::Map::[]=}{Invariant}(#t26.{core::MapEntry::key}{core::String*}, #t26.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
   } =>#t25;
   core::List<core::List<core::int*>*>* lhs23 = block {
     final core::List<core::List<core::int*>*>* #t27 = core::List::of<core::List<core::int*>*>(<core::List<core::int*>*>[<core::int*>[]]);
   } =>#t27;
   core::Set<core::List<core::int*>*>* set23 = block {
     final core::Set<core::List<core::int*>*>* #t28 = col::LinkedHashSet::of<core::List<core::int*>*>(<core::List<core::int*>*>[<core::int*>[]]);
-    #t28.{core::Set::add}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+    #t28.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
   } =>#t28;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t29 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (final dynamic #t30 in <core::List<core::int*>*>[<core::int*>[]]) {
       final core::List<core::int*>* #t31 = #t30 as{TypeError} core::List<core::int*>*;
-      #t29.{core::Set::add}(#t31){(core::List<core::int*>*) →* core::bool*};
+      #t29.{core::Set::add}{Invariant}(#t31){(core::List<core::int*>*) →* core::bool*};
     }
   } =>#t29;
   core::Map<core::String*, core::List<core::int*>*>* map23 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t32 = <core::String*, core::List<core::int*>*>{};
     for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
-      #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+      #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
   } =>#t32;
   dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:96:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   dynamic map24ambiguous = {...spread, ...mapSpread};
@@ -215,7 +215,7 @@
   int set30 = /*@ typeArgs=int* */ {...spread, 42};
                                    ^" in ( block {
     final core::Set<core::int*>* #t37 = col::LinkedHashSet::of<core::int*>(spread);
-    #t37.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t37.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t37) as{TypeError} core::int*;
   core::int* set30ambiguous = let final Never* #t38 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -224,7 +224,7 @@
     final core::Set<core::int*>* #t39 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t40 in spread) {
       final core::int* #t41 = #t40 as{TypeError} core::int*;
-      #t39.{core::Set::add}(#t41){(core::int*) →* core::bool*};
+      #t39.{core::Set::add}{Invariant}(#t41){(core::int*) →* core::bool*};
     }
   } =>#t39) as{TypeError} core::int*;
   core::int* map30 = let final Never* #t42 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
@@ -233,8 +233,8 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t43 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t44 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t43.{core::Map::[]=}(#t44.{core::MapEntry::key}{core::String*}, #t44.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
-    #t43.{core::Map::[]=}("baz", 42){(core::String*, core::int*) →* void};
+      #t43.{core::Map::[]=}{Invariant}(#t44.{core::MapEntry::key}{core::String*}, #t44.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t43.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
   } =>#t43) as{TypeError} core::int*;
   core::int* map30ambiguous = let final Never* #t45 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -242,14 +242,14 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t46 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t47 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t46.{core::Map::[]=}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+      #t46.{core::Map::[]=}{Invariant}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
   } =>#t46) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
   core::Set<dynamic>* set40 = block {
     final core::Set<dynamic>* #t48 = col::LinkedHashSet::•<dynamic>();
-    #t48.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    #t48.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
                                     ^"){(dynamic) →* core::bool*};
   } =>#t48;
@@ -261,7 +261,7 @@
                                      ^"];
   core::Set<dynamic>* set50 = block {
     final core::Set<dynamic>* #t49 = col::LinkedHashSet::•<dynamic>();
-    #t49.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    #t49.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
                                     ^"){(dynamic) →* core::bool*};
   } =>#t49;
@@ -273,7 +273,7 @@
                                    ^"];
   core::Set<core::String*>* set60 = block {
     final core::Set<core::String*>* #t50 = col::LinkedHashSet::•<core::String*>();
-    #t50.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    #t50.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
                                   ^"){(core::String*) →* core::bool*};
   } =>#t50;
@@ -288,18 +288,18 @@
                              ^"];
   core::Set<core::int*>* set70 = block {
     final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
-    #t51.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+    #t51.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^"){(core::int*) →* core::bool*};
   } =>#t51;
   core::Set<dynamic>* set71ambiguous = block {
     final core::Set<dynamic>* #t52 = col::LinkedHashSet::•<dynamic>();
-    #t52.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
+    #t52.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
     ...null,
        ^"){(dynamic) →* core::bool*};
     for (final dynamic #t53 in <dynamic>[]) {
       final dynamic #t54 = #t53 as{TypeError} dynamic;
-      #t52.{core::Set::add}(#t54){(dynamic) →* core::bool*};
+      #t52.{core::Set::add}{Invariant}(#t54){(dynamic) →* core::bool*};
     }
   } =>#t52;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
@@ -309,13 +309,13 @@
     final core::List<core::int*>* #t55 = <core::int*>[];
     final core::Iterable<core::int*>* #t56 = null;
     if(!(#t56 == null))
-      #t55.{core::List::addAll}(#t56){(core::Iterable<core::int*>*) →* void};
+      #t55.{core::List::addAll}{Invariant}(#t56){(core::Iterable<core::int*>*) →* void};
   } =>#t55;
   core::Set<core::int*>* set80 = block {
     final core::Set<core::int*>* #t57 = col::LinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t58 = null;
     if(!(#t58 == null))
-      #t57.{core::Set::addAll}(#t58){(core::Iterable<core::int*>*) →* void};
+      #t57.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::int*>*) →* void};
   } =>#t57;
   core::Set<dynamic>* set81ambiguous = block {
     final core::Set<dynamic>* #t59 = col::LinkedHashSet::•<dynamic>();
@@ -323,11 +323,11 @@
     if(!(#t60 == null))
       for (final dynamic #t61 in #t60) {
         final dynamic #t62 = #t61 as{TypeError} dynamic;
-        #t59.{core::Set::add}(#t62){(dynamic) →* core::bool*};
+        #t59.{core::Set::add}{Invariant}(#t62){(dynamic) →* core::bool*};
       }
     for (final dynamic #t63 in <dynamic>[]) {
       final dynamic #t64 = #t63 as{TypeError} dynamic;
-      #t59.{core::Set::add}(#t64){(dynamic) →* core::bool*};
+      #t59.{core::Set::add}{Invariant}(#t64){(dynamic) →* core::bool*};
     }
   } =>#t59;
   core::Map<core::String*, core::int*>* map80 = block {
@@ -335,18 +335,18 @@
     final core::Map<core::String*, core::int*>* #t66 = null;
     if(!(#t66 == null))
       for (final core::MapEntry<core::String*, core::int*>* #t67 in #t66.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-        #t65.{core::Map::[]=}(#t67.{core::MapEntry::key}{core::String*}, #t67.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t65.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}{core::String*}, #t67.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
   } =>#t65;
   core::Map<core::String*, core::int*>* map90 = block {
     final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t69 in self::bar<core::String*, core::int*>().{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
-      #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}{core::String*}, #t69.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+      #t68.{core::Map::[]=}{Invariant}(#t69.{core::MapEntry::key}{core::String*}, #t69.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
   } =>#t68;
   core::List<core::int*>* list100 = block {
     final core::List<core::int*>* #t70 = <core::int*>[];
     for (final dynamic #t71 in listNum) {
       final core::int* #t72 = #t71 as{TypeError} core::int*;
-      #t70.{core::List::add}(#t72){(core::int*) →* void};
+      #t70.{core::List::add}{Invariant}(#t72){(core::int*) →* void};
     }
   } =>#t70;
   core::Map<core::num*, core::int*>* map100 = block {
@@ -354,14 +354,14 @@
     for (final core::MapEntry<dynamic, dynamic>* #t74 in mapIntNum.{core::Map::entries}{core::Iterable<core::MapEntry<core::num*, core::int*>>}) {
       final core::num* #t75 = #t74.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
       final core::int* #t76 = #t74.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-      #t73.{core::Map::[]=}(#t75, #t76){(core::num*, core::int*) →* void};
+      #t73.{core::Map::[]=}{Invariant}(#t75, #t76){(core::num*, core::int*) →* void};
     }
   } =>#t73;
   core::List<core::int*>* list110 = block {
     final core::List<core::int*>* #t77 = <core::int*>[];
     for (final dynamic #t78 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t79 = #t78 as{TypeError} core::int*;
-      #t77.{core::List::add}(#t79){(core::int*) →* void};
+      #t77.{core::List::add}{Invariant}(#t79){(core::int*) →* void};
     }
   } =>#t77;
   core::Map<core::num*, core::int*>* map110 = block {
@@ -369,7 +369,7 @@
     for (final core::MapEntry<dynamic, dynamic>* #t81 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::num*, core::int*>>}) {
       final core::num* #t82 = #t81.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
       final core::int* #t83 = #t81.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-      #t80.{core::Map::[]=}(#t82, #t83){(core::num*, core::int*) →* void};
+      #t80.{core::Map::[]=}{Invariant}(#t82, #t83){(core::num*, core::int*) →* void};
     }
   } =>#t80;
 }
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.transformed.expect
index 82b8b77..05add98 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.transformed.expect
@@ -117,7 +117,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic>* #t4 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+        #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
       }
     }
   } =>#t3;
@@ -127,7 +127,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+        #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
       }
     }
   } =>#t5;
@@ -136,7 +136,7 @@
   } =>#t7;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t8 = col::LinkedHashSet::of<core::int*>(spread);
-    #t8.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -146,7 +146,7 @@
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{core::int*};
         {
           final core::int* #t11 = #t10 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
         }
       }
     }
@@ -157,10 +157,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t12.{core::Map::[]=}("baz", 42){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
   } =>#t12;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
@@ -168,7 +168,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t15 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String*}, #t15.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String*}, #t15.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
   } =>#t14;
@@ -177,7 +177,7 @@
   } =>#t16;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t17 = col::LinkedHashSet::of<dynamic>((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*);
-    #t17.{core::Set::add}(42){(dynamic) →* core::bool*};
+    #t17.{core::Set::add}{Invariant}(42){(dynamic) →* core::bool*};
   } =>#t17;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t18 = <dynamic, dynamic>{};
@@ -185,10 +185,10 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic>* #t19 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
       }
     }
-    #t18.{core::Map::[]=}("baz", 42){(dynamic, dynamic) →* void};
+    #t18.{core::Map::[]=}{Invariant}("baz", 42){(dynamic, dynamic) →* void};
   } =>#t18;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -199,7 +199,7 @@
   } =>#t20;
   core::Set<core::int*>* set22 = block {
     final core::Set<core::int*>* #t21 = col::LinkedHashSet::of<core::int*>(core::_GrowableList::•<core::int*>(0));
-    #t21.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t21.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t21;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -209,7 +209,7 @@
         final dynamic #t23 = :sync-for-iterator.{core::Iterator::current}{core::int*};
         {
           final core::int* #t24 = #t23 as{TypeError} core::int*;
-          #t22.{core::Set::add}(#t24){(core::int*) →* core::bool*};
+          #t22.{core::Set::add}{Invariant}(#t24){(core::int*) →* core::bool*};
         }
       }
     }
@@ -220,7 +220,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t26 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t25.{core::Map::[]=}(#t26.{core::MapEntry::key}{core::String*}, #t26.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t25.{core::Map::[]=}{Invariant}(#t26.{core::MapEntry::key}{core::String*}, #t26.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
   } =>#t25;
@@ -229,7 +229,7 @@
   } =>#t27;
   core::Set<core::List<core::int*>*>* set23 = block {
     final core::Set<core::List<core::int*>*>* #t28 = col::LinkedHashSet::of<core::List<core::int*>*>(core::_GrowableList::_literal1<core::List<core::int*>*>(core::_GrowableList::•<core::int*>(0)));
-    #t28.{core::Set::add}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
+    #t28.{core::Set::add}{Invariant}(core::_GrowableList::_literal1<core::int*>(42)){(core::List<core::int*>*) →* core::bool*};
   } =>#t28;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t29 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
@@ -239,7 +239,7 @@
         final dynamic #t30 = :sync-for-iterator.{core::Iterator::current}{core::List<core::int*>*};
         {
           final core::List<core::int*>* #t31 = #t30 as{TypeError} core::List<core::int*>*;
-          #t29.{core::Set::add}(#t31){(core::List<core::int*>*) →* core::bool*};
+          #t29.{core::Set::add}{Invariant}(#t31){(core::List<core::int*>*) →* core::bool*};
         }
       }
     }
@@ -250,7 +250,7 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"baz": core::_GrowableList::•<core::int*>(0)}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::List<core::int*>*>};
-        #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+        #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
       }
     }
   } =>#t32;
@@ -268,7 +268,7 @@
   int set30 = /*@ typeArgs=int* */ {...spread, 42};
                                    ^" in ( block {
     final core::Set<core::int*>* #t37 = col::LinkedHashSet::of<core::int*>(spread);
-    #t37.{core::Set::add}(42){(core::int*) →* core::bool*};
+    #t37.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
   } =>#t37) as{TypeError} core::int*;
   core::int* set30ambiguous = let final Never* #t38 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -281,7 +281,7 @@
         final dynamic #t40 = :sync-for-iterator.{core::Iterator::current}{core::int*};
         {
           final core::int* #t41 = #t40 as{TypeError} core::int*;
-          #t39.{core::Set::add}(#t41){(core::int*) →* core::bool*};
+          #t39.{core::Set::add}{Invariant}(#t41){(core::int*) →* core::bool*};
         }
       }
     }
@@ -295,10 +295,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t44 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t43.{core::Map::[]=}(#t44.{core::MapEntry::key}{core::String*}, #t44.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t43.{core::Map::[]=}{Invariant}(#t44.{core::MapEntry::key}{core::String*}, #t44.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
-    #t43.{core::Map::[]=}("baz", 42){(core::String*, core::int*) →* void};
+    #t43.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
   } =>#t43) as{TypeError} core::int*;
   core::int* map30ambiguous = let final Never* #t45 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -309,7 +309,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t47 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t46.{core::Map::[]=}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t46.{core::Map::[]=}{Invariant}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
   } =>#t46) as{TypeError} core::int*;
@@ -318,7 +318,7 @@
                                      ^");
   core::Set<dynamic>* set40 = block {
     final core::Set<dynamic>* #t48 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t48.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    #t48.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
                                     ^"){(dynamic) →* core::bool*};
   } =>#t48;
@@ -330,7 +330,7 @@
                                      ^");
   core::Set<dynamic>* set50 = block {
     final core::Set<dynamic>* #t49 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t49.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    #t49.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
                                     ^"){(dynamic) →* core::bool*};
   } =>#t49;
@@ -342,7 +342,7 @@
                                    ^");
   core::Set<core::String*>* set60 = block {
     final core::Set<core::String*>* #t50 = new col::_CompactLinkedHashSet::•<core::String*>();
-    #t50.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    #t50.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
                                   ^"){(core::String*) →* core::bool*};
   } =>#t50;
@@ -357,13 +357,13 @@
                              ^");
   core::Set<core::int*>* set70 = block {
     final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t51.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+    #t51.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^"){(core::int*) →* core::bool*};
   } =>#t51;
   core::Set<dynamic>* set71ambiguous = block {
     final core::Set<dynamic>* #t52 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t52.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
+    #t52.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
     ...null,
        ^"){(dynamic) →* core::bool*};
     {
@@ -372,7 +372,7 @@
         final dynamic #t53 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final dynamic #t54 = #t53 as{TypeError} dynamic;
-          #t52.{core::Set::add}(#t54){(dynamic) →* core::bool*};
+          #t52.{core::Set::add}{Invariant}(#t54){(dynamic) →* core::bool*};
         }
       }
     }
@@ -384,13 +384,13 @@
     final core::List<core::int*>* #t55 = core::_GrowableList::•<core::int*>(0);
     final core::Iterable<core::int*>* #t56 = null;
     if(!(#t56 == null))
-      #t55.{core::List::addAll}(#t56){(core::Iterable<core::int*>*) →* void};
+      #t55.{core::List::addAll}{Invariant}(#t56){(core::Iterable<core::int*>*) →* void};
   } =>#t55;
   core::Set<core::int*>* set80 = block {
     final core::Set<core::int*>* #t57 = new col::_CompactLinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t58 = null;
     if(!(#t58 == null))
-      #t57.{core::Set::addAll}(#t58){(core::Iterable<core::int*>*) →* void};
+      #t57.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::int*>*) →* void};
   } =>#t57;
   core::Set<dynamic>* set81ambiguous = block {
     final core::Set<dynamic>* #t59 = new col::_CompactLinkedHashSet::•<dynamic>();
@@ -401,7 +401,7 @@
         final dynamic #t61 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final dynamic #t62 = #t61 as{TypeError} dynamic;
-          #t59.{core::Set::add}(#t62){(dynamic) →* core::bool*};
+          #t59.{core::Set::add}{Invariant}(#t62){(dynamic) →* core::bool*};
         }
       }
     }
@@ -411,7 +411,7 @@
         final dynamic #t63 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final dynamic #t64 = #t63 as{TypeError} dynamic;
-          #t59.{core::Set::add}(#t64){(dynamic) →* core::bool*};
+          #t59.{core::Set::add}{Invariant}(#t64){(dynamic) →* core::bool*};
         }
       }
     }
@@ -423,7 +423,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = #t66.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t67 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t65.{core::Map::[]=}(#t67.{core::MapEntry::key}{core::String*}, #t67.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t65.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}{core::String*}, #t67.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
   } =>#t65;
@@ -433,7 +433,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = self::bar<core::String*, core::int*>().{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String*, core::int*>* #t69 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String*, core::int*>};
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}{core::String*}, #t69.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+        #t68.{core::Map::[]=}{Invariant}(#t69.{core::MapEntry::key}{core::String*}, #t69.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
       }
     }
   } =>#t68;
@@ -445,7 +445,7 @@
         final dynamic #t71 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t72 = #t71 as{TypeError} core::int*;
-          #t70.{core::List::add}(#t72){(core::int*) →* void};
+          #t70.{core::List::add}{Invariant}(#t72){(core::int*) →* void};
         }
       }
     }
@@ -459,7 +459,7 @@
         {
           final core::num* #t75 = #t74.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
           final core::int* #t76 = #t74.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-          #t73.{core::Map::[]=}(#t75, #t76){(core::num*, core::int*) →* void};
+          #t73.{core::Map::[]=}{Invariant}(#t75, #t76){(core::num*, core::int*) →* void};
         }
       }
     }
@@ -472,7 +472,7 @@
         final dynamic #t78 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t79 = #t78 as{TypeError} core::int*;
-          #t77.{core::List::add}(#t79){(core::int*) →* void};
+          #t77.{core::List::add}{Invariant}(#t79){(core::int*) →* void};
         }
       }
     }
@@ -486,7 +486,7 @@
         {
           final core::num* #t82 = #t81.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
           final core::int* #t83 = #t81.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-          #t80.{core::Map::[]=}(#t82, #t83){(core::num*, core::int*) →* void};
+          #t80.{core::Map::[]=}{Invariant}(#t82, #t83){(core::num*, core::int*) →* void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.expect
index 7906e15..1b6e2a9 100644
--- a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.expect
@@ -15,7 +15,7 @@
   core::List<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> y = <<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>[#C1];
   core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> z = block {
     final core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> #t1 = col::LinkedHashSet::•<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>();
-    #t1.{core::Set::add}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
+    #t1.{core::Set::add}{Invariant}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
   } =>#t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
index 45504ea..56b3959 100644
--- a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
   core::List<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> y = core::_GrowableList::_literal1<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>(#C1);
   core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> z = block {
     final core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> #t1 = new col::_CompactLinkedHashSet::•<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>();
-    #t1.{core::Set::add}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
+    #t1.{core::Set::add}{Invariant}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
   } =>#t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.expect
index 7906e15..1b6e2a9 100644
--- a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.expect
@@ -15,7 +15,7 @@
   core::List<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> y = <<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>[#C1];
   core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> z = block {
     final core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> #t1 = col::LinkedHashSet::•<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>();
-    #t1.{core::Set::add}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
+    #t1.{core::Set::add}{Invariant}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
   } =>#t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
index 45504ea..56b3959 100644
--- a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
   core::List<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> y = core::_GrowableList::_literal1<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>(#C1);
   core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> z = block {
     final core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> #t1 = new col::_CompactLinkedHashSet::•<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>();
-    #t1.{core::Set::add}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
+    #t1.{core::Set::add}{Invariant}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
   } =>#t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
index 2b4c9cc..b258f3f 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
@@ -135,21 +135,21 @@
 }
 static method callField(self::Class* c) → dynamic {
   self::expect(0, c.{self::Class::field1a}());
-  self::expect(0, c.{self::Class::field1b}());
-  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}(#t2));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}(#t4, #t5));
-  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}(#t7));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}(#t9, #t10));
-  self::expect(0, c.{self::Class::field5}());
-  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}(#t12));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}(#t14, #t15));
-  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}(#t17));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}(#t19, b: #t20));
-  self::expect(0, c.{self::Class::field7}());
-  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}(a: #t22));
-  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}(b: #t24));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}(a: #t26, b: #t27));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}(b: #t29, a: #t30));
+  self::expect(0, c.{self::Class::field1b}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}(#t2){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}(#t4, #t5){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}(#t7){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}(#t9, #t10){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::field5}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}(#t12){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}(#t14, #t15){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}(#t17){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}(#t19, b: #t20){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::field7}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}(a: #t22){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}(b: #t24){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}(a: #t26, b: #t27){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}(b: #t29, a: #t30){({a: core::int*, b: core::int*}) →* core::int*});
 }
 static method callGetter(self::Class* c) → dynamic {
   self::expect(0, c.{self::Class::getter1a}());
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
index 3c6b74a..384940b 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
@@ -135,21 +135,21 @@
 }
 static method callField(self::Class* c) → dynamic {
   self::expect(0, c.{self::Class::field1a}());
-  self::expect(0, c.{self::Class::field1b}());
-  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}(#t2));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}(#t4, #t5));
-  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}(#t7));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}(#t9, #t10));
-  self::expect(0, c.{self::Class::field5}());
-  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}(#t12));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}(#t14, #t15));
-  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}(#t17));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}(#t19, b: #t20));
-  self::expect(0, c.{self::Class::field7}());
-  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}(a: #t22));
-  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}(b: #t24));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}(a: #t26, b: #t27));
-  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}(b: #t29, a: #t30));
+  self::expect(0, c.{self::Class::field1b}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}(#t2){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}(#t4, #t5){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}(#t7){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}(#t9, #t10){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::field5}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}(#t12){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}(#t14, #t15){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}(#t17){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}(#t19, b: #t20){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::field7}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}(a: #t22){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}(b: #t24){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}(a: #t26, b: #t27){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}(b: #t29, a: #t30){({a: core::int*, b: core::int*}) →* core::int*});
 }
 static method callGetter(self::Class* c) → dynamic {
   self::expect(0, c.{self::Class::getter1a}());
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.expect
index 21856f2..5469618 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.expect
@@ -8,7 +8,7 @@
     : self::A::f = f, super core::Object::•()
     ;
   method foo(generic-covariant-impl self::A::T* x) → dynamic
-    return let final self::A::T* #t1 = x in this.{self::A::f}(#t1);
+    return let final self::A::T* #t1 = x in this.{self::A::f}(#t1){(self::A::T*) →* void};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.transformed.expect
index 21856f2..5469618 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : self::A::f = f, super core::Object::•()
     ;
   method foo(generic-covariant-impl self::A::T* x) → dynamic
-    return let final self::A::T* #t1 = x in this.{self::A::f}(#t1);
+    return let final self::A::T* #t1 = x in this.{self::A::f}(#t1){(self::A::T*) →* void};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
index 956e810..d5af00b 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
@@ -127,7 +127,7 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t7.{core::List::add}(i){(core::int) → void};
+      #t7.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t7;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
index 3e60aa9..95d50a9 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
@@ -133,7 +133,7 @@
   block {
     final core::List<core::int> #t7 = core::_GrowableList::•<core::int>(0);
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t7.{core::List::add}(i){(core::int) → void};
+      #t7.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t7;
 }
 static method hest() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
index 4ce79cc..00a9a68 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -147,7 +147,7 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t7.{core::List::add}(i){(core::int) → void};
+      #t7.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t7;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
index 53b5f1b..7c57520 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
@@ -153,7 +153,7 @@
   block {
     final core::List<core::int> #t7 = core::_GrowableList::•<core::int>(0);
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t7.{core::List::add}(i){(core::int) → void};
+      #t7.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t7;
 }
 static method hest() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
index 6318674..6dec7c2 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
@@ -1014,10 +1014,10 @@
   core::Function functionVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Function;
   functionVar = functionArg;
   functionVar = toVoidArg;
-  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call};
+  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call}{() → void};
   () → void toVoidVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} () → void;
   toVoidVar = toVoidArg;
-  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call};
+  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call}{() → void};
   self::Tearoffable tearoffableVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::Tearoffable;
   tearoffableVar = tearoffableArg;
   self::ok::XnonNull xNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XnonNull;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
index 0bef535..8a79a2f 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
@@ -1014,10 +1014,10 @@
   core::Function functionVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Function;
   functionVar = functionArg;
   functionVar = toVoidArg;
-  functionVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call};
+  functionVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call}{() → void};
   () → void toVoidVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} () → void;
   toVoidVar = toVoidArg;
-  toVoidVar = let final self::Tearoffable #t3 = tearoffableArg in #t3 == null ?{() → void} null : #t3.{self::Tearoffable::call};
+  toVoidVar = let final self::Tearoffable #t3 = tearoffableArg in #t3 == null ?{() → void} null : #t3.{self::Tearoffable::call}{() → void};
   self::Tearoffable tearoffableVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::Tearoffable;
   tearoffableVar = tearoffableArg;
   self::ok::XnonNull xNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XnonNull;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index 6318674..6dec7c2 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -1014,10 +1014,10 @@
   core::Function functionVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Function;
   functionVar = functionArg;
   functionVar = toVoidArg;
-  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call};
+  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call}{() → void};
   () → void toVoidVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} () → void;
   toVoidVar = toVoidArg;
-  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call};
+  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call}{() → void};
   self::Tearoffable tearoffableVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::Tearoffable;
   tearoffableVar = tearoffableArg;
   self::ok::XnonNull xNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XnonNull;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
index e558c54..906e01c 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -1014,10 +1014,10 @@
   core::Function functionVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Function;
   functionVar = functionArg;
   functionVar = toVoidArg;
-  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call};
+  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call}{() → void};
   () → void toVoidVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} () → void;
   toVoidVar = toVoidArg;
-  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call};
+  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call}{() → void};
   self::Tearoffable tearoffableVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::Tearoffable;
   tearoffableVar = tearoffableArg;
   self::ok::XnonNull xNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XnonNull;
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
index 4b9bd7e..b5c4d02 100644
--- a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
@@ -333,7 +333,7 @@
 static method baz(self::C c) → void {
   self::bazContext(let final Never #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
   bazContext(c);
-             ^" in (let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+             ^" in (let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call}{() → core::num?}) as{TypeError,ForNonNullableByDefault} () → core::num);
 }
 static method boz(Null x) → self::A {
   self::fooContext(let final Never #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
index ca909b2..74f4fa8 100644
--- a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
@@ -375,7 +375,7 @@
 static method baz(self::C c) → void {
   self::bazContext(let final Never #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
   bazContext(c);
-             ^" in (let final self::C #t21 = c in #t21 == null ?{() → core::num?} null : #t21.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+             ^" in (let final self::C #t21 = c in #t21 == null ?{() → core::num?} null : #t21.{self::C::call}{() → core::num?}) as{TypeError,ForNonNullableByDefault} () → core::num);
 }
 static method boz(Null x) → self::A {
   self::fooContext(let final Never #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
index 4b9bd7e..b5c4d02 100644
--- a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
@@ -333,7 +333,7 @@
 static method baz(self::C c) → void {
   self::bazContext(let final Never #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
   bazContext(c);
-             ^" in (let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+             ^" in (let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call}{() → core::num?}) as{TypeError,ForNonNullableByDefault} () → core::num);
 }
 static method boz(Null x) → self::A {
   self::fooContext(let final Never #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
index b693442..454dea3 100644
--- a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
@@ -375,7 +375,7 @@
 static method baz(self::C c) → void {
   self::bazContext(let final Never #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
   bazContext(c);
-             ^" in let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call});
+             ^" in let final self::C #t15 = c in #t15 == null ?{() → core::num?} null : #t15.{self::C::call}{() → core::num?});
 }
 static method boz(Null x) → self::A {
   self::fooContext(let final Never #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
index a1bd97a..8b35773 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
@@ -63,7 +63,7 @@
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t2.{core::List::add}(x){(core::int) → void};
+      #t2.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t2;
   for (core::int x in let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
@@ -78,7 +78,7 @@
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t5.{core::List::add}(x){(core::int) → void};
+      #t5.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t5;
   for (final dynamic #t7 in let final Never #t8 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Object' is from 'dart:core'.
@@ -96,7 +96,7 @@
   [for (int x in o1) x];
                  ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t10 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t9.{core::List::add}(x){(core::int) → void};
+      #t9.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t9;
   for (final dynamic #t12 in let final Never #t13 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
@@ -115,7 +115,7 @@
   [for (int x in o2) x];
                  ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t14.{core::List::add}(x){(core::int) → void};
+      #t14.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t14;
 }
@@ -125,14 +125,14 @@
   block {
     final core::List<core::int> #t17 = <core::int>[];
     for (core::int x in i1)
-      #t17.{core::List::add}(x){(core::int) → void};
+      #t17.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t17;
   for (core::int x in l1)
     x;
   block {
     final core::List<core::int> #t18 = <core::int>[];
     for (core::int x in l1)
-      #t18.{core::List::add}(x){(core::int) → void};
+      #t18.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t18;
   for (final dynamic #t19 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
     core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
@@ -142,7 +142,7 @@
     final core::List<core::int> #t20 = <core::int>[];
     for (final dynamic #t21 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t20.{core::List::add}(x){(core::int) → void};
+      #t20.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t20;
 }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
index 4eda5c5..89a6493 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
@@ -71,7 +71,7 @@
                  ^" in let core::Iterable<core::int>? #t5 = i2 in #t5 == null ?{core::Iterable<dynamic>} #t5 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t5{core::Iterable<dynamic>}).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t3.{core::List::add}(x){(core::int) → void};
+        #t3.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t3;
@@ -96,7 +96,7 @@
                  ^" in let core::List<core::int>? #t10 = l2 in #t10 == null ?{core::Iterable<dynamic>} #t10 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t10{core::Iterable<dynamic>}).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t8.{core::List::add}(x){(core::int) → void};
+        #t8.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t8;
@@ -126,7 +126,7 @@
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t13.{core::List::add}(x){(core::int) → void};
+          #t13.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
@@ -157,7 +157,7 @@
         final dynamic #t20 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t20 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t18.{core::List::add}(x){(core::int) → void};
+          #t18.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
@@ -177,7 +177,7 @@
       core::Iterator<core::int> :sync-for-iterator = i1.{core::Iterable::iterator}{core::Iterator<core::int>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{core::int};
-        #t21.{core::List::add}(x){(core::int) → void};
+        #t21.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t21;
@@ -194,7 +194,7 @@
       core::Iterator<core::int> :sync-for-iterator = l1.{core::Iterable::iterator}{core::Iterator<core::int>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{core::int};
-        #t22.{core::List::add}(x){(core::int) → void};
+        #t22.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t22;
@@ -216,7 +216,7 @@
         final dynamic #t25 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t25 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t24.{core::List::add}(x){(core::int) → void};
+          #t24.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
index a1bd97a..8b35773 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
@@ -63,7 +63,7 @@
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t2.{core::List::add}(x){(core::int) → void};
+      #t2.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t2;
   for (core::int x in let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
@@ -78,7 +78,7 @@
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t5.{core::List::add}(x){(core::int) → void};
+      #t5.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t5;
   for (final dynamic #t7 in let final Never #t8 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Object' is from 'dart:core'.
@@ -96,7 +96,7 @@
   [for (int x in o1) x];
                  ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t10 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t9.{core::List::add}(x){(core::int) → void};
+      #t9.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t9;
   for (final dynamic #t12 in let final Never #t13 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
@@ -115,7 +115,7 @@
   [for (int x in o2) x];
                  ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t14.{core::List::add}(x){(core::int) → void};
+      #t14.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t14;
 }
@@ -125,14 +125,14 @@
   block {
     final core::List<core::int> #t17 = <core::int>[];
     for (core::int x in i1)
-      #t17.{core::List::add}(x){(core::int) → void};
+      #t17.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t17;
   for (core::int x in l1)
     x;
   block {
     final core::List<core::int> #t18 = <core::int>[];
     for (core::int x in l1)
-      #t18.{core::List::add}(x){(core::int) → void};
+      #t18.{core::List::add}{Invariant}(x){(core::int) → void};
   } =>#t18;
   for (final dynamic #t19 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
     core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
@@ -142,7 +142,7 @@
     final core::List<core::int> #t20 = <core::int>[];
     for (final dynamic #t21 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t20.{core::List::add}(x){(core::int) → void};
+      #t20.{core::List::add}{Invariant}(x){(core::int) → void};
     }
   } =>#t20;
 }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
index 9195703..b242ebb 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
@@ -71,7 +71,7 @@
                  ^" in i2).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t2.{core::List::add}(x){(core::int) → void};
+        #t2.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t2;
@@ -96,7 +96,7 @@
                  ^" in l2).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t5.{core::List::add}(x){(core::int) → void};
+        #t5.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t5;
@@ -126,7 +126,7 @@
         final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t9.{core::List::add}(x){(core::int) → void};
+          #t9.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
@@ -157,7 +157,7 @@
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t16 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t14.{core::List::add}(x){(core::int) → void};
+          #t14.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
@@ -177,7 +177,7 @@
       core::Iterator<core::int> :sync-for-iterator = i1.{core::Iterable::iterator}{core::Iterator<core::int>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{core::int};
-        #t17.{core::List::add}(x){(core::int) → void};
+        #t17.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t17;
@@ -194,7 +194,7 @@
       core::Iterator<core::int> :sync-for-iterator = l1.{core::Iterable::iterator}{core::Iterator<core::int>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         core::int x = :sync-for-iterator.{core::Iterator::current}{core::int};
-        #t18.{core::List::add}(x){(core::int) → void};
+        #t18.{core::List::add}{Invariant}(x){(core::int) → void};
       }
     }
   } =>#t18;
@@ -216,7 +216,7 @@
         final dynamic #t21 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t20.{core::List::add}(x){(core::int) → void};
+          #t20.{core::List::add}{Invariant}(x){(core::int) → void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
index 074a1a0..9064030 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -86,7 +86,7 @@
     final core::List<Never> #t2 = <Never>[];
     final core::Iterable<Never>? #t3 = n1;
     if(!(#t3 == null))
-      #t2.{core::List::addAll}(#t3{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t2.{core::List::addAll}{Invariant}(#t3{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t2;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -95,7 +95,7 @@
     final core::List<Never> #t4 = <Never>[];
     final core::Iterable<Never>? #t5 = n2;
     if(!(#t5 == null))
-      #t4.{core::List::addAll}(#t5{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t4.{core::List::addAll}{Invariant}(#t5{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t4;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -104,60 +104,60 @@
     final core::List<Never> #t6 = <Never>[];
     final core::Iterable<Never>? #t7 = n3;
     if(!(#t7 == null))
-      #t6.{core::List::addAll}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t6.{core::List::addAll}{Invariant}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t6;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t8 = col::LinkedHashSet::of<Never>(n1);
-    #t8.{core::Set::add}(n1){(Never) → core::bool};
+    #t8.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t8;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t9 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t10 = n1;
     if(!(#t10 == null))
-      #t9.{core::Set::addAll}(#t10{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t9.{core::Set::add}(n1){(Never) → core::bool};
+      #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t9.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t9;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t11 = col::LinkedHashSet::•<dynamic>();
-    #t11.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+    #t11.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t11.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t11.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t11;
   core::Set<Never> s4 = block {
     final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t13 = n2;
     if(!(#t13 == null))
-      #t12.{core::Set::addAll}(#t13{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t12.{core::Set::add}(n1){(Never) → core::bool};
+      #t12.{core::Set::addAll}{Invariant}(#t13{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t12.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t12;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t14 = col::LinkedHashSet::•<dynamic>();
-    #t14.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t14.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t14.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t14.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t14;
   core::Set<Never> s6 = block {
     final core::Set<Never> #t15 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t16 = n3;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t15.{core::Set::add}(n1){(Never) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t15.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t15;
   core::Map<Never, Never> m1 = block {
     final core::Map<Never, Never> #t17 = <Never, Never>{};
     for (final core::MapEntry<Never, Never> #t18 in n1.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-      #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}{Never}, #t18.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t17.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+      #t17.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{Never}, #t18.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t17.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t17;
   core::Map<Never, Never> m2 = block {
     final core::Map<Never, Never> #t19 = <Never, Never>{};
     final core::Map<Never, Never>? #t20 = n1;
     if(!(#t20 == null))
       for (final core::MapEntry<Never, Never> #t21 in #t20{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}{Never}, #t21.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t19.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+        #t19.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{Never}, #t21.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t19.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t19;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
@@ -167,8 +167,8 @@
     final core::Map<Never, Never>? #t23 = n2;
     if(!(#t23 == null))
       for (final core::MapEntry<Never, Never> #t24 in #t23{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t22.{core::Map::[]=}(#t24.{core::MapEntry::key}{Never}, #t24.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t22.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+        #t22.{core::Map::[]=}{Invariant}(#t24.{core::MapEntry::key}{Never}, #t24.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t22.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t22;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
@@ -178,8 +178,8 @@
     final core::Map<Never, Never>? #t26 = n3;
     if(!(#t26 == null))
       for (final core::MapEntry<Never, Never> #t27 in #t26{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{Never}, #t27.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t25.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{Never}, #t27.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t25.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t25;
 }
 static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
@@ -190,7 +190,7 @@
     final core::List<Never> #t29 = <Never>[];
     final core::Iterable<Never>? #t30 = n1;
     if(!(#t30 == null))
-      #t29.{core::List::addAll}(#t30{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t29.{core::List::addAll}{Invariant}(#t30{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t29;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
@@ -199,7 +199,7 @@
     final core::List<Never> #t31 = <Never>[];
     final core::Iterable<Never>? #t32 = n2;
     if(!(#t32 == null))
-      #t31.{core::List::addAll}(#t32{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t31.{core::List::addAll}{Invariant}(#t32{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t31;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
@@ -208,60 +208,60 @@
     final core::List<Never> #t33 = <Never>[];
     final core::Iterable<Never>? #t34 = n3;
     if(!(#t34 == null))
-      #t33.{core::List::addAll}(#t34{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t33.{core::List::addAll}{Invariant}(#t34{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t33;
   core::Set<self::test2::N1> s1 = block {
     final core::Set<self::test2::N1> #t35 = col::LinkedHashSet::of<self::test2::N1>(n1);
-    #t35.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+    #t35.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t35;
   core::Set<self::test2::N1> s2 = block {
     final core::Set<self::test2::N1> #t36 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t37 = n1;
     if(!(#t37 == null))
-      #t36.{core::Set::addAll}(#t37{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t36.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t36.{core::Set::addAll}{Invariant}(#t37{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t36.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t36;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t38 = col::LinkedHashSet::•<dynamic>();
-    #t38.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    #t38.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t38.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t38.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t38;
   core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t39 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t40 = n2;
     if(!(#t40 == null))
-      #t39.{core::Set::addAll}(#t40{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t39.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t39.{core::Set::addAll}{Invariant}(#t40{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t39.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t39;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t41 = col::LinkedHashSet::•<dynamic>();
-    #t41.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+    #t41.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t41.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t41.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t41;
   core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t42 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t43 = n3;
     if(!(#t43 == null))
-      #t42.{core::Set::addAll}(#t43{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t42.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t42.{core::Set::addAll}{Invariant}(#t43{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t42.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t42;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t44 = <self::test2::N1, self::test2::N1>{};
     for (final core::MapEntry<self::test2::N1, self::test2::N1> #t45 in n1.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-      #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}{self::test2::N1}, #t45.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t44.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+      #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}{self::test2::N1}, #t45.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t44.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t44;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t46 = <self::test2::N1, self::test2::N1>{};
     final core::Map<self::test2::N1, self::test2::N1>? #t47 = n1;
     if(!(#t47 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t48 in #t47{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t46.{core::Map::[]=}(#t48.{core::MapEntry::key}{self::test2::N1}, #t48.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t46.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+        #t46.{core::Map::[]=}{Invariant}(#t48.{core::MapEntry::key}{self::test2::N1}, #t48.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t46.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t46;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
@@ -271,8 +271,8 @@
     final core::Map<self::test2::N1, self::test2::N1>? #t50 = n2;
     if(!(#t50 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t51 in #t50{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t49.{core::Map::[]=}(#t51.{core::MapEntry::key}{self::test2::N1}, #t51.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t49.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+        #t49.{core::Map::[]=}{Invariant}(#t51.{core::MapEntry::key}{self::test2::N1}, #t51.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t49.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t49;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
@@ -282,8 +282,8 @@
     final core::Map<self::test2::N1, self::test2::N1>? #t53 = n3;
     if(!(#t53 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t54 in #t53{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t52.{core::Map::[]=}(#t54.{core::MapEntry::key}{self::test2::N1}, #t54.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t52.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+        #t52.{core::Map::[]=}{Invariant}(#t54.{core::MapEntry::key}{self::test2::N1}, #t54.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t52.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t52;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
index 7b9a1bb..a7b418d 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -86,7 +86,7 @@
     final core::List<Never> #t2 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t3 = n1;
     if(!(#t3 == null))
-      #t2.{core::List::addAll}(#t3{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t2.{core::List::addAll}{Invariant}(#t3{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t2;
   core::List<dynamic> l3 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -95,7 +95,7 @@
     final core::List<Never> #t4 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t5 = n2;
     if(!(#t5 == null))
-      #t4.{core::List::addAll}(#t5{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t4.{core::List::addAll}{Invariant}(#t5{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t4;
   core::List<dynamic> l5 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -104,46 +104,46 @@
     final core::List<Never> #t6 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t7 = n3;
     if(!(#t7 == null))
-      #t6.{core::List::addAll}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t6.{core::List::addAll}{Invariant}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t6;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t8 = col::LinkedHashSet::of<Never>(n1);
-    #t8.{core::Set::add}(n1){(Never) → core::bool};
+    #t8.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t8;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t9 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t10 = n1;
     if(!(#t10 == null))
-      #t9.{core::Set::addAll}(#t10{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t9.{core::Set::add}(n1){(Never) → core::bool};
+      #t9.{core::Set::addAll}{Invariant}(#t10{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t9.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t9;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t11 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t11.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+    #t11.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t11.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t11.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t11;
   core::Set<Never> s4 = block {
     final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t13 = n2;
     if(!(#t13 == null))
-      #t12.{core::Set::addAll}(#t13{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t12.{core::Set::add}(n1){(Never) → core::bool};
+      #t12.{core::Set::addAll}{Invariant}(#t13{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t12.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t12;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t14 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t14.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t14.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t14.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t14.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t14;
   core::Set<Never> s6 = block {
     final core::Set<Never> #t15 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t16 = n3;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t15.{core::Set::add}(n1){(Never) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t15.{core::Set::add}{Invariant}(n1){(Never) → core::bool};
   } =>#t15;
   core::Map<Never, Never> m1 = block {
     final core::Map<Never, Never> #t17 = <Never, Never>{};
@@ -151,10 +151,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = n1.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t18 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}{Never}, #t18.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t17.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{Never}, #t18.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t17.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+    #t17.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t17;
   core::Map<Never, Never> m2 = block {
     final core::Map<Never, Never> #t19 = <Never, Never>{};
@@ -163,10 +163,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t20{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t21 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}{Never}, #t21.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t19.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{Never}, #t21.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t19.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+    #t19.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t19;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
@@ -178,10 +178,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t23{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t24 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t22.{core::Map::[]=}(#t24.{core::MapEntry::key}{Never}, #t24.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t22.{core::Map::[]=}{Invariant}(#t24.{core::MapEntry::key}{Never}, #t24.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t22.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+    #t22.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t22;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
@@ -193,10 +193,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t26{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t27 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{Never}, #t27.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{Never}, #t27.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t25.{core::Map::[]=}(n1, n1){(Never, Never) → void};
+    #t25.{core::Map::[]=}{Invariant}(n1, n1){(Never, Never) → void};
   } =>#t25;
 }
 static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
@@ -207,7 +207,7 @@
     final core::List<Never> #t29 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t30 = n1;
     if(!(#t30 == null))
-      #t29.{core::List::addAll}(#t30{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t29.{core::List::addAll}{Invariant}(#t30{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t29;
   core::List<dynamic> l3 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
@@ -216,7 +216,7 @@
     final core::List<Never> #t31 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t32 = n2;
     if(!(#t32 == null))
-      #t31.{core::List::addAll}(#t32{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t31.{core::List::addAll}{Invariant}(#t32{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t31;
   core::List<dynamic> l5 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
@@ -225,46 +225,46 @@
     final core::List<Never> #t33 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t34 = n3;
     if(!(#t34 == null))
-      #t33.{core::List::addAll}(#t34{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t33.{core::List::addAll}{Invariant}(#t34{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t33;
   core::Set<self::test2::N1> s1 = block {
     final core::Set<self::test2::N1> #t35 = col::LinkedHashSet::of<self::test2::N1>(n1);
-    #t35.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+    #t35.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t35;
   core::Set<self::test2::N1> s2 = block {
     final core::Set<self::test2::N1> #t36 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t37 = n1;
     if(!(#t37 == null))
-      #t36.{core::Set::addAll}(#t37{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t36.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t36.{core::Set::addAll}{Invariant}(#t37{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t36.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t36;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t38 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t38.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    #t38.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t38.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t38.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t38;
   core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t39 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t40 = n2;
     if(!(#t40 == null))
-      #t39.{core::Set::addAll}(#t40{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t39.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t39.{core::Set::addAll}{Invariant}(#t40{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t39.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t39;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t41 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t41.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+    #t41.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t41.{core::Set::add}(n1){(dynamic) → core::bool};
+    #t41.{core::Set::add}{Invariant}(n1){(dynamic) → core::bool};
   } =>#t41;
   core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t42 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t43 = n3;
     if(!(#t43 == null))
-      #t42.{core::Set::addAll}(#t43{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t42.{core::Set::add}(n1){(self::test2::N1) → core::bool};
+      #t42.{core::Set::addAll}{Invariant}(#t43{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t42.{core::Set::add}{Invariant}(n1){(self::test2::N1) → core::bool};
   } =>#t42;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t44 = <self::test2::N1, self::test2::N1>{};
@@ -272,10 +272,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = n1.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t45 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}{self::test2::N1}, #t45.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}{self::test2::N1}, #t45.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t44.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+    #t44.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t44;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t46 = <self::test2::N1, self::test2::N1>{};
@@ -284,10 +284,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t47{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t48 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t46.{core::Map::[]=}(#t48.{core::MapEntry::key}{self::test2::N1}, #t48.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t46.{core::Map::[]=}{Invariant}(#t48.{core::MapEntry::key}{self::test2::N1}, #t48.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t46.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+    #t46.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t46;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
@@ -299,10 +299,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t50{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t51 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t49.{core::Map::[]=}(#t51.{core::MapEntry::key}{self::test2::N1}, #t51.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t49.{core::Map::[]=}{Invariant}(#t51.{core::MapEntry::key}{self::test2::N1}, #t51.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t49.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+    #t49.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t49;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
@@ -314,10 +314,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t53{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t54 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t52.{core::Map::[]=}(#t54.{core::MapEntry::key}{self::test2::N1}, #t54.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t52.{core::Map::[]=}{Invariant}(#t54.{core::MapEntry::key}{self::test2::N1}, #t54.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t52.{core::Map::[]=}(n1, n1){(self::test2::N1, self::test2::N1) → void};
+    #t52.{core::Map::[]=}{Invariant}(n1, n1){(self::test2::N1, self::test2::N1) → void};
   } =>#t52;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
index 1126a7e..7478ccc 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -87,7 +87,7 @@
     final core::List<Never> #t3 = <Never>[];
     final core::Iterable<Never>? #t4 = let final Never #t5 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t3;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -96,7 +96,7 @@
     final core::List<Never> #t6 = <Never>[];
     final core::Iterable<Never>? #t7 = n2;
     if(!(#t7 == null))
-      #t6.{core::List::addAll}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t6.{core::List::addAll}{Invariant}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t6;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -105,60 +105,60 @@
     final core::List<Never> #t8 = <Never>[];
     final core::Iterable<Never>? #t9 = n3;
     if(!(#t9 == null))
-      #t8.{core::List::addAll}(#t9{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t8.{core::List::addAll}{Invariant}(#t9{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t8;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t10 = col::LinkedHashSet::of<Never>(let final Never #t11 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-    #t10.{core::Set::add}(let final Never #t12 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+    #t10.{core::Set::add}{Invariant}(let final Never #t12 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t10;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t13 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t14 = let final Never #t15 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t13.{core::Set::add}(let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t13.{core::Set::add}{Invariant}(let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t13;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>();
-    #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+    #t17.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t17.{core::Set::add}(let final Never #t18 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t17.{core::Set::add}{Invariant}(let final Never #t18 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t17;
   core::Set<Never> s4 = block {
     final core::Set<Never> #t19 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t20 = n2;
     if(!(#t20 == null))
-      #t19.{core::Set::addAll}(#t20{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t19.{core::Set::add}(let final Never #t21 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t19.{core::Set::addAll}{Invariant}(#t20{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t19.{core::Set::add}{Invariant}(let final Never #t21 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t19;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
-    #t22.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t22.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t22.{core::Set::add}(let final Never #t23 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t22.{core::Set::add}{Invariant}(let final Never #t23 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t22;
   core::Set<Never> s6 = block {
     final core::Set<Never> #t24 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t25 = n3;
     if(!(#t25 == null))
-      #t24.{core::Set::addAll}(#t25{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t24.{core::Set::add}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t24.{core::Set::addAll}{Invariant}(#t25{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t24.{core::Set::add}{Invariant}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t24;
   core::Map<Never, Never> m1 = block {
     final core::Map<Never, Never> #t27 = <Never, Never>{};
     for (final core::MapEntry<Never, Never> #t28 in (let final Never #t29 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-      #t27.{core::Map::[]=}(#t28.{core::MapEntry::key}{Never}, #t28.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t27.{core::Map::[]=}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t31 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+      #t27.{core::Map::[]=}{Invariant}(#t28.{core::MapEntry::key}{Never}, #t28.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t27.{core::Map::[]=}{Invariant}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t31 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t27;
   core::Map<Never, Never> m2 = block {
     final core::Map<Never, Never> #t32 = <Never, Never>{};
     final core::Map<Never, Never>? #t33 = let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t33 == null))
       for (final core::MapEntry<Never, Never> #t35 in #t33{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t32.{core::Map::[]=}(#t35.{core::MapEntry::key}{Never}, #t35.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t32.{core::Map::[]=}(let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+        #t32.{core::Map::[]=}{Invariant}(#t35.{core::MapEntry::key}{Never}, #t35.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t32.{core::Map::[]=}{Invariant}(let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t32;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
@@ -168,8 +168,8 @@
     final core::Map<Never, Never>? #t41 = n2;
     if(!(#t41 == null))
       for (final core::MapEntry<Never, Never> #t42 in #t41{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t40.{core::Map::[]=}(#t42.{core::MapEntry::key}{Never}, #t42.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t40.{core::Map::[]=}(let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+        #t40.{core::Map::[]=}{Invariant}(#t42.{core::MapEntry::key}{Never}, #t42.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t40.{core::Map::[]=}{Invariant}(let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t40;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
@@ -179,8 +179,8 @@
     final core::Map<Never, Never>? #t48 = n3;
     if(!(#t48 == null))
       for (final core::MapEntry<Never, Never> #t49 in #t48{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}{Never}, #t49.{core::MapEntry::value}{Never}){(Never, Never) → void};
-    #t47.{core::Map::[]=}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}{Never}, #t49.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t47.{core::Map::[]=}{Invariant}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t47;
 }
 static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
@@ -191,7 +191,7 @@
     final core::List<Never> #t54 = <Never>[];
     final core::Iterable<Never>? #t55 = let final self::test2::N1 #t56 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t55 == null))
-      #t54.{core::List::addAll}(#t55{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t54.{core::List::addAll}{Invariant}(#t55{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t54;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
@@ -200,7 +200,7 @@
     final core::List<Never> #t57 = <Never>[];
     final core::Iterable<Never>? #t58 = n2;
     if(!(#t58 == null))
-      #t57.{core::List::addAll}(#t58{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t57.{core::List::addAll}{Invariant}(#t58{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t57;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
@@ -209,60 +209,60 @@
     final core::List<Never> #t59 = <Never>[];
     final core::Iterable<Never>? #t60 = n3;
     if(!(#t60 == null))
-      #t59.{core::List::addAll}(#t60{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t59.{core::List::addAll}{Invariant}(#t60{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t59;
   core::Set<self::test2::N1> s1 = block {
     final core::Set<self::test2::N1> #t61 = col::LinkedHashSet::of<self::test2::N1>(let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-    #t61.{core::Set::add}(let final self::test2::N1 #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+    #t61.{core::Set::add}{Invariant}(let final self::test2::N1 #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t61;
   core::Set<self::test2::N1> s2 = block {
     final core::Set<self::test2::N1> #t64 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t65 = let final self::test2::N1 #t66 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t65 == null))
-      #t64.{core::Set::addAll}(#t65{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t64.{core::Set::add}(let final self::test2::N1 #t67 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t64.{core::Set::addAll}{Invariant}(#t65{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t64.{core::Set::add}{Invariant}(let final self::test2::N1 #t67 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t64;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    #t68.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t68.{core::Set::add}(let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t68.{core::Set::add}{Invariant}(let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t68;
   core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t70 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t71 = n2;
     if(!(#t71 == null))
-      #t70.{core::Set::addAll}(#t71{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t70.{core::Set::add}(let final self::test2::N1 #t72 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t70.{core::Set::addAll}{Invariant}(#t71{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t70.{core::Set::add}{Invariant}(let final self::test2::N1 #t72 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t70;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t73 = col::LinkedHashSet::•<dynamic>();
-    #t73.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+    #t73.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t73.{core::Set::add}(let final self::test2::N1 #t74 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t73.{core::Set::add}{Invariant}(let final self::test2::N1 #t74 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t73;
   core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t75 = col::LinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t76 = n3;
     if(!(#t76 == null))
-      #t75.{core::Set::addAll}(#t76{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t75.{core::Set::add}(let final self::test2::N1 #t77 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t75.{core::Set::addAll}{Invariant}(#t76{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t75.{core::Set::add}{Invariant}(let final self::test2::N1 #t77 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t75;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t78 = <self::test2::N1, self::test2::N1>{};
     for (final core::MapEntry<self::test2::N1, self::test2::N1> #t79 in (let final self::test2::N1 #t80 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-      #t78.{core::Map::[]=}(#t79.{core::MapEntry::key}{self::test2::N1}, #t79.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t78.{core::Map::[]=}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t82 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+      #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}{self::test2::N1}, #t79.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t78.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t82 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t78;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t83 = <self::test2::N1, self::test2::N1>{};
     final core::Map<self::test2::N1, self::test2::N1>? #t84 = let final self::test2::N1 #t85 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t84 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t86 in #t84{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t83.{core::Map::[]=}(#t86.{core::MapEntry::key}{self::test2::N1}, #t86.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t83.{core::Map::[]=}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t88 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+        #t83.{core::Map::[]=}{Invariant}(#t86.{core::MapEntry::key}{self::test2::N1}, #t86.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t83.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t88 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t83;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
@@ -272,8 +272,8 @@
     final core::Map<self::test2::N1, self::test2::N1>? #t92 = n2;
     if(!(#t92 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t93 in #t92{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t91.{core::Map::[]=}(#t93.{core::MapEntry::key}{self::test2::N1}, #t93.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t91.{core::Map::[]=}(let final self::test2::N1 #t94 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+        #t91.{core::Map::[]=}{Invariant}(#t93.{core::MapEntry::key}{self::test2::N1}, #t93.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t91.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t94 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t91;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
@@ -283,8 +283,8 @@
     final core::Map<self::test2::N1, self::test2::N1>? #t99 = n3;
     if(!(#t99 == null))
       for (final core::MapEntry<self::test2::N1, self::test2::N1> #t100 in #t99{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
-        #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{self::test2::N1}, #t100.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
-    #t98.{core::Map::[]=}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t102 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+        #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{self::test2::N1}, #t100.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t98.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t102 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t98;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
index 6652f27..20109c7 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -87,7 +87,7 @@
     final core::List<Never> #t3 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t4 = let final Never #t5 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t3;
   core::List<dynamic> l3 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -96,7 +96,7 @@
     final core::List<Never> #t6 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t7 = n2;
     if(!(#t7 == null))
-      #t6.{core::List::addAll}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t6.{core::List::addAll}{Invariant}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t6;
   core::List<dynamic> l5 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -105,46 +105,46 @@
     final core::List<Never> #t8 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t9 = n3;
     if(!(#t9 == null))
-      #t8.{core::List::addAll}(#t9{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t8.{core::List::addAll}{Invariant}(#t9{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t8;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t10 = col::LinkedHashSet::of<Never>(let final Never #t11 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-    #t10.{core::Set::add}(let final Never #t12 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+    #t10.{core::Set::add}{Invariant}(let final Never #t12 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t10;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t13 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t14 = let final Never #t15 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t13.{core::Set::add}(let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t13.{core::Set::add}{Invariant}(let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t13;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+    #t17.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t17.{core::Set::add}(let final Never #t18 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t17.{core::Set::add}{Invariant}(let final Never #t18 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t17;
   core::Set<Never> s4 = block {
     final core::Set<Never> #t19 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t20 = n2;
     if(!(#t20 == null))
-      #t19.{core::Set::addAll}(#t20{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t19.{core::Set::add}(let final Never #t21 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t19.{core::Set::addAll}{Invariant}(#t20{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t19.{core::Set::add}{Invariant}(let final Never #t21 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t19;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t22 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t22.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t22.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t22.{core::Set::add}(let final Never #t23 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t22.{core::Set::add}{Invariant}(let final Never #t23 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t22;
   core::Set<Never> s6 = block {
     final core::Set<Never> #t24 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t25 = n3;
     if(!(#t25 == null))
-      #t24.{core::Set::addAll}(#t25{core::Iterable<Never>}){(core::Iterable<Never>) → void};
-    #t24.{core::Set::add}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+      #t24.{core::Set::addAll}{Invariant}(#t25{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t24.{core::Set::add}{Invariant}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
   } =>#t24;
   core::Map<Never, Never> m1 = block {
     final core::Map<Never, Never> #t27 = <Never, Never>{};
@@ -152,10 +152,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = (let final Never #t28 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t29 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t27.{core::Map::[]=}(#t29.{core::MapEntry::key}{Never}, #t29.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t27.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}{Never}, #t29.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t27.{core::Map::[]=}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t31 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+    #t27.{core::Map::[]=}{Invariant}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t31 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t27;
   core::Map<Never, Never> m2 = block {
     final core::Map<Never, Never> #t32 = <Never, Never>{};
@@ -164,10 +164,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t33{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t35 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t32.{core::Map::[]=}(#t35.{core::MapEntry::key}{Never}, #t35.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t32.{core::Map::[]=}{Invariant}(#t35.{core::MapEntry::key}{Never}, #t35.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t32.{core::Map::[]=}(let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+    #t32.{core::Map::[]=}{Invariant}(let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t32;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
@@ -179,10 +179,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t41{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t42 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t40.{core::Map::[]=}(#t42.{core::MapEntry::key}{Never}, #t42.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t40.{core::Map::[]=}{Invariant}(#t42.{core::MapEntry::key}{Never}, #t42.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t40.{core::Map::[]=}(let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+    #t40.{core::Map::[]=}{Invariant}(let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t40;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
@@ -194,10 +194,10 @@
       core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t48{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<Never, Never>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<Never, Never> #t49 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<Never, Never>};
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}{Never}, #t49.{core::MapEntry::value}{Never}){(Never, Never) → void};
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}{Never}, #t49.{core::MapEntry::value}{Never}){(Never, Never) → void};
       }
     }
-    #t47.{core::Map::[]=}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+    #t47.{core::Map::[]=}{Invariant}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
   } =>#t47;
 }
 static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
@@ -208,7 +208,7 @@
     final core::List<Never> #t54 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t55 = let final self::test2::N1 #t56 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t55 == null))
-      #t54.{core::List::addAll}(#t55{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t54.{core::List::addAll}{Invariant}(#t55{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t54;
   core::List<dynamic> l3 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
@@ -217,7 +217,7 @@
     final core::List<Never> #t57 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t58 = n2;
     if(!(#t58 == null))
-      #t57.{core::List::addAll}(#t58{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t57.{core::List::addAll}{Invariant}(#t58{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t57;
   core::List<dynamic> l5 = core::_GrowableList::_literal1<dynamic>(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
@@ -226,46 +226,46 @@
     final core::List<Never> #t59 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t60 = n3;
     if(!(#t60 == null))
-      #t59.{core::List::addAll}(#t60{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t59.{core::List::addAll}{Invariant}(#t60{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t59;
   core::Set<self::test2::N1> s1 = block {
     final core::Set<self::test2::N1> #t61 = col::LinkedHashSet::of<self::test2::N1>(let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-    #t61.{core::Set::add}(let final self::test2::N1 #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+    #t61.{core::Set::add}{Invariant}(let final self::test2::N1 #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t61;
   core::Set<self::test2::N1> s2 = block {
     final core::Set<self::test2::N1> #t64 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t65 = let final self::test2::N1 #t66 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!(#t65 == null))
-      #t64.{core::Set::addAll}(#t65{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t64.{core::Set::add}(let final self::test2::N1 #t67 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t64.{core::Set::addAll}{Invariant}(#t65{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t64.{core::Set::add}{Invariant}(let final self::test2::N1 #t67 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t64;
   core::Set<dynamic> s3 = block {
     final core::Set<dynamic> #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    #t68.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^"){(dynamic) → core::bool};
-    #t68.{core::Set::add}(let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t68.{core::Set::add}{Invariant}(let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t68;
   core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t70 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t71 = n2;
     if(!(#t71 == null))
-      #t70.{core::Set::addAll}(#t71{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t70.{core::Set::add}(let final self::test2::N1 #t72 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t70.{core::Set::addAll}{Invariant}(#t71{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t70.{core::Set::add}{Invariant}(let final self::test2::N1 #t72 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t70;
   core::Set<dynamic> s5 = block {
     final core::Set<dynamic> #t73 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t73.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+    #t73.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^"){(dynamic) → core::bool};
-    #t73.{core::Set::add}(let final self::test2::N1 #t74 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+    #t73.{core::Set::add}{Invariant}(let final self::test2::N1 #t74 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
   } =>#t73;
   core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t75 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t76 = n3;
     if(!(#t76 == null))
-      #t75.{core::Set::addAll}(#t76{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
-    #t75.{core::Set::add}(let final self::test2::N1 #t77 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+      #t75.{core::Set::addAll}{Invariant}(#t76{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t75.{core::Set::add}{Invariant}(let final self::test2::N1 #t77 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
   } =>#t75;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t78 = <self::test2::N1, self::test2::N1>{};
@@ -273,10 +273,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = (let final self::test2::N1 #t79 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t80 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t78.{core::Map::[]=}(#t80.{core::MapEntry::key}{self::test2::N1}, #t80.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t78.{core::Map::[]=}{Invariant}(#t80.{core::MapEntry::key}{self::test2::N1}, #t80.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t78.{core::Map::[]=}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t82 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+    #t78.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t82 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t78;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t83 = <self::test2::N1, self::test2::N1>{};
@@ -285,10 +285,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t84{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t86 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t83.{core::Map::[]=}(#t86.{core::MapEntry::key}{self::test2::N1}, #t86.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t83.{core::Map::[]=}{Invariant}(#t86.{core::MapEntry::key}{self::test2::N1}, #t86.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t83.{core::Map::[]=}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t88 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+    #t83.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t88 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t83;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
@@ -300,10 +300,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t92{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t93 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t91.{core::Map::[]=}(#t93.{core::MapEntry::key}{self::test2::N1}, #t93.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t91.{core::Map::[]=}{Invariant}(#t93.{core::MapEntry::key}{self::test2::N1}, #t93.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t91.{core::Map::[]=}(let final self::test2::N1 #t94 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+    #t91.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t94 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t91;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
@@ -315,10 +315,10 @@
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t99{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<self::test2::N1, self::test2::N1> #t100 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<self::test2::N1, self::test2::N1>};
-        #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{self::test2::N1}, #t100.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+        #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{self::test2::N1}, #t100.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
       }
     }
-    #t98.{core::Map::[]=}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t102 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+    #t98.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t102 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
   } =>#t98;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
index 2c388f4..097a586 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
@@ -58,85 +58,85 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
     for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
     for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0){(dynamic) → core::bool};
+  #t4.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t5 = <dynamic>[];
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t5.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t5;
 static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
       for (final core::MapEntry<dynamic, dynamic> #t7 in z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-        #t6.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
       for (final core::MapEntry<dynamic, dynamic> #t8 in y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-        #t6.{core::Map::[]=}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
   } =>#t6;
 }
 static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
-    #t9.{core::Set::add}(0){(dynamic) → core::bool};
+    #t9.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t9.{core::Set::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t9;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t10 = <dynamic>[];
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t10.{core::List::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
index bc28998..ed94348 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
@@ -58,70 +58,70 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     }
   }
   if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     }
   }
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0){(dynamic) → core::bool};
+  #t4.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t5 = core::_GrowableList::•<dynamic>(0);
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t5.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t5;
 static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
       core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic> #t7 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t6.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
       }
     }
     if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
       core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic> #t8 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t6.{core::Map::[]=}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
       }
     }
   } =>#t6;
@@ -129,30 +129,30 @@
 static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t9.{core::Set::add}(0){(dynamic) → core::bool};
+    #t9.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t9.{core::Set::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t9;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t10 = core::_GrowableList::•<dynamic>(0);
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t10.{core::List::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
index 2c388f4..097a586 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
@@ -58,85 +58,85 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
     for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
     for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0){(dynamic) → core::bool};
+  #t4.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t5 = <dynamic>[];
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t5.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t5;
 static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
       for (final core::MapEntry<dynamic, dynamic> #t7 in z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-        #t6.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
       for (final core::MapEntry<dynamic, dynamic> #t8 in y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-        #t6.{core::Map::[]=}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
   } =>#t6;
 }
 static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
-    #t9.{core::Set::add}(0){(dynamic) → core::bool};
+    #t9.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t9.{core::Set::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t9;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t10 = <dynamic>[];
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t10.{core::List::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
index bc28998..ed94348 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
@@ -58,70 +58,70 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null){(dynamic, dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     }
   }
   if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
     }
   }
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0){(dynamic) → core::bool};
+  #t4.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → core::bool};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t4.{core::Set::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t4.{core::Set::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t5 = core::_GrowableList::•<dynamic>(0);
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t5.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^"){(dynamic) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
   if(self::i.{core::num::>}(0){(core::num) → core::bool})
-    #t5.{core::List::addAll}(self::nullableList!){(core::Iterable<dynamic>) → void};
+    #t5.{core::List::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
 } =>#t5;
 static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t6.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null){(dynamic, dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
       core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic> #t7 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t6.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
       }
     }
     if(self::i.{core::num::>}(0){(core::num) → core::bool}) {
       core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, dynamic> #t8 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-        #t6.{core::Map::[]=}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+        #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
       }
     }
   } =>#t6;
@@ -129,30 +129,30 @@
 static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t9.{core::Set::add}(0){(dynamic) → core::bool};
+    #t9.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → core::bool};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t9.{core::Set::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t9.{core::Set::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t9;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t10 = core::_GrowableList::•<dynamic>(0);
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^"){(dynamic) → void};
     if(self::i.{core::num::>}(0){(core::num) → core::bool})
-      #t10.{core::List::addAll}(z){(core::Iterable<dynamic>) → void};
+      #t10.{core::List::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
   } =>#t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
index bdb5c97..e41afed 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
@@ -10,23 +10,23 @@
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
     core::Set<core::Object?> v = block {
       final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
-      #t1.{core::Set::add}(x){(core::Object?) → core::bool};
-      #t1.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t1;
     core::Set<core::Object?> w = block {
       final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
-      #t2.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t2.{core::Set::add}(x){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
     } =>#t2;
     core::Set<core::Object?> p = block {
       final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
-      #t3.{core::Set::add}(y){(core::Object?) → core::bool};
-      #t3.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t3;
     core::Set<core::Object?> q = block {
       final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
-      #t4.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t4.{core::Set::add}(y){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
     } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
@@ -39,13 +39,13 @@
     if(x is{ForNonNullableByDefault} core::Object?) {
       core::Set<core::Object?> v = block {
         final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
-        #t5.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
-        #t5.{core::Set::add}(42){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
       } =>#t5;
       core::Set<core::Object?> w = block {
         final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
-        #t6.{core::Set::add}(42){(core::Object?) → core::bool};
-        #t6.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
       } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
index 75bcc24..ba81fbc 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
@@ -10,23 +10,23 @@
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
     core::Set<core::Object?> v = block {
       final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t1.{core::Set::add}(x){(core::Object?) → core::bool};
-      #t1.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t1;
     core::Set<core::Object?> w = block {
       final core::Set<core::Object?> #t2 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t2.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t2.{core::Set::add}(x){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
     } =>#t2;
     core::Set<core::Object?> p = block {
       final core::Set<core::Object?> #t3 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t3.{core::Set::add}(y){(core::Object?) → core::bool};
-      #t3.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t3;
     core::Set<core::Object?> q = block {
       final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t4.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t4.{core::Set::add}(y){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
     } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
@@ -39,13 +39,13 @@
     if(x is{ForNonNullableByDefault} core::Object?) {
       core::Set<core::Object?> v = block {
         final core::Set<core::Object?> #t5 = new col::_CompactLinkedHashSet::•<core::Object?>();
-        #t5.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
-        #t5.{core::Set::add}(42){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
       } =>#t5;
       core::Set<core::Object?> w = block {
         final core::Set<core::Object?> #t6 = new col::_CompactLinkedHashSet::•<core::Object?>();
-        #t6.{core::Set::add}(42){(core::Object?) → core::bool};
-        #t6.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
       } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
index bdb5c97..e41afed 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
@@ -10,23 +10,23 @@
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
     core::Set<core::Object?> v = block {
       final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
-      #t1.{core::Set::add}(x){(core::Object?) → core::bool};
-      #t1.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t1;
     core::Set<core::Object?> w = block {
       final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
-      #t2.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t2.{core::Set::add}(x){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
     } =>#t2;
     core::Set<core::Object?> p = block {
       final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
-      #t3.{core::Set::add}(y){(core::Object?) → core::bool};
-      #t3.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t3;
     core::Set<core::Object?> q = block {
       final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
-      #t4.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t4.{core::Set::add}(y){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
     } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
@@ -39,13 +39,13 @@
     if(x is{ForNonNullableByDefault} core::Object?) {
       core::Set<core::Object?> v = block {
         final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
-        #t5.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
-        #t5.{core::Set::add}(42){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
       } =>#t5;
       core::Set<core::Object?> w = block {
         final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
-        #t6.{core::Set::add}(42){(core::Object?) → core::bool};
-        #t6.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
       } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
index 75bcc24..ba81fbc 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
@@ -10,23 +10,23 @@
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
     core::Set<core::Object?> v = block {
       final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t1.{core::Set::add}(x){(core::Object?) → core::bool};
-      #t1.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t1;
     core::Set<core::Object?> w = block {
       final core::Set<core::Object?> #t2 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t2.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t2.{core::Set::add}(x){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
     } =>#t2;
     core::Set<core::Object?> p = block {
       final core::Set<core::Object?> #t3 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t3.{core::Set::add}(y){(core::Object?) → core::bool};
-      #t3.{core::Set::add}(42){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
     } =>#t3;
     core::Set<core::Object?> q = block {
       final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>();
-      #t4.{core::Set::add}(42){(core::Object?) → core::bool};
-      #t4.{core::Set::add}(y){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
     } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
@@ -39,13 +39,13 @@
     if(x is{ForNonNullableByDefault} core::Object?) {
       core::Set<core::Object?> v = block {
         final core::Set<core::Object?> #t5 = new col::_CompactLinkedHashSet::•<core::Object?>();
-        #t5.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
-        #t5.{core::Set::add}(42){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
       } =>#t5;
       core::Set<core::Object?> w = block {
         final core::Set<core::Object?> #t6 = new col::_CompactLinkedHashSet::•<core::Object?>();
-        #t6.{core::Set::add}(42){(core::Object?) → core::bool};
-        #t6.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
       } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
index a6b4f4e..e415041 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3){(core::int) → core::bool};
+      #t1.{core::Set::add}{Invariant}(#t3){(core::int) → core::bool};
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6){(core::int) → core::bool};
+      #t4.{core::Set::add}{Invariant}(#t6){(core::int) → core::bool};
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
@@ -191,7 +191,7 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9){(core::int) → core::bool};
+      #t7.{core::Set::add}{Invariant}(#t9){(core::int) → core::bool};
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
@@ -200,7 +200,7 @@
     <int, int>{...a}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>();
-    #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
              ^"){(core::int) → core::bool};
@@ -211,7 +211,7 @@
     {if (condition) ...a}, // Error.
                        ^") {
         final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
-        #t11.{core::Set::add}(#t13){(core::int) → core::bool};
+        #t11.{core::Set::add}{Invariant}(#t13){(core::int) → core::bool};
       }
   } =>#t11, block {
     final core::Set<core::int> #t14 = col::LinkedHashSet::•<core::int>();
@@ -220,7 +220,7 @@
     {if (condition) ...b}, // Error.
                        ^") {
         final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
-        #t14.{core::Set::add}(#t16){(core::int) → core::bool};
+        #t14.{core::Set::add}{Invariant}(#t16){(core::int) → core::bool};
       }
   } =>#t14, block {
     final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
@@ -229,12 +229,12 @@
     {if (condition) ...c}, // Error.
                        ^") {
         final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
-        #t17.{core::Set::add}(#t19){(core::int) → core::bool};
+        #t17.{core::Set::add}{Invariant}(#t19){(core::int) → core::bool};
       }
   } =>#t17, block {
     final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t20.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t20, block {
@@ -244,7 +244,7 @@
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
         final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
-        #t21.{core::Set::add}(#t23){(core::int) → core::bool};
+        #t21.{core::Set::add}{Invariant}(#t23){(core::int) → core::bool};
       }
   } =>#t21, block {
     final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
@@ -253,7 +253,7 @@
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
         final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
-        #t24.{core::Set::add}(#t26){(core::int) → core::bool};
+        #t24.{core::Set::add}{Invariant}(#t26){(core::int) → core::bool};
       }
   } =>#t24, block {
     final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
@@ -262,12 +262,12 @@
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
         final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
-        #t27.{core::Set::add}(#t29){(core::int) → core::bool};
+        #t27.{core::Set::add}{Invariant}(#t29){(core::int) → core::bool};
       }
   } =>#t27, block {
     final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t30.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null){(core::int, core::int) → void};
   } =>#t30, block {
@@ -277,7 +277,7 @@
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
         final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
-        #t31.{core::Set::add}(#t33){(core::int) → core::bool};
+        #t31.{core::Set::add}{Invariant}(#t33){(core::int) → core::bool};
       }
   } =>#t31, block {
     final core::Set<core::int> #t34 = col::LinkedHashSet::•<core::int>();
@@ -286,7 +286,7 @@
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
         final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
-        #t34.{core::Set::add}(#t36){(core::int) → core::bool};
+        #t34.{core::Set::add}{Invariant}(#t36){(core::int) → core::bool};
       }
   } =>#t34, block {
     final core::Set<core::int> #t37 = col::LinkedHashSet::•<core::int>();
@@ -295,12 +295,12 @@
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
         final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
-        #t37.{core::Set::add}(#t39){(core::int) → core::bool};
+        #t37.{core::Set::add}{Invariant}(#t39){(core::int) → core::bool};
       }
   } =>#t37, block {
     final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t40.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t40, block {
@@ -309,7 +309,7 @@
     if(!(#t42 == null))
       for (final dynamic #t43 in #t42{core::Iterable<dynamic>}) {
         final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
-        #t41.{core::Set::add}(#t44){(core::int) → core::bool};
+        #t41.{core::Set::add}{Invariant}(#t44){(core::int) → core::bool};
       }
   } =>#t41, block {
     final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
@@ -317,7 +317,7 @@
     if(!(#t46 == null))
       for (final dynamic #t47 in #t46{core::Iterable<dynamic>}) {
         final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
-        #t45.{core::Set::add}(#t48){(core::int) → core::bool};
+        #t45.{core::Set::add}{Invariant}(#t48){(core::int) → core::bool};
       }
   } =>#t45, block {
     final core::Set<core::int> #t49 = col::LinkedHashSet::•<core::int>();
@@ -325,14 +325,14 @@
     if(!(#t50 == null))
       for (final dynamic #t51 in #t50{core::Iterable<dynamic>}) {
         final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
-        #t49.{core::Set::add}(#t52){(core::int) → core::bool};
+        #t49.{core::Set::add}{Invariant}(#t52){(core::int) → core::bool};
       }
   } =>#t49, block {
     final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t54 = d;
     if(!(#t54 == null))
       for (final core::MapEntry<core::int, core::int> #t55 in #t54{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t53.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t53, block {
     final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
     if(condition) {
@@ -340,7 +340,7 @@
       if(!(#t57 == null))
         for (final dynamic #t58 in #t57{core::Iterable<dynamic>}) {
           final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
-          #t56.{core::Set::add}(#t59){(core::int) → core::bool};
+          #t56.{core::Set::add}{Invariant}(#t59){(core::int) → core::bool};
         }
     }
   } =>#t56, block {
@@ -350,7 +350,7 @@
       if(!(#t61 == null))
         for (final dynamic #t62 in #t61{core::Iterable<dynamic>}) {
           final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
-          #t60.{core::Set::add}(#t63){(core::int) → core::bool};
+          #t60.{core::Set::add}{Invariant}(#t63){(core::int) → core::bool};
         }
     }
   } =>#t60, block {
@@ -360,7 +360,7 @@
       if(!(#t65 == null))
         for (final dynamic #t66 in #t65{core::Iterable<dynamic>}) {
           final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
-          #t64.{core::Set::add}(#t67){(core::int) → core::bool};
+          #t64.{core::Set::add}{Invariant}(#t67){(core::int) → core::bool};
         }
     }
   } =>#t64, block {
@@ -369,7 +369,7 @@
       final core::Map<core::int, core::int>? #t69 = d;
       if(!(#t69 == null))
         for (final core::MapEntry<core::int, core::int> #t70 in #t69{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t68.{core::Map::[]=}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t68, block {
     final core::Set<core::int> #t71 = col::LinkedHashSet::•<core::int>();
@@ -378,7 +378,7 @@
       if(!(#t72 == null))
         for (final dynamic #t73 in #t72{core::Iterable<dynamic>}) {
           final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
-          #t71.{core::Set::add}(#t74){(core::int) → core::bool};
+          #t71.{core::Set::add}{Invariant}(#t74){(core::int) → core::bool};
         }
     }
   } =>#t71, block {
@@ -388,7 +388,7 @@
       if(!(#t76 == null))
         for (final dynamic #t77 in #t76{core::Iterable<dynamic>}) {
           final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
-          #t75.{core::Set::add}(#t78){(core::int) → core::bool};
+          #t75.{core::Set::add}{Invariant}(#t78){(core::int) → core::bool};
         }
     }
   } =>#t75, block {
@@ -398,7 +398,7 @@
       if(!(#t80 == null))
         for (final dynamic #t81 in #t80{core::Iterable<dynamic>}) {
           final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
-          #t79.{core::Set::add}(#t82){(core::int) → core::bool};
+          #t79.{core::Set::add}{Invariant}(#t82){(core::int) → core::bool};
         }
     }
   } =>#t79, block {
@@ -407,7 +407,7 @@
       final core::Map<core::int, core::int>? #t84 = d;
       if(!(#t84 == null))
         for (final core::MapEntry<core::int, core::int> #t85 in #t84{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t83, block {
     final core::Set<core::int> #t86 = col::LinkedHashSet::•<core::int>();
@@ -416,7 +416,7 @@
       if(!(#t87 == null))
         for (final dynamic #t88 in #t87{core::Iterable<dynamic>}) {
           final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
-          #t86.{core::Set::add}(#t89){(core::int) → core::bool};
+          #t86.{core::Set::add}{Invariant}(#t89){(core::int) → core::bool};
         }
     }
   } =>#t86, block {
@@ -426,7 +426,7 @@
       if(!(#t91 == null))
         for (final dynamic #t92 in #t91{core::Iterable<dynamic>}) {
           final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
-          #t90.{core::Set::add}(#t93){(core::int) → core::bool};
+          #t90.{core::Set::add}{Invariant}(#t93){(core::int) → core::bool};
         }
     }
   } =>#t90, block {
@@ -436,7 +436,7 @@
       if(!(#t95 == null))
         for (final dynamic #t96 in #t95{core::Iterable<dynamic>}) {
           final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
-          #t94.{core::Set::add}(#t97){(core::int) → core::bool};
+          #t94.{core::Set::add}{Invariant}(#t97){(core::int) → core::bool};
         }
     }
   } =>#t94, block {
@@ -445,7 +445,7 @@
       final core::Map<core::int, core::int>? #t99 = d;
       if(!(#t99 == null))
         for (final core::MapEntry<core::int, core::int> #t100 in #t99{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t98];
 }
@@ -456,7 +456,7 @@
     {...x}, // Error.
         ^") {
       final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
-      #t101.{core::Set::add}(#t103){(core::int) → core::bool};
+      #t101.{core::Set::add}{Invariant}(#t103){(core::int) → core::bool};
     }
   } =>#t101, block {
     final core::Set<core::int> #t104 = col::LinkedHashSet::•<core::int>();
@@ -464,7 +464,7 @@
     {...y}, // Error.
         ^") {
       final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
-      #t104.{core::Set::add}(#t106){(core::int) → core::bool};
+      #t104.{core::Set::add}{Invariant}(#t106){(core::int) → core::bool};
     }
   } =>#t104, block {
     final core::Set<core::int> #t107 = col::LinkedHashSet::•<core::int>();
@@ -472,7 +472,7 @@
     {...z}, // Error.
         ^") {
       final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
-      #t107.{core::Set::add}(#t109){(core::int) → core::bool};
+      #t107.{core::Set::add}{Invariant}(#t109){(core::int) → core::bool};
     }
   } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
@@ -480,7 +480,7 @@
     <int, int>{...x}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t110 = col::LinkedHashSet::•<core::int>();
-    #t110.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
              ^"){(core::int) → core::bool};
   } =>#t110, block {
@@ -490,7 +490,7 @@
     {if (condition) ...x}, // Error.
                        ^") {
         final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
-        #t111.{core::Set::add}(#t113){(core::int) → core::bool};
+        #t111.{core::Set::add}{Invariant}(#t113){(core::int) → core::bool};
       }
   } =>#t111, block {
     final core::Set<core::int> #t114 = col::LinkedHashSet::•<core::int>();
@@ -499,7 +499,7 @@
     {if (condition) ...y}, // Error.
                        ^") {
         final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
-        #t114.{core::Set::add}(#t116){(core::int) → core::bool};
+        #t114.{core::Set::add}{Invariant}(#t116){(core::int) → core::bool};
       }
   } =>#t114, block {
     final core::Set<core::int> #t117 = col::LinkedHashSet::•<core::int>();
@@ -508,12 +508,12 @@
     {if (condition) ...z}, // Error.
                        ^") {
         final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
-        #t117.{core::Set::add}(#t119){(core::int) → core::bool};
+        #t117.{core::Set::add}{Invariant}(#t119){(core::int) → core::bool};
       }
   } =>#t117, block {
     final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t120.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t120, block {
@@ -523,7 +523,7 @@
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
         final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
-        #t121.{core::Set::add}(#t123){(core::int) → core::bool};
+        #t121.{core::Set::add}{Invariant}(#t123){(core::int) → core::bool};
       }
   } =>#t121, block {
     final core::Set<core::int> #t124 = col::LinkedHashSet::•<core::int>();
@@ -532,7 +532,7 @@
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
         final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
-        #t124.{core::Set::add}(#t126){(core::int) → core::bool};
+        #t124.{core::Set::add}{Invariant}(#t126){(core::int) → core::bool};
       }
   } =>#t124, block {
     final core::Set<core::int> #t127 = col::LinkedHashSet::•<core::int>();
@@ -541,12 +541,12 @@
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
         final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
-        #t127.{core::Set::add}(#t129){(core::int) → core::bool};
+        #t127.{core::Set::add}{Invariant}(#t129){(core::int) → core::bool};
       }
   } =>#t127, block {
     final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t130.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null){(core::int, core::int) → void};
   } =>#t130, block {
@@ -556,7 +556,7 @@
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
         final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
-        #t131.{core::Set::add}(#t133){(core::int) → core::bool};
+        #t131.{core::Set::add}{Invariant}(#t133){(core::int) → core::bool};
       }
   } =>#t131, block {
     final core::Set<core::int> #t134 = col::LinkedHashSet::•<core::int>();
@@ -565,7 +565,7 @@
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
         final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
-        #t134.{core::Set::add}(#t136){(core::int) → core::bool};
+        #t134.{core::Set::add}{Invariant}(#t136){(core::int) → core::bool};
       }
   } =>#t134, block {
     final core::Set<core::int> #t137 = col::LinkedHashSet::•<core::int>();
@@ -574,12 +574,12 @@
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
         final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
-        #t137.{core::Set::add}(#t139){(core::int) → core::bool};
+        #t137.{core::Set::add}{Invariant}(#t139){(core::int) → core::bool};
       }
   } =>#t137, block {
     final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t140.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t140, block {
@@ -588,7 +588,7 @@
     if(!(#t142 == null))
       for (final dynamic #t143 in #t142{core::Iterable<dynamic>}) {
         final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
-        #t141.{core::Set::add}(#t144){(core::int) → core::bool};
+        #t141.{core::Set::add}{Invariant}(#t144){(core::int) → core::bool};
       }
   } =>#t141, block {
     final core::Set<core::int> #t145 = col::LinkedHashSet::•<core::int>();
@@ -596,7 +596,7 @@
     if(!(#t146 == null))
       for (final dynamic #t147 in #t146{core::Iterable<dynamic>}) {
         final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
-        #t145.{core::Set::add}(#t148){(core::int) → core::bool};
+        #t145.{core::Set::add}{Invariant}(#t148){(core::int) → core::bool};
       }
   } =>#t145, block {
     final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
@@ -604,14 +604,14 @@
     if(!(#t150 == null))
       for (final dynamic #t151 in #t150{core::Iterable<dynamic>}) {
         final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
-        #t149.{core::Set::add}(#t152){(core::int) → core::bool};
+        #t149.{core::Set::add}{Invariant}(#t152){(core::int) → core::bool};
       }
   } =>#t149, block {
     final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t154 = w;
     if(!(#t154 == null))
       for (final core::MapEntry<core::int, core::int> #t155 in #t154{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t153.{core::Map::[]=}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t153, block {
     final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
     if(condition) {
@@ -619,7 +619,7 @@
       if(!(#t157 == null))
         for (final dynamic #t158 in #t157{core::Iterable<dynamic>}) {
           final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
-          #t156.{core::Set::add}(#t159){(core::int) → core::bool};
+          #t156.{core::Set::add}{Invariant}(#t159){(core::int) → core::bool};
         }
     }
   } =>#t156, block {
@@ -629,7 +629,7 @@
       if(!(#t161 == null))
         for (final dynamic #t162 in #t161{core::Iterable<dynamic>}) {
           final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
-          #t160.{core::Set::add}(#t163){(core::int) → core::bool};
+          #t160.{core::Set::add}{Invariant}(#t163){(core::int) → core::bool};
         }
     }
   } =>#t160, block {
@@ -639,7 +639,7 @@
       if(!(#t165 == null))
         for (final dynamic #t166 in #t165{core::Iterable<dynamic>}) {
           final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
-          #t164.{core::Set::add}(#t167){(core::int) → core::bool};
+          #t164.{core::Set::add}{Invariant}(#t167){(core::int) → core::bool};
         }
     }
   } =>#t164, block {
@@ -648,7 +648,7 @@
       final core::Map<core::int, core::int>? #t169 = w;
       if(!(#t169 == null))
         for (final core::MapEntry<core::int, core::int> #t170 in #t169{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t168.{core::Map::[]=}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t168, block {
     final core::Set<core::int> #t171 = col::LinkedHashSet::•<core::int>();
@@ -657,7 +657,7 @@
       if(!(#t172 == null))
         for (final dynamic #t173 in #t172{core::Iterable<dynamic>}) {
           final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
-          #t171.{core::Set::add}(#t174){(core::int) → core::bool};
+          #t171.{core::Set::add}{Invariant}(#t174){(core::int) → core::bool};
         }
     }
   } =>#t171, block {
@@ -667,7 +667,7 @@
       if(!(#t176 == null))
         for (final dynamic #t177 in #t176{core::Iterable<dynamic>}) {
           final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
-          #t175.{core::Set::add}(#t178){(core::int) → core::bool};
+          #t175.{core::Set::add}{Invariant}(#t178){(core::int) → core::bool};
         }
     }
   } =>#t175, block {
@@ -677,7 +677,7 @@
       if(!(#t180 == null))
         for (final dynamic #t181 in #t180{core::Iterable<dynamic>}) {
           final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
-          #t179.{core::Set::add}(#t182){(core::int) → core::bool};
+          #t179.{core::Set::add}{Invariant}(#t182){(core::int) → core::bool};
         }
     }
   } =>#t179, block {
@@ -686,7 +686,7 @@
       final core::Map<core::int, core::int>? #t184 = w;
       if(!(#t184 == null))
         for (final core::MapEntry<core::int, core::int> #t185 in #t184{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t183.{core::Map::[]=}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t183, block {
     final core::Set<core::int> #t186 = col::LinkedHashSet::•<core::int>();
@@ -695,7 +695,7 @@
       if(!(#t187 == null))
         for (final dynamic #t188 in #t187{core::Iterable<dynamic>}) {
           final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
-          #t186.{core::Set::add}(#t189){(core::int) → core::bool};
+          #t186.{core::Set::add}{Invariant}(#t189){(core::int) → core::bool};
         }
     }
   } =>#t186, block {
@@ -705,7 +705,7 @@
       if(!(#t191 == null))
         for (final dynamic #t192 in #t191{core::Iterable<dynamic>}) {
           final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
-          #t190.{core::Set::add}(#t193){(core::int) → core::bool};
+          #t190.{core::Set::add}{Invariant}(#t193){(core::int) → core::bool};
         }
     }
   } =>#t190, block {
@@ -715,7 +715,7 @@
       if(!(#t195 == null))
         for (final dynamic #t196 in #t195{core::Iterable<dynamic>}) {
           final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
-          #t194.{core::Set::add}(#t197){(core::int) → core::bool};
+          #t194.{core::Set::add}{Invariant}(#t197){(core::int) → core::bool};
         }
     }
   } =>#t194, block {
@@ -724,7 +724,7 @@
       final core::Map<core::int, core::int>? #t199 = w;
       if(!(#t199 == null))
         for (final core::MapEntry<core::int, core::int> #t200 in #t199{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t198.{core::Map::[]=}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t198];
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
index 380d9ab..3b3d749 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
@@ -179,7 +179,7 @@
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-          #t1.{core::Set::add}(#t3){(core::int) → core::bool};
+          #t1.{core::Set::add}{Invariant}(#t3){(core::int) → core::bool};
         }
       }
     }
@@ -193,7 +193,7 @@
         final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-          #t4.{core::Set::add}(#t6){(core::int) → core::bool};
+          #t4.{core::Set::add}{Invariant}(#t6){(core::int) → core::bool};
         }
       }
     }
@@ -207,7 +207,7 @@
         final dynamic #t8 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-          #t7.{core::Set::add}(#t9){(core::int) → core::bool};
+          #t7.{core::Set::add}{Invariant}(#t9){(core::int) → core::bool};
         }
       }
     }
@@ -218,7 +218,7 @@
     <int, int>{...a}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
              ^"){(core::int) → core::bool};
@@ -232,7 +232,7 @@
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
-          #t11.{core::Set::add}(#t13){(core::int) → core::bool};
+          #t11.{core::Set::add}{Invariant}(#t13){(core::int) → core::bool};
         }
       }
     }
@@ -246,7 +246,7 @@
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
-          #t14.{core::Set::add}(#t16){(core::int) → core::bool};
+          #t14.{core::Set::add}{Invariant}(#t16){(core::int) → core::bool};
         }
       }
     }
@@ -260,14 +260,14 @@
         final dynamic #t18 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
-          #t17.{core::Set::add}(#t19){(core::int) → core::bool};
+          #t17.{core::Set::add}{Invariant}(#t19){(core::int) → core::bool};
         }
       }
     }
   } =>#t17, block {
     final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t20.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t20, block {
@@ -284,7 +284,7 @@
             final dynamic #t22 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
-              #t21.{core::Set::add}(#t23){(core::int) → core::bool};
+              #t21.{core::Set::add}{Invariant}(#t23){(core::int) → core::bool};
             }
           }
         }
@@ -304,7 +304,7 @@
             final dynamic #t25 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
-              #t24.{core::Set::add}(#t26){(core::int) → core::bool};
+              #t24.{core::Set::add}{Invariant}(#t26){(core::int) → core::bool};
             }
           }
         }
@@ -324,7 +324,7 @@
             final dynamic #t28 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
-              #t27.{core::Set::add}(#t29){(core::int) → core::bool};
+              #t27.{core::Set::add}{Invariant}(#t29){(core::int) → core::bool};
             }
           }
         }
@@ -336,7 +336,7 @@
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t30.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null){(core::int, core::int) → void};
       }
@@ -351,7 +351,7 @@
         final dynamic #t32 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
-          #t31.{core::Set::add}(#t33){(core::int) → core::bool};
+          #t31.{core::Set::add}{Invariant}(#t33){(core::int) → core::bool};
         }
       }
     }
@@ -365,7 +365,7 @@
         final dynamic #t35 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
-          #t34.{core::Set::add}(#t36){(core::int) → core::bool};
+          #t34.{core::Set::add}{Invariant}(#t36){(core::int) → core::bool};
         }
       }
     }
@@ -379,14 +379,14 @@
         final dynamic #t38 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
-          #t37.{core::Set::add}(#t39){(core::int) → core::bool};
+          #t37.{core::Set::add}{Invariant}(#t39){(core::int) → core::bool};
         }
       }
     }
   } =>#t37, block {
     final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t40.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t40, block {
@@ -398,7 +398,7 @@
         final dynamic #t43 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
-          #t41.{core::Set::add}(#t44){(core::int) → core::bool};
+          #t41.{core::Set::add}{Invariant}(#t44){(core::int) → core::bool};
         }
       }
     }
@@ -411,7 +411,7 @@
         final dynamic #t47 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
-          #t45.{core::Set::add}(#t48){(core::int) → core::bool};
+          #t45.{core::Set::add}{Invariant}(#t48){(core::int) → core::bool};
         }
       }
     }
@@ -424,7 +424,7 @@
         final dynamic #t51 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
-          #t49.{core::Set::add}(#t52){(core::int) → core::bool};
+          #t49.{core::Set::add}{Invariant}(#t52){(core::int) → core::bool};
         }
       }
     }
@@ -435,7 +435,7 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t54{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t55 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t53.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t53, block {
@@ -448,7 +448,7 @@
           final dynamic #t58 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
-            #t56.{core::Set::add}(#t59){(core::int) → core::bool};
+            #t56.{core::Set::add}{Invariant}(#t59){(core::int) → core::bool};
           }
         }
       }
@@ -463,7 +463,7 @@
           final dynamic #t62 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
-            #t60.{core::Set::add}(#t63){(core::int) → core::bool};
+            #t60.{core::Set::add}{Invariant}(#t63){(core::int) → core::bool};
           }
         }
       }
@@ -478,7 +478,7 @@
           final dynamic #t66 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
-            #t64.{core::Set::add}(#t67){(core::int) → core::bool};
+            #t64.{core::Set::add}{Invariant}(#t67){(core::int) → core::bool};
           }
         }
       }
@@ -491,7 +491,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t69{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t70 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t68.{core::Map::[]=}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -509,7 +509,7 @@
               final dynamic #t73 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
-                #t71.{core::Set::add}(#t74){(core::int) → core::bool};
+                #t71.{core::Set::add}{Invariant}(#t74){(core::int) → core::bool};
               }
             }
           }
@@ -530,7 +530,7 @@
               final dynamic #t77 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
-                #t75.{core::Set::add}(#t78){(core::int) → core::bool};
+                #t75.{core::Set::add}{Invariant}(#t78){(core::int) → core::bool};
               }
             }
           }
@@ -551,7 +551,7 @@
               final dynamic #t81 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
-                #t79.{core::Set::add}(#t82){(core::int) → core::bool};
+                #t79.{core::Set::add}{Invariant}(#t82){(core::int) → core::bool};
               }
             }
           }
@@ -570,7 +570,7 @@
             core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t84{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               final core::MapEntry<core::int, core::int> #t85 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-              #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+              #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
             }
           }
         }
@@ -586,7 +586,7 @@
           final dynamic #t88 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
-            #t86.{core::Set::add}(#t89){(core::int) → core::bool};
+            #t86.{core::Set::add}{Invariant}(#t89){(core::int) → core::bool};
           }
         }
       }
@@ -601,7 +601,7 @@
           final dynamic #t92 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
-            #t90.{core::Set::add}(#t93){(core::int) → core::bool};
+            #t90.{core::Set::add}{Invariant}(#t93){(core::int) → core::bool};
           }
         }
       }
@@ -616,7 +616,7 @@
           final dynamic #t96 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
-            #t94.{core::Set::add}(#t97){(core::int) → core::bool};
+            #t94.{core::Set::add}{Invariant}(#t97){(core::int) → core::bool};
           }
         }
       }
@@ -629,7 +629,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t99{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t100 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -646,7 +646,7 @@
         final dynamic #t102 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
-          #t101.{core::Set::add}(#t103){(core::int) → core::bool};
+          #t101.{core::Set::add}{Invariant}(#t103){(core::int) → core::bool};
         }
       }
     }
@@ -660,7 +660,7 @@
         final dynamic #t105 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
-          #t104.{core::Set::add}(#t106){(core::int) → core::bool};
+          #t104.{core::Set::add}{Invariant}(#t106){(core::int) → core::bool};
         }
       }
     }
@@ -674,7 +674,7 @@
         final dynamic #t108 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
-          #t107.{core::Set::add}(#t109){(core::int) → core::bool};
+          #t107.{core::Set::add}{Invariant}(#t109){(core::int) → core::bool};
         }
       }
     }
@@ -684,7 +684,7 @@
     <int, int>{...x}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t110 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t110.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
              ^"){(core::int) → core::bool};
   } =>#t110, block {
@@ -697,7 +697,7 @@
         final dynamic #t112 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
-          #t111.{core::Set::add}(#t113){(core::int) → core::bool};
+          #t111.{core::Set::add}{Invariant}(#t113){(core::int) → core::bool};
         }
       }
     }
@@ -711,7 +711,7 @@
         final dynamic #t115 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
-          #t114.{core::Set::add}(#t116){(core::int) → core::bool};
+          #t114.{core::Set::add}{Invariant}(#t116){(core::int) → core::bool};
         }
       }
     }
@@ -725,14 +725,14 @@
         final dynamic #t118 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
-          #t117.{core::Set::add}(#t119){(core::int) → core::bool};
+          #t117.{core::Set::add}{Invariant}(#t119){(core::int) → core::bool};
         }
       }
     }
   } =>#t117, block {
     final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t120.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t120, block {
@@ -749,7 +749,7 @@
             final dynamic #t122 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
-              #t121.{core::Set::add}(#t123){(core::int) → core::bool};
+              #t121.{core::Set::add}{Invariant}(#t123){(core::int) → core::bool};
             }
           }
         }
@@ -769,7 +769,7 @@
             final dynamic #t125 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
-              #t124.{core::Set::add}(#t126){(core::int) → core::bool};
+              #t124.{core::Set::add}{Invariant}(#t126){(core::int) → core::bool};
             }
           }
         }
@@ -789,7 +789,7 @@
             final dynamic #t128 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
-              #t127.{core::Set::add}(#t129){(core::int) → core::bool};
+              #t127.{core::Set::add}{Invariant}(#t129){(core::int) → core::bool};
             }
           }
         }
@@ -801,7 +801,7 @@
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t130.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null){(core::int, core::int) → void};
       }
@@ -816,7 +816,7 @@
         final dynamic #t132 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
-          #t131.{core::Set::add}(#t133){(core::int) → core::bool};
+          #t131.{core::Set::add}{Invariant}(#t133){(core::int) → core::bool};
         }
       }
     }
@@ -830,7 +830,7 @@
         final dynamic #t135 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
-          #t134.{core::Set::add}(#t136){(core::int) → core::bool};
+          #t134.{core::Set::add}{Invariant}(#t136){(core::int) → core::bool};
         }
       }
     }
@@ -844,14 +844,14 @@
         final dynamic #t138 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
-          #t137.{core::Set::add}(#t139){(core::int) → core::bool};
+          #t137.{core::Set::add}{Invariant}(#t139){(core::int) → core::bool};
         }
       }
     }
   } =>#t137, block {
     final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t140.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t140, block {
@@ -863,7 +863,7 @@
         final dynamic #t143 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
-          #t141.{core::Set::add}(#t144){(core::int) → core::bool};
+          #t141.{core::Set::add}{Invariant}(#t144){(core::int) → core::bool};
         }
       }
     }
@@ -876,7 +876,7 @@
         final dynamic #t147 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
-          #t145.{core::Set::add}(#t148){(core::int) → core::bool};
+          #t145.{core::Set::add}{Invariant}(#t148){(core::int) → core::bool};
         }
       }
     }
@@ -889,7 +889,7 @@
         final dynamic #t151 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
-          #t149.{core::Set::add}(#t152){(core::int) → core::bool};
+          #t149.{core::Set::add}{Invariant}(#t152){(core::int) → core::bool};
         }
       }
     }
@@ -900,7 +900,7 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t154{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t155 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t153.{core::Map::[]=}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t153, block {
@@ -913,7 +913,7 @@
           final dynamic #t158 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
-            #t156.{core::Set::add}(#t159){(core::int) → core::bool};
+            #t156.{core::Set::add}{Invariant}(#t159){(core::int) → core::bool};
           }
         }
       }
@@ -928,7 +928,7 @@
           final dynamic #t162 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
-            #t160.{core::Set::add}(#t163){(core::int) → core::bool};
+            #t160.{core::Set::add}{Invariant}(#t163){(core::int) → core::bool};
           }
         }
       }
@@ -943,7 +943,7 @@
           final dynamic #t166 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
-            #t164.{core::Set::add}(#t167){(core::int) → core::bool};
+            #t164.{core::Set::add}{Invariant}(#t167){(core::int) → core::bool};
           }
         }
       }
@@ -956,7 +956,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t169{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t170 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t168.{core::Map::[]=}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -974,7 +974,7 @@
               final dynamic #t173 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
-                #t171.{core::Set::add}(#t174){(core::int) → core::bool};
+                #t171.{core::Set::add}{Invariant}(#t174){(core::int) → core::bool};
               }
             }
           }
@@ -995,7 +995,7 @@
               final dynamic #t177 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
-                #t175.{core::Set::add}(#t178){(core::int) → core::bool};
+                #t175.{core::Set::add}{Invariant}(#t178){(core::int) → core::bool};
               }
             }
           }
@@ -1016,7 +1016,7 @@
               final dynamic #t181 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
-                #t179.{core::Set::add}(#t182){(core::int) → core::bool};
+                #t179.{core::Set::add}{Invariant}(#t182){(core::int) → core::bool};
               }
             }
           }
@@ -1035,7 +1035,7 @@
             core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t184{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               final core::MapEntry<core::int, core::int> #t185 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-              #t183.{core::Map::[]=}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+              #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
             }
           }
         }
@@ -1051,7 +1051,7 @@
           final dynamic #t188 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
-            #t186.{core::Set::add}(#t189){(core::int) → core::bool};
+            #t186.{core::Set::add}{Invariant}(#t189){(core::int) → core::bool};
           }
         }
       }
@@ -1066,7 +1066,7 @@
           final dynamic #t192 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
-            #t190.{core::Set::add}(#t193){(core::int) → core::bool};
+            #t190.{core::Set::add}{Invariant}(#t193){(core::int) → core::bool};
           }
         }
       }
@@ -1081,7 +1081,7 @@
           final dynamic #t196 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
-            #t194.{core::Set::add}(#t197){(core::int) → core::bool};
+            #t194.{core::Set::add}{Invariant}(#t197){(core::int) → core::bool};
           }
         }
       }
@@ -1094,7 +1094,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t199{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t200 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t198.{core::Map::[]=}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
index a6b4f4e..e415041 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3){(core::int) → core::bool};
+      #t1.{core::Set::add}{Invariant}(#t3){(core::int) → core::bool};
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6){(core::int) → core::bool};
+      #t4.{core::Set::add}{Invariant}(#t6){(core::int) → core::bool};
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
@@ -191,7 +191,7 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9){(core::int) → core::bool};
+      #t7.{core::Set::add}{Invariant}(#t9){(core::int) → core::bool};
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
@@ -200,7 +200,7 @@
     <int, int>{...a}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>();
-    #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
              ^"){(core::int) → core::bool};
@@ -211,7 +211,7 @@
     {if (condition) ...a}, // Error.
                        ^") {
         final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
-        #t11.{core::Set::add}(#t13){(core::int) → core::bool};
+        #t11.{core::Set::add}{Invariant}(#t13){(core::int) → core::bool};
       }
   } =>#t11, block {
     final core::Set<core::int> #t14 = col::LinkedHashSet::•<core::int>();
@@ -220,7 +220,7 @@
     {if (condition) ...b}, // Error.
                        ^") {
         final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
-        #t14.{core::Set::add}(#t16){(core::int) → core::bool};
+        #t14.{core::Set::add}{Invariant}(#t16){(core::int) → core::bool};
       }
   } =>#t14, block {
     final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
@@ -229,12 +229,12 @@
     {if (condition) ...c}, // Error.
                        ^") {
         final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
-        #t17.{core::Set::add}(#t19){(core::int) → core::bool};
+        #t17.{core::Set::add}{Invariant}(#t19){(core::int) → core::bool};
       }
   } =>#t17, block {
     final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t20.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t20, block {
@@ -244,7 +244,7 @@
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
         final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
-        #t21.{core::Set::add}(#t23){(core::int) → core::bool};
+        #t21.{core::Set::add}{Invariant}(#t23){(core::int) → core::bool};
       }
   } =>#t21, block {
     final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
@@ -253,7 +253,7 @@
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
         final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
-        #t24.{core::Set::add}(#t26){(core::int) → core::bool};
+        #t24.{core::Set::add}{Invariant}(#t26){(core::int) → core::bool};
       }
   } =>#t24, block {
     final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
@@ -262,12 +262,12 @@
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
         final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
-        #t27.{core::Set::add}(#t29){(core::int) → core::bool};
+        #t27.{core::Set::add}{Invariant}(#t29){(core::int) → core::bool};
       }
   } =>#t27, block {
     final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t30.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null){(core::int, core::int) → void};
   } =>#t30, block {
@@ -277,7 +277,7 @@
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
         final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
-        #t31.{core::Set::add}(#t33){(core::int) → core::bool};
+        #t31.{core::Set::add}{Invariant}(#t33){(core::int) → core::bool};
       }
   } =>#t31, block {
     final core::Set<core::int> #t34 = col::LinkedHashSet::•<core::int>();
@@ -286,7 +286,7 @@
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
         final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
-        #t34.{core::Set::add}(#t36){(core::int) → core::bool};
+        #t34.{core::Set::add}{Invariant}(#t36){(core::int) → core::bool};
       }
   } =>#t34, block {
     final core::Set<core::int> #t37 = col::LinkedHashSet::•<core::int>();
@@ -295,12 +295,12 @@
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
         final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
-        #t37.{core::Set::add}(#t39){(core::int) → core::bool};
+        #t37.{core::Set::add}{Invariant}(#t39){(core::int) → core::bool};
       }
   } =>#t37, block {
     final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t40.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t40, block {
@@ -309,7 +309,7 @@
     if(!(#t42 == null))
       for (final dynamic #t43 in #t42{core::Iterable<dynamic>}) {
         final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
-        #t41.{core::Set::add}(#t44){(core::int) → core::bool};
+        #t41.{core::Set::add}{Invariant}(#t44){(core::int) → core::bool};
       }
   } =>#t41, block {
     final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
@@ -317,7 +317,7 @@
     if(!(#t46 == null))
       for (final dynamic #t47 in #t46{core::Iterable<dynamic>}) {
         final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
-        #t45.{core::Set::add}(#t48){(core::int) → core::bool};
+        #t45.{core::Set::add}{Invariant}(#t48){(core::int) → core::bool};
       }
   } =>#t45, block {
     final core::Set<core::int> #t49 = col::LinkedHashSet::•<core::int>();
@@ -325,14 +325,14 @@
     if(!(#t50 == null))
       for (final dynamic #t51 in #t50{core::Iterable<dynamic>}) {
         final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
-        #t49.{core::Set::add}(#t52){(core::int) → core::bool};
+        #t49.{core::Set::add}{Invariant}(#t52){(core::int) → core::bool};
       }
   } =>#t49, block {
     final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t54 = d;
     if(!(#t54 == null))
       for (final core::MapEntry<core::int, core::int> #t55 in #t54{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t53.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t53, block {
     final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
     if(condition) {
@@ -340,7 +340,7 @@
       if(!(#t57 == null))
         for (final dynamic #t58 in #t57{core::Iterable<dynamic>}) {
           final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
-          #t56.{core::Set::add}(#t59){(core::int) → core::bool};
+          #t56.{core::Set::add}{Invariant}(#t59){(core::int) → core::bool};
         }
     }
   } =>#t56, block {
@@ -350,7 +350,7 @@
       if(!(#t61 == null))
         for (final dynamic #t62 in #t61{core::Iterable<dynamic>}) {
           final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
-          #t60.{core::Set::add}(#t63){(core::int) → core::bool};
+          #t60.{core::Set::add}{Invariant}(#t63){(core::int) → core::bool};
         }
     }
   } =>#t60, block {
@@ -360,7 +360,7 @@
       if(!(#t65 == null))
         for (final dynamic #t66 in #t65{core::Iterable<dynamic>}) {
           final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
-          #t64.{core::Set::add}(#t67){(core::int) → core::bool};
+          #t64.{core::Set::add}{Invariant}(#t67){(core::int) → core::bool};
         }
     }
   } =>#t64, block {
@@ -369,7 +369,7 @@
       final core::Map<core::int, core::int>? #t69 = d;
       if(!(#t69 == null))
         for (final core::MapEntry<core::int, core::int> #t70 in #t69{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t68.{core::Map::[]=}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t68, block {
     final core::Set<core::int> #t71 = col::LinkedHashSet::•<core::int>();
@@ -378,7 +378,7 @@
       if(!(#t72 == null))
         for (final dynamic #t73 in #t72{core::Iterable<dynamic>}) {
           final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
-          #t71.{core::Set::add}(#t74){(core::int) → core::bool};
+          #t71.{core::Set::add}{Invariant}(#t74){(core::int) → core::bool};
         }
     }
   } =>#t71, block {
@@ -388,7 +388,7 @@
       if(!(#t76 == null))
         for (final dynamic #t77 in #t76{core::Iterable<dynamic>}) {
           final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
-          #t75.{core::Set::add}(#t78){(core::int) → core::bool};
+          #t75.{core::Set::add}{Invariant}(#t78){(core::int) → core::bool};
         }
     }
   } =>#t75, block {
@@ -398,7 +398,7 @@
       if(!(#t80 == null))
         for (final dynamic #t81 in #t80{core::Iterable<dynamic>}) {
           final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
-          #t79.{core::Set::add}(#t82){(core::int) → core::bool};
+          #t79.{core::Set::add}{Invariant}(#t82){(core::int) → core::bool};
         }
     }
   } =>#t79, block {
@@ -407,7 +407,7 @@
       final core::Map<core::int, core::int>? #t84 = d;
       if(!(#t84 == null))
         for (final core::MapEntry<core::int, core::int> #t85 in #t84{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t83, block {
     final core::Set<core::int> #t86 = col::LinkedHashSet::•<core::int>();
@@ -416,7 +416,7 @@
       if(!(#t87 == null))
         for (final dynamic #t88 in #t87{core::Iterable<dynamic>}) {
           final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
-          #t86.{core::Set::add}(#t89){(core::int) → core::bool};
+          #t86.{core::Set::add}{Invariant}(#t89){(core::int) → core::bool};
         }
     }
   } =>#t86, block {
@@ -426,7 +426,7 @@
       if(!(#t91 == null))
         for (final dynamic #t92 in #t91{core::Iterable<dynamic>}) {
           final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
-          #t90.{core::Set::add}(#t93){(core::int) → core::bool};
+          #t90.{core::Set::add}{Invariant}(#t93){(core::int) → core::bool};
         }
     }
   } =>#t90, block {
@@ -436,7 +436,7 @@
       if(!(#t95 == null))
         for (final dynamic #t96 in #t95{core::Iterable<dynamic>}) {
           final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
-          #t94.{core::Set::add}(#t97){(core::int) → core::bool};
+          #t94.{core::Set::add}{Invariant}(#t97){(core::int) → core::bool};
         }
     }
   } =>#t94, block {
@@ -445,7 +445,7 @@
       final core::Map<core::int, core::int>? #t99 = d;
       if(!(#t99 == null))
         for (final core::MapEntry<core::int, core::int> #t100 in #t99{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t98];
 }
@@ -456,7 +456,7 @@
     {...x}, // Error.
         ^") {
       final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
-      #t101.{core::Set::add}(#t103){(core::int) → core::bool};
+      #t101.{core::Set::add}{Invariant}(#t103){(core::int) → core::bool};
     }
   } =>#t101, block {
     final core::Set<core::int> #t104 = col::LinkedHashSet::•<core::int>();
@@ -464,7 +464,7 @@
     {...y}, // Error.
         ^") {
       final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
-      #t104.{core::Set::add}(#t106){(core::int) → core::bool};
+      #t104.{core::Set::add}{Invariant}(#t106){(core::int) → core::bool};
     }
   } =>#t104, block {
     final core::Set<core::int> #t107 = col::LinkedHashSet::•<core::int>();
@@ -472,7 +472,7 @@
     {...z}, // Error.
         ^") {
       final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
-      #t107.{core::Set::add}(#t109){(core::int) → core::bool};
+      #t107.{core::Set::add}{Invariant}(#t109){(core::int) → core::bool};
     }
   } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
@@ -480,7 +480,7 @@
     <int, int>{...x}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t110 = col::LinkedHashSet::•<core::int>();
-    #t110.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
              ^"){(core::int) → core::bool};
   } =>#t110, block {
@@ -490,7 +490,7 @@
     {if (condition) ...x}, // Error.
                        ^") {
         final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
-        #t111.{core::Set::add}(#t113){(core::int) → core::bool};
+        #t111.{core::Set::add}{Invariant}(#t113){(core::int) → core::bool};
       }
   } =>#t111, block {
     final core::Set<core::int> #t114 = col::LinkedHashSet::•<core::int>();
@@ -499,7 +499,7 @@
     {if (condition) ...y}, // Error.
                        ^") {
         final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
-        #t114.{core::Set::add}(#t116){(core::int) → core::bool};
+        #t114.{core::Set::add}{Invariant}(#t116){(core::int) → core::bool};
       }
   } =>#t114, block {
     final core::Set<core::int> #t117 = col::LinkedHashSet::•<core::int>();
@@ -508,12 +508,12 @@
     {if (condition) ...z}, // Error.
                        ^") {
         final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
-        #t117.{core::Set::add}(#t119){(core::int) → core::bool};
+        #t117.{core::Set::add}{Invariant}(#t119){(core::int) → core::bool};
       }
   } =>#t117, block {
     final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t120.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t120, block {
@@ -523,7 +523,7 @@
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
         final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
-        #t121.{core::Set::add}(#t123){(core::int) → core::bool};
+        #t121.{core::Set::add}{Invariant}(#t123){(core::int) → core::bool};
       }
   } =>#t121, block {
     final core::Set<core::int> #t124 = col::LinkedHashSet::•<core::int>();
@@ -532,7 +532,7 @@
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
         final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
-        #t124.{core::Set::add}(#t126){(core::int) → core::bool};
+        #t124.{core::Set::add}{Invariant}(#t126){(core::int) → core::bool};
       }
   } =>#t124, block {
     final core::Set<core::int> #t127 = col::LinkedHashSet::•<core::int>();
@@ -541,12 +541,12 @@
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
         final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
-        #t127.{core::Set::add}(#t129){(core::int) → core::bool};
+        #t127.{core::Set::add}{Invariant}(#t129){(core::int) → core::bool};
       }
   } =>#t127, block {
     final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t130.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null){(core::int, core::int) → void};
   } =>#t130, block {
@@ -556,7 +556,7 @@
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
         final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
-        #t131.{core::Set::add}(#t133){(core::int) → core::bool};
+        #t131.{core::Set::add}{Invariant}(#t133){(core::int) → core::bool};
       }
   } =>#t131, block {
     final core::Set<core::int> #t134 = col::LinkedHashSet::•<core::int>();
@@ -565,7 +565,7 @@
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
         final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
-        #t134.{core::Set::add}(#t136){(core::int) → core::bool};
+        #t134.{core::Set::add}{Invariant}(#t136){(core::int) → core::bool};
       }
   } =>#t134, block {
     final core::Set<core::int> #t137 = col::LinkedHashSet::•<core::int>();
@@ -574,12 +574,12 @@
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
         final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
-        #t137.{core::Set::add}(#t139){(core::int) → core::bool};
+        #t137.{core::Set::add}{Invariant}(#t139){(core::int) → core::bool};
       }
   } =>#t137, block {
     final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t140.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t140, block {
@@ -588,7 +588,7 @@
     if(!(#t142 == null))
       for (final dynamic #t143 in #t142{core::Iterable<dynamic>}) {
         final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
-        #t141.{core::Set::add}(#t144){(core::int) → core::bool};
+        #t141.{core::Set::add}{Invariant}(#t144){(core::int) → core::bool};
       }
   } =>#t141, block {
     final core::Set<core::int> #t145 = col::LinkedHashSet::•<core::int>();
@@ -596,7 +596,7 @@
     if(!(#t146 == null))
       for (final dynamic #t147 in #t146{core::Iterable<dynamic>}) {
         final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
-        #t145.{core::Set::add}(#t148){(core::int) → core::bool};
+        #t145.{core::Set::add}{Invariant}(#t148){(core::int) → core::bool};
       }
   } =>#t145, block {
     final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
@@ -604,14 +604,14 @@
     if(!(#t150 == null))
       for (final dynamic #t151 in #t150{core::Iterable<dynamic>}) {
         final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
-        #t149.{core::Set::add}(#t152){(core::int) → core::bool};
+        #t149.{core::Set::add}{Invariant}(#t152){(core::int) → core::bool};
       }
   } =>#t149, block {
     final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t154 = w;
     if(!(#t154 == null))
       for (final core::MapEntry<core::int, core::int> #t155 in #t154{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t153.{core::Map::[]=}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t153, block {
     final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
     if(condition) {
@@ -619,7 +619,7 @@
       if(!(#t157 == null))
         for (final dynamic #t158 in #t157{core::Iterable<dynamic>}) {
           final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
-          #t156.{core::Set::add}(#t159){(core::int) → core::bool};
+          #t156.{core::Set::add}{Invariant}(#t159){(core::int) → core::bool};
         }
     }
   } =>#t156, block {
@@ -629,7 +629,7 @@
       if(!(#t161 == null))
         for (final dynamic #t162 in #t161{core::Iterable<dynamic>}) {
           final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
-          #t160.{core::Set::add}(#t163){(core::int) → core::bool};
+          #t160.{core::Set::add}{Invariant}(#t163){(core::int) → core::bool};
         }
     }
   } =>#t160, block {
@@ -639,7 +639,7 @@
       if(!(#t165 == null))
         for (final dynamic #t166 in #t165{core::Iterable<dynamic>}) {
           final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
-          #t164.{core::Set::add}(#t167){(core::int) → core::bool};
+          #t164.{core::Set::add}{Invariant}(#t167){(core::int) → core::bool};
         }
     }
   } =>#t164, block {
@@ -648,7 +648,7 @@
       final core::Map<core::int, core::int>? #t169 = w;
       if(!(#t169 == null))
         for (final core::MapEntry<core::int, core::int> #t170 in #t169{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t168.{core::Map::[]=}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t168, block {
     final core::Set<core::int> #t171 = col::LinkedHashSet::•<core::int>();
@@ -657,7 +657,7 @@
       if(!(#t172 == null))
         for (final dynamic #t173 in #t172{core::Iterable<dynamic>}) {
           final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
-          #t171.{core::Set::add}(#t174){(core::int) → core::bool};
+          #t171.{core::Set::add}{Invariant}(#t174){(core::int) → core::bool};
         }
     }
   } =>#t171, block {
@@ -667,7 +667,7 @@
       if(!(#t176 == null))
         for (final dynamic #t177 in #t176{core::Iterable<dynamic>}) {
           final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
-          #t175.{core::Set::add}(#t178){(core::int) → core::bool};
+          #t175.{core::Set::add}{Invariant}(#t178){(core::int) → core::bool};
         }
     }
   } =>#t175, block {
@@ -677,7 +677,7 @@
       if(!(#t180 == null))
         for (final dynamic #t181 in #t180{core::Iterable<dynamic>}) {
           final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
-          #t179.{core::Set::add}(#t182){(core::int) → core::bool};
+          #t179.{core::Set::add}{Invariant}(#t182){(core::int) → core::bool};
         }
     }
   } =>#t179, block {
@@ -686,7 +686,7 @@
       final core::Map<core::int, core::int>? #t184 = w;
       if(!(#t184 == null))
         for (final core::MapEntry<core::int, core::int> #t185 in #t184{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t183.{core::Map::[]=}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t183, block {
     final core::Set<core::int> #t186 = col::LinkedHashSet::•<core::int>();
@@ -695,7 +695,7 @@
       if(!(#t187 == null))
         for (final dynamic #t188 in #t187{core::Iterable<dynamic>}) {
           final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
-          #t186.{core::Set::add}(#t189){(core::int) → core::bool};
+          #t186.{core::Set::add}{Invariant}(#t189){(core::int) → core::bool};
         }
     }
   } =>#t186, block {
@@ -705,7 +705,7 @@
       if(!(#t191 == null))
         for (final dynamic #t192 in #t191{core::Iterable<dynamic>}) {
           final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
-          #t190.{core::Set::add}(#t193){(core::int) → core::bool};
+          #t190.{core::Set::add}{Invariant}(#t193){(core::int) → core::bool};
         }
     }
   } =>#t190, block {
@@ -715,7 +715,7 @@
       if(!(#t195 == null))
         for (final dynamic #t196 in #t195{core::Iterable<dynamic>}) {
           final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
-          #t194.{core::Set::add}(#t197){(core::int) → core::bool};
+          #t194.{core::Set::add}{Invariant}(#t197){(core::int) → core::bool};
         }
     }
   } =>#t194, block {
@@ -724,7 +724,7 @@
       final core::Map<core::int, core::int>? #t199 = w;
       if(!(#t199 == null))
         for (final core::MapEntry<core::int, core::int> #t200 in #t199{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-          #t198.{core::Map::[]=}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
     }
   } =>#t198];
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
index 380d9ab..3b3d749 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
@@ -179,7 +179,7 @@
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-          #t1.{core::Set::add}(#t3){(core::int) → core::bool};
+          #t1.{core::Set::add}{Invariant}(#t3){(core::int) → core::bool};
         }
       }
     }
@@ -193,7 +193,7 @@
         final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-          #t4.{core::Set::add}(#t6){(core::int) → core::bool};
+          #t4.{core::Set::add}{Invariant}(#t6){(core::int) → core::bool};
         }
       }
     }
@@ -207,7 +207,7 @@
         final dynamic #t8 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-          #t7.{core::Set::add}(#t9){(core::int) → core::bool};
+          #t7.{core::Set::add}{Invariant}(#t9){(core::int) → core::bool};
         }
       }
     }
@@ -218,7 +218,7 @@
     <int, int>{...a}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
              ^"){(core::int) → core::bool};
@@ -232,7 +232,7 @@
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
-          #t11.{core::Set::add}(#t13){(core::int) → core::bool};
+          #t11.{core::Set::add}{Invariant}(#t13){(core::int) → core::bool};
         }
       }
     }
@@ -246,7 +246,7 @@
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
-          #t14.{core::Set::add}(#t16){(core::int) → core::bool};
+          #t14.{core::Set::add}{Invariant}(#t16){(core::int) → core::bool};
         }
       }
     }
@@ -260,14 +260,14 @@
         final dynamic #t18 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
-          #t17.{core::Set::add}(#t19){(core::int) → core::bool};
+          #t17.{core::Set::add}{Invariant}(#t19){(core::int) → core::bool};
         }
       }
     }
   } =>#t17, block {
     final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t20.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t20, block {
@@ -284,7 +284,7 @@
             final dynamic #t22 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
-              #t21.{core::Set::add}(#t23){(core::int) → core::bool};
+              #t21.{core::Set::add}{Invariant}(#t23){(core::int) → core::bool};
             }
           }
         }
@@ -304,7 +304,7 @@
             final dynamic #t25 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
-              #t24.{core::Set::add}(#t26){(core::int) → core::bool};
+              #t24.{core::Set::add}{Invariant}(#t26){(core::int) → core::bool};
             }
           }
         }
@@ -324,7 +324,7 @@
             final dynamic #t28 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
-              #t27.{core::Set::add}(#t29){(core::int) → core::bool};
+              #t27.{core::Set::add}{Invariant}(#t29){(core::int) → core::bool};
             }
           }
         }
@@ -336,7 +336,7 @@
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t30.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null){(core::int, core::int) → void};
       }
@@ -351,7 +351,7 @@
         final dynamic #t32 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
-          #t31.{core::Set::add}(#t33){(core::int) → core::bool};
+          #t31.{core::Set::add}{Invariant}(#t33){(core::int) → core::bool};
         }
       }
     }
@@ -365,7 +365,7 @@
         final dynamic #t35 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
-          #t34.{core::Set::add}(#t36){(core::int) → core::bool};
+          #t34.{core::Set::add}{Invariant}(#t36){(core::int) → core::bool};
         }
       }
     }
@@ -379,14 +379,14 @@
         final dynamic #t38 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
-          #t37.{core::Set::add}(#t39){(core::int) → core::bool};
+          #t37.{core::Set::add}{Invariant}(#t39){(core::int) → core::bool};
         }
       }
     }
   } =>#t37, block {
     final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t40.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t40, block {
@@ -398,7 +398,7 @@
         final dynamic #t43 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
-          #t41.{core::Set::add}(#t44){(core::int) → core::bool};
+          #t41.{core::Set::add}{Invariant}(#t44){(core::int) → core::bool};
         }
       }
     }
@@ -411,7 +411,7 @@
         final dynamic #t47 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
-          #t45.{core::Set::add}(#t48){(core::int) → core::bool};
+          #t45.{core::Set::add}{Invariant}(#t48){(core::int) → core::bool};
         }
       }
     }
@@ -424,7 +424,7 @@
         final dynamic #t51 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
-          #t49.{core::Set::add}(#t52){(core::int) → core::bool};
+          #t49.{core::Set::add}{Invariant}(#t52){(core::int) → core::bool};
         }
       }
     }
@@ -435,7 +435,7 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t54{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t55 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t53.{core::Map::[]=}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t53, block {
@@ -448,7 +448,7 @@
           final dynamic #t58 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
-            #t56.{core::Set::add}(#t59){(core::int) → core::bool};
+            #t56.{core::Set::add}{Invariant}(#t59){(core::int) → core::bool};
           }
         }
       }
@@ -463,7 +463,7 @@
           final dynamic #t62 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
-            #t60.{core::Set::add}(#t63){(core::int) → core::bool};
+            #t60.{core::Set::add}{Invariant}(#t63){(core::int) → core::bool};
           }
         }
       }
@@ -478,7 +478,7 @@
           final dynamic #t66 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
-            #t64.{core::Set::add}(#t67){(core::int) → core::bool};
+            #t64.{core::Set::add}{Invariant}(#t67){(core::int) → core::bool};
           }
         }
       }
@@ -491,7 +491,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t69{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t70 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t68.{core::Map::[]=}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -509,7 +509,7 @@
               final dynamic #t73 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
-                #t71.{core::Set::add}(#t74){(core::int) → core::bool};
+                #t71.{core::Set::add}{Invariant}(#t74){(core::int) → core::bool};
               }
             }
           }
@@ -530,7 +530,7 @@
               final dynamic #t77 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
-                #t75.{core::Set::add}(#t78){(core::int) → core::bool};
+                #t75.{core::Set::add}{Invariant}(#t78){(core::int) → core::bool};
               }
             }
           }
@@ -551,7 +551,7 @@
               final dynamic #t81 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
-                #t79.{core::Set::add}(#t82){(core::int) → core::bool};
+                #t79.{core::Set::add}{Invariant}(#t82){(core::int) → core::bool};
               }
             }
           }
@@ -570,7 +570,7 @@
             core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t84{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               final core::MapEntry<core::int, core::int> #t85 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-              #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+              #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
             }
           }
         }
@@ -586,7 +586,7 @@
           final dynamic #t88 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
-            #t86.{core::Set::add}(#t89){(core::int) → core::bool};
+            #t86.{core::Set::add}{Invariant}(#t89){(core::int) → core::bool};
           }
         }
       }
@@ -601,7 +601,7 @@
           final dynamic #t92 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
-            #t90.{core::Set::add}(#t93){(core::int) → core::bool};
+            #t90.{core::Set::add}{Invariant}(#t93){(core::int) → core::bool};
           }
         }
       }
@@ -616,7 +616,7 @@
           final dynamic #t96 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
-            #t94.{core::Set::add}(#t97){(core::int) → core::bool};
+            #t94.{core::Set::add}{Invariant}(#t97){(core::int) → core::bool};
           }
         }
       }
@@ -629,7 +629,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t99{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t100 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t98.{core::Map::[]=}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -646,7 +646,7 @@
         final dynamic #t102 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
-          #t101.{core::Set::add}(#t103){(core::int) → core::bool};
+          #t101.{core::Set::add}{Invariant}(#t103){(core::int) → core::bool};
         }
       }
     }
@@ -660,7 +660,7 @@
         final dynamic #t105 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
-          #t104.{core::Set::add}(#t106){(core::int) → core::bool};
+          #t104.{core::Set::add}{Invariant}(#t106){(core::int) → core::bool};
         }
       }
     }
@@ -674,7 +674,7 @@
         final dynamic #t108 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
-          #t107.{core::Set::add}(#t109){(core::int) → core::bool};
+          #t107.{core::Set::add}{Invariant}(#t109){(core::int) → core::bool};
         }
       }
     }
@@ -684,7 +684,7 @@
     <int, int>{...x}, // Error.
                   ^": null}, block {
     final core::Set<core::int> #t110 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t110.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
              ^"){(core::int) → core::bool};
   } =>#t110, block {
@@ -697,7 +697,7 @@
         final dynamic #t112 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
-          #t111.{core::Set::add}(#t113){(core::int) → core::bool};
+          #t111.{core::Set::add}{Invariant}(#t113){(core::int) → core::bool};
         }
       }
     }
@@ -711,7 +711,7 @@
         final dynamic #t115 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
-          #t114.{core::Set::add}(#t116){(core::int) → core::bool};
+          #t114.{core::Set::add}{Invariant}(#t116){(core::int) → core::bool};
         }
       }
     }
@@ -725,14 +725,14 @@
         final dynamic #t118 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
-          #t117.{core::Set::add}(#t119){(core::int) → core::bool};
+          #t117.{core::Set::add}{Invariant}(#t119){(core::int) → core::bool};
         }
       }
     }
   } =>#t117, block {
     final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t120.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null){(core::int, core::int) → void};
   } =>#t120, block {
@@ -749,7 +749,7 @@
             final dynamic #t122 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
-              #t121.{core::Set::add}(#t123){(core::int) → core::bool};
+              #t121.{core::Set::add}{Invariant}(#t123){(core::int) → core::bool};
             }
           }
         }
@@ -769,7 +769,7 @@
             final dynamic #t125 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
-              #t124.{core::Set::add}(#t126){(core::int) → core::bool};
+              #t124.{core::Set::add}{Invariant}(#t126){(core::int) → core::bool};
             }
           }
         }
@@ -789,7 +789,7 @@
             final dynamic #t128 = :sync-for-iterator.{core::Iterator::current}{Never};
             {
               final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
-              #t127.{core::Set::add}(#t129){(core::int) → core::bool};
+              #t127.{core::Set::add}{Invariant}(#t129){(core::int) → core::bool};
             }
           }
         }
@@ -801,7 +801,7 @@
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
-        #t130.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null){(core::int, core::int) → void};
       }
@@ -816,7 +816,7 @@
         final dynamic #t132 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
-          #t131.{core::Set::add}(#t133){(core::int) → core::bool};
+          #t131.{core::Set::add}{Invariant}(#t133){(core::int) → core::bool};
         }
       }
     }
@@ -830,7 +830,7 @@
         final dynamic #t135 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
-          #t134.{core::Set::add}(#t136){(core::int) → core::bool};
+          #t134.{core::Set::add}{Invariant}(#t136){(core::int) → core::bool};
         }
       }
     }
@@ -844,14 +844,14 @@
         final dynamic #t138 = :sync-for-iterator.{core::Iterator::current}{Never};
         {
           final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
-          #t137.{core::Set::add}(#t139){(core::int) → core::bool};
+          #t137.{core::Set::add}{Invariant}(#t139){(core::int) → core::bool};
         }
       }
     }
   } =>#t137, block {
     final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t140.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null){(core::int, core::int) → void};
   } =>#t140, block {
@@ -863,7 +863,7 @@
         final dynamic #t143 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
-          #t141.{core::Set::add}(#t144){(core::int) → core::bool};
+          #t141.{core::Set::add}{Invariant}(#t144){(core::int) → core::bool};
         }
       }
     }
@@ -876,7 +876,7 @@
         final dynamic #t147 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
-          #t145.{core::Set::add}(#t148){(core::int) → core::bool};
+          #t145.{core::Set::add}{Invariant}(#t148){(core::int) → core::bool};
         }
       }
     }
@@ -889,7 +889,7 @@
         final dynamic #t151 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
-          #t149.{core::Set::add}(#t152){(core::int) → core::bool};
+          #t149.{core::Set::add}{Invariant}(#t152){(core::int) → core::bool};
         }
       }
     }
@@ -900,7 +900,7 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t154{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t155 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t153.{core::Map::[]=}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t153, block {
@@ -913,7 +913,7 @@
           final dynamic #t158 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
-            #t156.{core::Set::add}(#t159){(core::int) → core::bool};
+            #t156.{core::Set::add}{Invariant}(#t159){(core::int) → core::bool};
           }
         }
       }
@@ -928,7 +928,7 @@
           final dynamic #t162 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
-            #t160.{core::Set::add}(#t163){(core::int) → core::bool};
+            #t160.{core::Set::add}{Invariant}(#t163){(core::int) → core::bool};
           }
         }
       }
@@ -943,7 +943,7 @@
           final dynamic #t166 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
-            #t164.{core::Set::add}(#t167){(core::int) → core::bool};
+            #t164.{core::Set::add}{Invariant}(#t167){(core::int) → core::bool};
           }
         }
       }
@@ -956,7 +956,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t169{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t170 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t168.{core::Map::[]=}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
@@ -974,7 +974,7 @@
               final dynamic #t173 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
-                #t171.{core::Set::add}(#t174){(core::int) → core::bool};
+                #t171.{core::Set::add}{Invariant}(#t174){(core::int) → core::bool};
               }
             }
           }
@@ -995,7 +995,7 @@
               final dynamic #t177 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
-                #t175.{core::Set::add}(#t178){(core::int) → core::bool};
+                #t175.{core::Set::add}{Invariant}(#t178){(core::int) → core::bool};
               }
             }
           }
@@ -1016,7 +1016,7 @@
               final dynamic #t181 = :sync-for-iterator.{core::Iterator::current}{dynamic};
               {
                 final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
-                #t179.{core::Set::add}(#t182){(core::int) → core::bool};
+                #t179.{core::Set::add}{Invariant}(#t182){(core::int) → core::bool};
               }
             }
           }
@@ -1035,7 +1035,7 @@
             core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t184{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
               final core::MapEntry<core::int, core::int> #t185 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-              #t183.{core::Map::[]=}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+              #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
             }
           }
         }
@@ -1051,7 +1051,7 @@
           final dynamic #t188 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
-            #t186.{core::Set::add}(#t189){(core::int) → core::bool};
+            #t186.{core::Set::add}{Invariant}(#t189){(core::int) → core::bool};
           }
         }
       }
@@ -1066,7 +1066,7 @@
           final dynamic #t192 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
-            #t190.{core::Set::add}(#t193){(core::int) → core::bool};
+            #t190.{core::Set::add}{Invariant}(#t193){(core::int) → core::bool};
           }
         }
       }
@@ -1081,7 +1081,7 @@
           final dynamic #t196 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
             final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
-            #t194.{core::Set::add}(#t197){(core::int) → core::bool};
+            #t194.{core::Set::add}{Invariant}(#t197){(core::int) → core::bool};
           }
         }
       }
@@ -1094,7 +1094,7 @@
         core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t199{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<core::int, core::int> #t200 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-          #t198.{core::Map::[]=}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
index 7bd7713..076e56c 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
@@ -113,7 +113,7 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t1.{core::List::add}(i){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t1;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
index 415a7b1..90b2c25 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
@@ -120,7 +120,7 @@
   block {
     final core::List<core::int> #t1 = core::_GrowableList::•<core::int>(0);
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t1.{core::List::add}(i){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t1;
 }
 static method hest() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 7bd7713..076e56c 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -113,7 +113,7 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t1.{core::List::add}(i){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t1;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
index 415a7b1..90b2c25 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -120,7 +120,7 @@
   block {
     final core::List<core::int> #t1 = core::_GrowableList::•<core::int>(0);
     for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
-      #t1.{core::List::add}(i){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(i){(core::int) → void};
   } =>#t1;
 }
 static method hest() → dynamic /* originally async */ {
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
index 872ee8f..14bef22c5 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
@@ -9,60 +9,60 @@
     final core::List<core::int> #t1 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t1.{core::List::add}(3){(core::int) → void};
+      #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t1.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t3 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t4 = null;
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t3.{core::List::add}(3){(core::int) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t3.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t3);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t5 = <core::int>[];
     final core::Iterable<core::int>? #t6 = list;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t5;
   core::List<Never> list2 = block {
     final core::List<Never> #t7 = <Never>[];
     final core::Iterable<Never>? #t8 = null;
     if(!(#t8 == null))
-      #t7.{core::List::addAll}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t7;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t9 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t10 = list;
     if(!(#t10 == null))
-      #t9.{core::List::addAll}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t9.{core::List::add}(3){(core::int) → void};
+      #t9.{core::List::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t9.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t9;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t11 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t12 = null;
     if(!(#t12 == null))
-      #t11.{core::List::addAll}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t11.{core::List::add}(3){(core::int) → void};
+      #t11.{core::List::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t11.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t11;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    #t13.{core::Set::add}(1){(core::int) → core::bool};
-    #t13.{core::Set::add}(2){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t14 = set;
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t13.{core::Set::add}(3){(core::int) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t13.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t13);
   core::print( block {
     final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
-    #t15.{core::Set::add}(1){(core::int) → core::bool};
-    #t15.{core::Set::add}(2){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t16 = null;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t15.{core::Set::add}(3){(core::int) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t15.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t15);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
@@ -70,73 +70,73 @@
     if(!(#t18 == null))
       for (final dynamic #t19 in #t18{core::Iterable<dynamic>}) {
         final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t17.{core::Set::add}(#t20){(core::int) → core::bool};
+        #t17.{core::Set::add}{Invariant}(#t20){(core::int) → core::bool};
       }
   } =>#t17;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
-    #t21.{core::Set::add}(1){(core::int) → core::bool};
-    #t21.{core::Set::add}(2){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t22 = set;
     if(!(#t22 == null))
-      #t21.{core::Set::addAll}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t21.{core::Set::add}(3){(core::int) → core::bool};
+      #t21.{core::Set::addAll}{Invariant}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t21.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t21;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t23 = col::LinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(1){(core::int) → core::bool};
-    #t23.{core::Set::add}(2){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t24 = null;
     if(!(#t24 == null))
-      #t23.{core::Set::addAll}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t23.{core::Set::add}(3){(core::int) → core::bool};
+      #t23.{core::Set::addAll}{Invariant}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t23.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t23;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t25 = <core::int, core::int>{};
-    #t25.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t26 = map;
     if(!(#t26 == null))
       for (final core::MapEntry<core::int, core::int> #t27 in #t26{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t25);
   core::print( block {
     final core::Map<core::int, core::int> #t28 = <core::int, core::int>{};
-    #t28.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t29 = null;
     if(!(#t29 == null))
       for (final core::MapEntry<core::int, core::int> #t30 in #t29{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t28.{core::Map::[]=}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t28.{core::Map::[]=}{Invariant}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t28);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t32 = map;
     if(!(#t32 == null))
       for (final core::MapEntry<core::int, core::int> #t33 in #t32{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t31.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t31;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t34 = <core::int, core::int>{};
-    #t34.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t35 = map;
     if(!(#t35 == null))
       for (final core::MapEntry<core::int, core::int> #t36 in #t35{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t34.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t34;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t37 = <core::int, core::int>{};
-    #t37.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t38 = null;
     if(!(#t38 == null))
       for (final core::MapEntry<core::int, core::int> #t39 in #t38{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t37.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t37;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
index c45184d..2cc24c5 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
@@ -9,60 +9,60 @@
     final core::List<core::int> #t1 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t1.{core::List::add}(3){(core::int) → void};
+      #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t1.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t3 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t4 = null;
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t3.{core::List::add}(3){(core::int) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t3.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t3);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t5 = core::_GrowableList::•<core::int>(0);
     final core::Iterable<core::int>? #t6 = list;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t5;
   core::List<Never> list2 = block {
     final core::List<Never> #t7 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t8 = null;
     if(!(#t8 == null))
-      #t7.{core::List::addAll}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t7;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t9 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t10 = list;
     if(!(#t10 == null))
-      #t9.{core::List::addAll}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t9.{core::List::add}(3){(core::int) → void};
+      #t9.{core::List::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t9.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t9;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t11 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t12 = null;
     if(!(#t12 == null))
-      #t11.{core::List::addAll}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t11.{core::List::add}(3){(core::int) → void};
+      #t11.{core::List::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t11.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t11;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t13 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t13.{core::Set::add}(1){(core::int) → core::bool};
-    #t13.{core::Set::add}(2){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t14 = set;
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t13.{core::Set::add}(3){(core::int) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t13.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t13);
   core::print( block {
     final core::Set<core::int> #t15 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t15.{core::Set::add}(1){(core::int) → core::bool};
-    #t15.{core::Set::add}(2){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t16 = null;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t15.{core::Set::add}(3){(core::int) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t15.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t15);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t17 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -73,57 +73,57 @@
         final dynamic #t19 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-          #t17.{core::Set::add}(#t20){(core::int) → core::bool};
+          #t17.{core::Set::add}{Invariant}(#t20){(core::int) → core::bool};
         }
       }
     }
   } =>#t17;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t21 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t21.{core::Set::add}(1){(core::int) → core::bool};
-    #t21.{core::Set::add}(2){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t22 = set;
     if(!(#t22 == null))
-      #t21.{core::Set::addAll}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t21.{core::Set::add}(3){(core::int) → core::bool};
+      #t21.{core::Set::addAll}{Invariant}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t21.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t21;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t23 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(1){(core::int) → core::bool};
-    #t23.{core::Set::add}(2){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t24 = null;
     if(!(#t24 == null))
-      #t23.{core::Set::addAll}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t23.{core::Set::add}(3){(core::int) → core::bool};
+      #t23.{core::Set::addAll}{Invariant}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t23.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t23;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t25 = <core::int, core::int>{};
-    #t25.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t26 = map;
     if(!(#t26 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t26{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t27 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t25.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t25);
   core::print( block {
     final core::Map<core::int, core::int> #t28 = <core::int, core::int>{};
-    #t28.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t29 = null;
     if(!(#t29 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t29{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t30 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t28.{core::Map::[]=}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t28.{core::Map::[]=}{Invariant}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t28.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t28);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
@@ -132,36 +132,36 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t32{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t33 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t31.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t31;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t34 = <core::int, core::int>{};
-    #t34.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t35 = map;
     if(!(#t35 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t35{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t36 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t34.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t34.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t34;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t37 = <core::int, core::int>{};
-    #t37.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t38 = null;
     if(!(#t38 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t38{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t39 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t37.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t37.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t37;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
index 872ee8f..14bef22c5 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
@@ -9,60 +9,60 @@
     final core::List<core::int> #t1 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t1.{core::List::add}(3){(core::int) → void};
+      #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t1.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t3 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t4 = null;
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t3.{core::List::add}(3){(core::int) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t3.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t3);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t5 = <core::int>[];
     final core::Iterable<core::int>? #t6 = list;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t5;
   core::List<Never> list2 = block {
     final core::List<Never> #t7 = <Never>[];
     final core::Iterable<Never>? #t8 = null;
     if(!(#t8 == null))
-      #t7.{core::List::addAll}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t7;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t9 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t10 = list;
     if(!(#t10 == null))
-      #t9.{core::List::addAll}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t9.{core::List::add}(3){(core::int) → void};
+      #t9.{core::List::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t9.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t9;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t11 = <core::int>[1, 2];
     final core::Iterable<core::int>? #t12 = null;
     if(!(#t12 == null))
-      #t11.{core::List::addAll}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t11.{core::List::add}(3){(core::int) → void};
+      #t11.{core::List::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t11.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t11;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    #t13.{core::Set::add}(1){(core::int) → core::bool};
-    #t13.{core::Set::add}(2){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t14 = set;
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t13.{core::Set::add}(3){(core::int) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t13.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t13);
   core::print( block {
     final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
-    #t15.{core::Set::add}(1){(core::int) → core::bool};
-    #t15.{core::Set::add}(2){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t16 = null;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t15.{core::Set::add}(3){(core::int) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t15.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t15);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
@@ -70,73 +70,73 @@
     if(!(#t18 == null))
       for (final dynamic #t19 in #t18{core::Iterable<dynamic>}) {
         final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t17.{core::Set::add}(#t20){(core::int) → core::bool};
+        #t17.{core::Set::add}{Invariant}(#t20){(core::int) → core::bool};
       }
   } =>#t17;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
-    #t21.{core::Set::add}(1){(core::int) → core::bool};
-    #t21.{core::Set::add}(2){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t22 = set;
     if(!(#t22 == null))
-      #t21.{core::Set::addAll}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t21.{core::Set::add}(3){(core::int) → core::bool};
+      #t21.{core::Set::addAll}{Invariant}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t21.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t21;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t23 = col::LinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(1){(core::int) → core::bool};
-    #t23.{core::Set::add}(2){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t24 = null;
     if(!(#t24 == null))
-      #t23.{core::Set::addAll}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t23.{core::Set::add}(3){(core::int) → core::bool};
+      #t23.{core::Set::addAll}{Invariant}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t23.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t23;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t25 = <core::int, core::int>{};
-    #t25.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t26 = map;
     if(!(#t26 == null))
       for (final core::MapEntry<core::int, core::int> #t27 in #t26{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t25);
   core::print( block {
     final core::Map<core::int, core::int> #t28 = <core::int, core::int>{};
-    #t28.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t29 = null;
     if(!(#t29 == null))
       for (final core::MapEntry<core::int, core::int> #t30 in #t29{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t28.{core::Map::[]=}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t28.{core::Map::[]=}{Invariant}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t28);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t32 = map;
     if(!(#t32 == null))
       for (final core::MapEntry<core::int, core::int> #t33 in #t32{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t31.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
   } =>#t31;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t34 = <core::int, core::int>{};
-    #t34.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t35 = map;
     if(!(#t35 == null))
       for (final core::MapEntry<core::int, core::int> #t36 in #t35{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t34.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t34;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t37 = <core::int, core::int>{};
-    #t37.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t38 = null;
     if(!(#t38 == null))
       for (final core::MapEntry<core::int, core::int> #t39 in #t38{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+        #t37.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t37;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
index c45184d..2cc24c5 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
@@ -9,60 +9,60 @@
     final core::List<core::int> #t1 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t2 = list;
     if(!(#t2 == null))
-      #t1.{core::List::addAll}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t1.{core::List::add}(3){(core::int) → void};
+      #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t1.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t3 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t4 = null;
     if(!(#t4 == null))
-      #t3.{core::List::addAll}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t3.{core::List::add}(3){(core::int) → void};
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t3.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t3);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t5 = core::_GrowableList::•<core::int>(0);
     final core::Iterable<core::int>? #t6 = list;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t5;
   core::List<Never> list2 = block {
     final core::List<Never> #t7 = core::_GrowableList::•<Never>(0);
     final core::Iterable<Never>? #t8 = null;
     if(!(#t8 == null))
-      #t7.{core::List::addAll}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+      #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
   } =>#t7;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t9 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t10 = list;
     if(!(#t10 == null))
-      #t9.{core::List::addAll}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t9.{core::List::add}(3){(core::int) → void};
+      #t9.{core::List::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t9.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t9;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t11 = core::_GrowableList::_literal2<core::int>(1, 2);
     final core::Iterable<core::int>? #t12 = null;
     if(!(#t12 == null))
-      #t11.{core::List::addAll}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t11.{core::List::add}(3){(core::int) → void};
+      #t11.{core::List::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t11.{core::List::add}{Invariant}(3){(core::int) → void};
   } =>#t11;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t13 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t13.{core::Set::add}(1){(core::int) → core::bool};
-    #t13.{core::Set::add}(2){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t14 = set;
     if(!(#t14 == null))
-      #t13.{core::Set::addAll}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t13.{core::Set::add}(3){(core::int) → core::bool};
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t13.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t13);
   core::print( block {
     final core::Set<core::int> #t15 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t15.{core::Set::add}(1){(core::int) → core::bool};
-    #t15.{core::Set::add}(2){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t16 = null;
     if(!(#t16 == null))
-      #t15.{core::Set::addAll}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t15.{core::Set::add}(3){(core::int) → core::bool};
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t15.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t15);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t17 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -73,57 +73,57 @@
         final dynamic #t19 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-          #t17.{core::Set::add}(#t20){(core::int) → core::bool};
+          #t17.{core::Set::add}{Invariant}(#t20){(core::int) → core::bool};
         }
       }
     }
   } =>#t17;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t21 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t21.{core::Set::add}(1){(core::int) → core::bool};
-    #t21.{core::Set::add}(2){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t22 = set;
     if(!(#t22 == null))
-      #t21.{core::Set::addAll}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t21.{core::Set::add}(3){(core::int) → core::bool};
+      #t21.{core::Set::addAll}{Invariant}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t21.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t21;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t23 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(1){(core::int) → core::bool};
-    #t23.{core::Set::add}(2){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
     final core::Iterable<core::int>? #t24 = null;
     if(!(#t24 == null))
-      #t23.{core::Set::addAll}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
-    #t23.{core::Set::add}(3){(core::int) → core::bool};
+      #t23.{core::Set::addAll}{Invariant}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t23.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
   } =>#t23;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t25 = <core::int, core::int>{};
-    #t25.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t25.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t26 = map;
     if(!(#t26 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t26{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t27 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t25.{core::Map::[]=}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t25.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t25);
   core::print( block {
     final core::Map<core::int, core::int> #t28 = <core::int, core::int>{};
-    #t28.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t28.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t29 = null;
     if(!(#t29 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t29{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t30 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t28.{core::Map::[]=}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t28.{core::Map::[]=}{Invariant}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t28.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t28);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
@@ -132,36 +132,36 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t32{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t33 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t31.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
   } =>#t31;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t34 = <core::int, core::int>{};
-    #t34.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t34.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t35 = map;
     if(!(#t35 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t35{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t36 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t34.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t34.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t34;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t37 = <core::int, core::int>{};
-    #t37.{core::Map::[]=}(1, 1){(core::int, core::int) → void};
-    #t37.{core::Map::[]=}(2, 2){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
     final core::Map<core::int, core::int>? #t38 = null;
     if(!(#t38 == null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t38{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int, core::int> #t39 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int, core::int>};
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+        #t37.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
       }
     }
-    #t37.{core::Map::[]=}(3, 3){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
   } =>#t37;
 }
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
index 4b1d92e..c211559 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
@@ -141,7 +141,7 @@
     final core::List<core::String> #t5 = <core::String>[];
     final core::Iterable<core::String>? #t6 = l;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t7 = col::LinkedHashSet::•<core::String>();
@@ -149,28 +149,28 @@
     if(!(#t8 == null))
       for (final dynamic #t9 in #t8{core::Iterable<dynamic>}) {
         final core::String #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::String;
-        #t7.{core::Set::add}(#t10){(core::String) → core::bool};
+        #t7.{core::Set::add}{Invariant}(#t10){(core::String) → core::bool};
       }
   } =>#t7;
   block {
     final core::Set<core::String> #t11 = col::LinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t12 = l;
     if(!(#t12 == null))
-      #t11.{core::Set::addAll}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t11;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t13 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t14 = m;
     if(!(#t14 == null))
       for (final core::MapEntry<core::String, core::int> #t15 in #t14{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
-        #t13.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t13.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
   } =>#t13;
   block {
     final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t17 = m;
     if(!(#t17 == null))
       for (final core::MapEntry<core::String, core::int> #t18 in #t17{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t16.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
   } =>#t16;
   s!;
   let final core::String #t19 = s in #t19 == null ?{core::String?} null : #t19.{core::String::substring}(0, 0){(core::int, [core::int?]) → core::String};
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index 68f5e76..2b3f245 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -141,7 +141,7 @@
     final core::List<core::String> #t5 = core::_GrowableList::•<core::String>(0);
     final core::Iterable<core::String>? #t6 = l;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t7 = new col::_CompactLinkedHashSet::•<core::String>();
@@ -152,7 +152,7 @@
         final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::String #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::String;
-          #t7.{core::Set::add}(#t10){(core::String) → core::bool};
+          #t7.{core::Set::add}{Invariant}(#t10){(core::String) → core::bool};
         }
       }
     }
@@ -161,7 +161,7 @@
     final core::Set<core::String> #t11 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t12 = l;
     if(!(#t12 == null))
-      #t11.{core::Set::addAll}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t11;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t13 = <core::String, core::int>{};
@@ -170,7 +170,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t14{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String, core::int> #t15 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String, core::int>};
-        #t13.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t13.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
       }
     }
   } =>#t13;
@@ -181,7 +181,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t17{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String, core::int> #t18 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String, core::int>};
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t16.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
       }
     }
   } =>#t16;
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
index 4b1d92e..c211559 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
@@ -141,7 +141,7 @@
     final core::List<core::String> #t5 = <core::String>[];
     final core::Iterable<core::String>? #t6 = l;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t7 = col::LinkedHashSet::•<core::String>();
@@ -149,28 +149,28 @@
     if(!(#t8 == null))
       for (final dynamic #t9 in #t8{core::Iterable<dynamic>}) {
         final core::String #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::String;
-        #t7.{core::Set::add}(#t10){(core::String) → core::bool};
+        #t7.{core::Set::add}{Invariant}(#t10){(core::String) → core::bool};
       }
   } =>#t7;
   block {
     final core::Set<core::String> #t11 = col::LinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t12 = l;
     if(!(#t12 == null))
-      #t11.{core::Set::addAll}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t11;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t13 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t14 = m;
     if(!(#t14 == null))
       for (final core::MapEntry<core::String, core::int> #t15 in #t14{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
-        #t13.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t13.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
   } =>#t13;
   block {
     final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t17 = m;
     if(!(#t17 == null))
       for (final core::MapEntry<core::String, core::int> #t18 in #t17{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t16.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
   } =>#t16;
   s!;
   let final core::String #t19 = s in #t19 == null ?{core::String?} null : #t19.{core::String::substring}(0, 0){(core::int, [core::int?]) → core::String};
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index 68f5e76..2b3f245 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -141,7 +141,7 @@
     final core::List<core::String> #t5 = core::_GrowableList::•<core::String>(0);
     final core::Iterable<core::String>? #t6 = l;
     if(!(#t6 == null))
-      #t5.{core::List::addAll}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t7 = new col::_CompactLinkedHashSet::•<core::String>();
@@ -152,7 +152,7 @@
         final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::String #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::String;
-          #t7.{core::Set::add}(#t10){(core::String) → core::bool};
+          #t7.{core::Set::add}{Invariant}(#t10){(core::String) → core::bool};
         }
       }
     }
@@ -161,7 +161,7 @@
     final core::Set<core::String> #t11 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t12 = l;
     if(!(#t12 == null))
-      #t11.{core::Set::addAll}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+      #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
   } =>#t11;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t13 = <core::String, core::int>{};
@@ -170,7 +170,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t14{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String, core::int> #t15 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String, core::int>};
-        #t13.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t13.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
       }
     }
   } =>#t13;
@@ -181,7 +181,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t17{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::String, core::int>>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::String, core::int> #t18 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::String, core::int>};
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+        #t16.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
       }
     }
   } =>#t16;
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
index 09c6491..9cbfdf4 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
@@ -81,8 +81,8 @@
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call});
+  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call}{() → core::int});
+  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call}{() → core::int});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index 39b2ea0..99736f9 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -81,8 +81,8 @@
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t11 = c in #t11 == null ?{() → core::int} null : #t11.{self::C::call});
+  self::functionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call}{() → core::int});
+  self::nullableFunctionContext(let final self::C #t11 = c in #t11 == null ?{() → core::int} null : #t11.{self::C::call}{() → core::int});
   self::functionContext(let final Never #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
index 09c6491..9cbfdf4 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
@@ -81,8 +81,8 @@
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call});
+  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call}{() → core::int});
+  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call}{() → core::int});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
index 9249659..3f2deb7 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
@@ -81,8 +81,8 @@
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call});
+  self::functionContext(let final self::C #t9 = c in #t9 == null ?{() → core::int} null : #t9.{self::C::call}{() → core::int});
+  self::nullableFunctionContext(let final self::C #t10 = c in #t10 == null ?{() → core::int} null : #t10.{self::C::call}{() → core::int});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
index 7698d5d..6cfd88a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
@@ -37,83 +37,83 @@
   core::List<Null>* local1i = <Null>[null];
   core::Set<inf::C<dynamic>*>* local2a = block {
     final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>();
-    #t1.{core::Set::add}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
-    #t1.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
   } =>#t1;
   core::Set<inf::C<dynamic>*>* local2b = block {
     final core::Set<inf::C<dynamic>*>* #t2 = col::LinkedHashSet::•<inf::C<dynamic>*>();
-    #t2.{core::Set::add}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
-    #t2.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
   } =>#t2;
   core::Set<inf::C<core::int*>*>* local2c = block {
     final core::Set<inf::C<core::int*>*>* #t3 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t3.{core::Set::add}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
-    #t3.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t3;
   core::Set<inf::C<core::int*>*>* local2d = block {
     final core::Set<inf::C<core::int*>*>* #t4 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t4.{core::Set::add}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
-    #t4.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t4;
   core::Set<inf::C<core::int*>*>* local2e = block {
     final core::Set<inf::C<core::int*>*>* #t5 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t5.{core::Set::add}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
-    #t5.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t5;
   core::Set<inf::C<core::int*>*>* local2f = block {
     final core::Set<inf::C<core::int*>*>* #t6 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t6.{core::Set::add}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
-    #t6.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t6;
   core::Set<core::int*>* local2g = block {
     final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(inf::field7){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t7;
   core::Set<core::int*>* local2h = block {
     final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
-    #t8.{core::Set::add}(inf::field8){(core::int*) →* core::bool*};
-    #t8.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<inf::C<dynamic>*>* local3a = block {
     final core::Set<inf::C<dynamic>*>* #t9 = col::LinkedHashSet::•<inf::C<dynamic>*>();
-    #t9.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
-    #t9.{core::Set::add}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+    #t9.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t9.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
   } =>#t9;
   core::Set<inf::C<dynamic>*>* local3b = block {
     final core::Set<inf::C<dynamic>*>* #t10 = col::LinkedHashSet::•<inf::C<dynamic>*>();
-    #t10.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
-    #t10.{core::Set::add}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+    #t10.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t10.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
   } =>#t10;
   core::Set<inf::C<core::int*>*>* local3c = block {
     final core::Set<inf::C<core::int*>*>* #t11 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t11.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t11.{core::Set::add}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+    #t11.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t11.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
   } =>#t11;
   core::Set<inf::C<core::int*>*>* local3d = block {
     final core::Set<inf::C<core::int*>*>* #t12 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t12.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t12.{core::Set::add}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
   } =>#t12;
   core::Set<inf::C<core::int*>*>* local3e = block {
     final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t13.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t13.{core::Set::add}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+    #t13.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t13.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
   } =>#t13;
   core::Set<inf::C<core::int*>*>* local3f = block {
     final core::Set<inf::C<core::int*>*>* #t14 = col::LinkedHashSet::•<inf::C<core::int*>*>();
-    #t14.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t14.{core::Set::add}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+    #t14.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t14.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
   } =>#t14;
   core::Set<core::int*>* local3g = block {
     final core::Set<core::int*>* #t15 = col::LinkedHashSet::•<core::int*>();
-    #t15.{core::Set::add}(null){(core::int*) →* core::bool*};
-    #t15.{core::Set::add}(inf::field7){(core::int*) →* core::bool*};
+    #t15.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t15.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
   } =>#t15;
   core::Set<core::int*>* local3h = block {
     final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>();
-    #t16.{core::Set::add}(null){(core::int*) →* core::bool*};
-    #t16.{core::Set::add}(inf::field8){(core::int*) →* core::bool*};
+    #t16.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t16.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
   } =>#t16;
 }
 
@@ -167,82 +167,82 @@
   core::List<Null> local1i = <Null>[null];
   core::Set<inf::C<dynamic>?> local2a = block {
     final core::Set<inf::C<dynamic>?> #t17 = col::LinkedHashSet::•<inf::C<dynamic>?>();
-    #t17.{core::Set::add}(inf::field1){(inf::C<dynamic>?) → core::bool};
-    #t17.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
+    #t17.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
+    #t17.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
   } =>#t17;
   core::Set<inf::C<dynamic>?> local2b = block {
     final core::Set<inf::C<dynamic>?> #t18 = col::LinkedHashSet::•<inf::C<dynamic>?>();
-    #t18.{core::Set::add}(inf::field2){(inf::C<dynamic>?) → core::bool};
-    #t18.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
+    #t18.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
+    #t18.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
   } =>#t18;
   core::Set<inf::C<core::int>?> local2c = block {
     final core::Set<inf::C<core::int>?> #t19 = col::LinkedHashSet::•<inf::C<core::int>?>();
-    #t19.{core::Set::add}(inf::field3){(inf::C<core::int>?) → core::bool};
-    #t19.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
+    #t19.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
+    #t19.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
   } =>#t19;
   core::Set<inf::C<core::int>?> local2d = block {
     final core::Set<inf::C<core::int>?> #t20 = col::LinkedHashSet::•<inf::C<core::int>?>();
-    #t20.{core::Set::add}(inf::field4){(inf::C<core::int>?) → core::bool};
-    #t20.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
+    #t20.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
+    #t20.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
   } =>#t20;
   core::Set<inf::C<core::int?>?> local2e = block {
     final core::Set<inf::C<core::int?>?> #t21 = col::LinkedHashSet::•<inf::C<core::int?>?>();
-    #t21.{core::Set::add}(inf::field5){(inf::C<core::int?>?) → core::bool};
-    #t21.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
+    #t21.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
+    #t21.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
   } =>#t21;
   core::Set<inf::C<core::int?>?> local2f = block {
     final core::Set<inf::C<core::int?>?> #t22 = col::LinkedHashSet::•<inf::C<core::int?>?>();
-    #t22.{core::Set::add}(inf::field6){(inf::C<core::int?>?) → core::bool};
-    #t22.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
   } =>#t22;
   core::Set<core::int?> local2g = block {
     final core::Set<core::int?> #t23 = col::LinkedHashSet::•<core::int?>();
-    #t23.{core::Set::add}(inf::field7){(core::int?) → core::bool};
-    #t23.{core::Set::add}(null){(core::int?) → core::bool};
+    #t23.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
+    #t23.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
   } =>#t23;
   core::Set<core::int?> local2h = block {
     final core::Set<core::int?> #t24 = col::LinkedHashSet::•<core::int?>();
-    #t24.{core::Set::add}(inf::field8){(core::int?) → core::bool};
-    #t24.{core::Set::add}(null){(core::int?) → core::bool};
+    #t24.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
+    #t24.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
   } =>#t24;
   core::Set<inf::C<dynamic>?> local3a = block {
     final core::Set<inf::C<dynamic>?> #t25 = col::LinkedHashSet::•<inf::C<dynamic>?>();
-    #t25.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
-    #t25.{core::Set::add}(inf::field1){(inf::C<dynamic>?) → core::bool};
+    #t25.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t25.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
   } =>#t25;
   core::Set<inf::C<dynamic>?> local3b = block {
     final core::Set<inf::C<dynamic>?> #t26 = col::LinkedHashSet::•<inf::C<dynamic>?>();
-    #t26.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
-    #t26.{core::Set::add}(inf::field2){(inf::C<dynamic>?) → core::bool};
+    #t26.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t26.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
   } =>#t26;
   core::Set<inf::C<core::int>?> local3c = block {
     final core::Set<inf::C<core::int>?> #t27 = col::LinkedHashSet::•<inf::C<core::int>?>();
-    #t27.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
-    #t27.{core::Set::add}(inf::field3){(inf::C<core::int>?) → core::bool};
+    #t27.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t27.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
   } =>#t27;
   core::Set<inf::C<core::int>?> local3d = block {
     final core::Set<inf::C<core::int>?> #t28 = col::LinkedHashSet::•<inf::C<core::int>?>();
-    #t28.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
-    #t28.{core::Set::add}(inf::field4){(inf::C<core::int>?) → core::bool};
+    #t28.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t28.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
   } =>#t28;
   core::Set<inf::C<core::int?>?> local3e = block {
     final core::Set<inf::C<core::int?>?> #t29 = col::LinkedHashSet::•<inf::C<core::int?>?>();
-    #t29.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
-    #t29.{core::Set::add}(inf::field5){(inf::C<core::int?>?) → core::bool};
+    #t29.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t29.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
   } =>#t29;
   core::Set<inf::C<core::int?>?> local3f = block {
     final core::Set<inf::C<core::int?>?> #t30 = col::LinkedHashSet::•<inf::C<core::int?>?>();
-    #t30.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
-    #t30.{core::Set::add}(inf::field6){(inf::C<core::int?>?) → core::bool};
+    #t30.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t30.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
   } =>#t30;
   core::Set<core::int?> local3g = block {
     final core::Set<core::int?> #t31 = col::LinkedHashSet::•<core::int?>();
-    #t31.{core::Set::add}(null){(core::int?) → core::bool};
-    #t31.{core::Set::add}(inf::field7){(core::int?) → core::bool};
+    #t31.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t31.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
   } =>#t31;
   core::Set<core::int?> local3h = block {
     final core::Set<core::int?> #t32 = col::LinkedHashSet::•<core::int?>();
-    #t32.{core::Set::add}(null){(core::int?) → core::bool};
-    #t32.{core::Set::add}(inf::field8){(core::int?) → core::bool};
+    #t32.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t32.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
   } =>#t32;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 3f7b98d..865f8c3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -37,83 +37,83 @@
   core::List<Null>* local1i = core::_GrowableList::_literal1<Null>(null);
   core::Set<inf::C<dynamic>*>* local2a = block {
     final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
-    #t1.{core::Set::add}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
-    #t1.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
   } =>#t1;
   core::Set<inf::C<dynamic>*>* local2b = block {
     final core::Set<inf::C<dynamic>*>* #t2 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
-    #t2.{core::Set::add}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
-    #t2.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
   } =>#t2;
   core::Set<inf::C<core::int*>*>* local2c = block {
     final core::Set<inf::C<core::int*>*>* #t3 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t3.{core::Set::add}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
-    #t3.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t3;
   core::Set<inf::C<core::int*>*>* local2d = block {
     final core::Set<inf::C<core::int*>*>* #t4 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t4.{core::Set::add}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
-    #t4.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t4;
   core::Set<inf::C<core::int*>*>* local2e = block {
     final core::Set<inf::C<core::int*>*>* #t5 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t5.{core::Set::add}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
-    #t5.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t5;
   core::Set<inf::C<core::int*>*>* local2f = block {
     final core::Set<inf::C<core::int*>*>* #t6 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t6.{core::Set::add}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
-    #t6.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
   } =>#t6;
   core::Set<core::int*>* local2g = block {
     final core::Set<core::int*>* #t7 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(inf::field7){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t7;
   core::Set<core::int*>* local2h = block {
     final core::Set<core::int*>* #t8 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t8.{core::Set::add}(inf::field8){(core::int*) →* core::bool*};
-    #t8.{core::Set::add}(null){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<inf::C<dynamic>*>* local3a = block {
     final core::Set<inf::C<dynamic>*>* #t9 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
-    #t9.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
-    #t9.{core::Set::add}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+    #t9.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t9.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
   } =>#t9;
   core::Set<inf::C<dynamic>*>* local3b = block {
     final core::Set<inf::C<dynamic>*>* #t10 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
-    #t10.{core::Set::add}(null){(inf::C<dynamic>*) →* core::bool*};
-    #t10.{core::Set::add}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+    #t10.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t10.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
   } =>#t10;
   core::Set<inf::C<core::int*>*>* local3c = block {
     final core::Set<inf::C<core::int*>*>* #t11 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t11.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t11.{core::Set::add}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+    #t11.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t11.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
   } =>#t11;
   core::Set<inf::C<core::int*>*>* local3d = block {
     final core::Set<inf::C<core::int*>*>* #t12 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t12.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t12.{core::Set::add}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
   } =>#t12;
   core::Set<inf::C<core::int*>*>* local3e = block {
     final core::Set<inf::C<core::int*>*>* #t13 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t13.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t13.{core::Set::add}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+    #t13.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t13.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
   } =>#t13;
   core::Set<inf::C<core::int*>*>* local3f = block {
     final core::Set<inf::C<core::int*>*>* #t14 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
-    #t14.{core::Set::add}(null){(inf::C<core::int*>*) →* core::bool*};
-    #t14.{core::Set::add}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+    #t14.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t14.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
   } =>#t14;
   core::Set<core::int*>* local3g = block {
     final core::Set<core::int*>* #t15 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t15.{core::Set::add}(null){(core::int*) →* core::bool*};
-    #t15.{core::Set::add}(inf::field7){(core::int*) →* core::bool*};
+    #t15.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t15.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
   } =>#t15;
   core::Set<core::int*>* local3h = block {
     final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t16.{core::Set::add}(null){(core::int*) →* core::bool*};
-    #t16.{core::Set::add}(inf::field8){(core::int*) →* core::bool*};
+    #t16.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t16.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
   } =>#t16;
 }
 
@@ -167,82 +167,82 @@
   core::List<Null> local1i = core::_GrowableList::_literal1<Null>(null);
   core::Set<inf::C<dynamic>?> local2a = block {
     final core::Set<inf::C<dynamic>?> #t17 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
-    #t17.{core::Set::add}(inf::field1){(inf::C<dynamic>?) → core::bool};
-    #t17.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
+    #t17.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
+    #t17.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
   } =>#t17;
   core::Set<inf::C<dynamic>?> local2b = block {
     final core::Set<inf::C<dynamic>?> #t18 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
-    #t18.{core::Set::add}(inf::field2){(inf::C<dynamic>?) → core::bool};
-    #t18.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
+    #t18.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
+    #t18.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
   } =>#t18;
   core::Set<inf::C<core::int>?> local2c = block {
     final core::Set<inf::C<core::int>?> #t19 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
-    #t19.{core::Set::add}(inf::field3){(inf::C<core::int>?) → core::bool};
-    #t19.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
+    #t19.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
+    #t19.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
   } =>#t19;
   core::Set<inf::C<core::int>?> local2d = block {
     final core::Set<inf::C<core::int>?> #t20 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
-    #t20.{core::Set::add}(inf::field4){(inf::C<core::int>?) → core::bool};
-    #t20.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
+    #t20.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
+    #t20.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
   } =>#t20;
   core::Set<inf::C<core::int?>?> local2e = block {
     final core::Set<inf::C<core::int?>?> #t21 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
-    #t21.{core::Set::add}(inf::field5){(inf::C<core::int?>?) → core::bool};
-    #t21.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
+    #t21.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
+    #t21.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
   } =>#t21;
   core::Set<inf::C<core::int?>?> local2f = block {
     final core::Set<inf::C<core::int?>?> #t22 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
-    #t22.{core::Set::add}(inf::field6){(inf::C<core::int?>?) → core::bool};
-    #t22.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
   } =>#t22;
   core::Set<core::int?> local2g = block {
     final core::Set<core::int?> #t23 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t23.{core::Set::add}(inf::field7){(core::int?) → core::bool};
-    #t23.{core::Set::add}(null){(core::int?) → core::bool};
+    #t23.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
+    #t23.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
   } =>#t23;
   core::Set<core::int?> local2h = block {
     final core::Set<core::int?> #t24 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t24.{core::Set::add}(inf::field8){(core::int?) → core::bool};
-    #t24.{core::Set::add}(null){(core::int?) → core::bool};
+    #t24.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
+    #t24.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
   } =>#t24;
   core::Set<inf::C<dynamic>?> local3a = block {
     final core::Set<inf::C<dynamic>?> #t25 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
-    #t25.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
-    #t25.{core::Set::add}(inf::field1){(inf::C<dynamic>?) → core::bool};
+    #t25.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t25.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
   } =>#t25;
   core::Set<inf::C<dynamic>?> local3b = block {
     final core::Set<inf::C<dynamic>?> #t26 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
-    #t26.{core::Set::add}(null){(inf::C<dynamic>?) → core::bool};
-    #t26.{core::Set::add}(inf::field2){(inf::C<dynamic>?) → core::bool};
+    #t26.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t26.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
   } =>#t26;
   core::Set<inf::C<core::int>?> local3c = block {
     final core::Set<inf::C<core::int>?> #t27 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
-    #t27.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
-    #t27.{core::Set::add}(inf::field3){(inf::C<core::int>?) → core::bool};
+    #t27.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t27.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
   } =>#t27;
   core::Set<inf::C<core::int>?> local3d = block {
     final core::Set<inf::C<core::int>?> #t28 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
-    #t28.{core::Set::add}(null){(inf::C<core::int>?) → core::bool};
-    #t28.{core::Set::add}(inf::field4){(inf::C<core::int>?) → core::bool};
+    #t28.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t28.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
   } =>#t28;
   core::Set<inf::C<core::int?>?> local3e = block {
     final core::Set<inf::C<core::int?>?> #t29 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
-    #t29.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
-    #t29.{core::Set::add}(inf::field5){(inf::C<core::int?>?) → core::bool};
+    #t29.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t29.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
   } =>#t29;
   core::Set<inf::C<core::int?>?> local3f = block {
     final core::Set<inf::C<core::int?>?> #t30 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
-    #t30.{core::Set::add}(null){(inf::C<core::int?>?) → core::bool};
-    #t30.{core::Set::add}(inf::field6){(inf::C<core::int?>?) → core::bool};
+    #t30.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t30.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
   } =>#t30;
   core::Set<core::int?> local3g = block {
     final core::Set<core::int?> #t31 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t31.{core::Set::add}(null){(core::int?) → core::bool};
-    #t31.{core::Set::add}(inf::field7){(core::int?) → core::bool};
+    #t31.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t31.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
   } =>#t31;
   core::Set<core::int?> local3h = block {
     final core::Set<core::int?> #t32 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t32.{core::Set::add}(null){(core::int?) → core::bool};
-    #t32.{core::Set::add}(inf::field8){(core::int?) → core::bool};
+    #t32.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t32.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
   } =>#t32;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
index c4d17c9..54456fa 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
@@ -13,7 +13,7 @@
       final core::List<core::String*>* #t1 = <core::String*>[node];
       final core::Iterable<core::String*>* #t2 = let final core::Iterable<core::String*>* #t3 = let final core::Set<core::String*>* #t4 = this.{self::Class::map}{core::Map<core::String*, core::Set<core::String*>*>*}.{core::Map::[]}(node){(core::Object*) →* core::Set<core::String*>*} in #t4 == null ?{core::Iterable<core::String*>*} null : #t4.{core::Iterable::expand}<core::String*>((core::String* node) → core::List<core::String*>* => this.{self::Class::method}(node, set){(core::String*, core::Set<core::String*>*) →* core::List<core::String*>*}){((core::String*) →* core::Iterable<core::String*>*) →* core::Iterable<core::String*>*} in #t3 == null ?{core::List<core::String*>*} null : #t3.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
       if(!(#t2 == null))
-        #t1.{core::List::addAll}(#t2){(core::Iterable<core::String*>*) →* void};
+        #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
     } =>#t1 : <core::String*>[];
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
index eb3b7ce..3720023 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
       final core::List<core::String*>* #t1 = core::_GrowableList::_literal1<core::String*>(node);
       final core::Iterable<core::String*>* #t2 = let final core::Iterable<core::String*>* #t3 = let final core::Set<core::String*>* #t4 = this.{self::Class::map}{core::Map<core::String*, core::Set<core::String*>*>*}.{core::Map::[]}(node){(core::Object*) →* core::Set<core::String*>*} in #t4 == null ?{core::Iterable<core::String*>*} null : #t4.{core::Iterable::expand}<core::String*>((core::String* node) → core::List<core::String*>* => this.{self::Class::method}(node, set){(core::String*, core::Set<core::String*>*) →* core::List<core::String*>*}){((core::String*) →* core::Iterable<core::String*>*) →* core::Iterable<core::String*>*} in #t3 == null ?{core::List<core::String*>*} null : #t3.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
       if(!(#t2 == null))
-        #t1.{core::List::addAll}(#t2){(core::Iterable<core::String*>*) →* void};
+        #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
     } =>#t1 : core::_GrowableList::•<core::String*>(0);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/none/property_get.dart.strong.expect b/pkg/front_end/testcases/none/property_get.dart.strong.expect
index 921ff16..4163115 100644
--- a/pkg/front_end/testcases/none/property_get.dart.strong.expect
+++ b/pkg/front_end/testcases/none/property_get.dart.strong.expect
@@ -84,7 +84,7 @@
   core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:63:36: Error: Not a constant expression.
   const dynamic instance_tearOff = nonNullableClass1.method;
                                    ^^^^^^^^^^^^^^^^^");
-  core::Function f1 = let final self::Class2<core::String> #t5 = nonNullableClass2 in #t5 == null ?{() → core::int} null : #t5.{self::Class2::call};
+  core::Function f1 = let final self::Class2<core::String> #t5 = nonNullableClass2 in #t5 == null ?{() → core::int} null : #t5.{self::Class2::call}{() → core::int};
   core::Function? f2 = let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/property_get.dart:67:18: Error: Can't tear off method 'call' from a potentially null value.
   Function? f2 = nullableClass2;
                  ^" in nullableClass2 as{TypeError} core::Function?;
diff --git a/pkg/front_end/testcases/none/property_get.dart.weak.expect b/pkg/front_end/testcases/none/property_get.dart.weak.expect
index 67ded25..fcb468d 100644
--- a/pkg/front_end/testcases/none/property_get.dart.weak.expect
+++ b/pkg/front_end/testcases/none/property_get.dart.weak.expect
@@ -85,7 +85,7 @@
   core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:63:36: Error: Not a constant expression.
   const dynamic instance_tearOff = nonNullableClass1.method;
                                    ^^^^^^^^^^^^^^^^^");
-  core::Function f1 = let final self::Class2<core::String> #t5 = nonNullableClass2 in #t5 == null ?{() → core::int} null : #t5.{self::Class2::call};
+  core::Function f1 = let final self::Class2<core::String> #t5 = nonNullableClass2 in #t5 == null ?{() → core::int} null : #t5.{self::Class2::call}{() → core::int};
   core::Function? f2 = let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/property_get.dart:67:18: Error: Can't tear off method 'call' from a potentially null value.
   Function? f2 = nullableClass2;
                  ^" in nullableClass2 as{TypeError} core::Function?;
diff --git a/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.expect b/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.expect
index 51270b9..0661b92 100644
--- a/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.expect
@@ -26,6 +26,6 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test(self::Class* c) → dynamic {
-  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call};
+  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call}{() →* void};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.transformed.expect
index 51270b9..0661b92 100644
--- a/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/tearoff_opt_out.dart.strong.transformed.expect
@@ -26,6 +26,6 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test(self::Class* c) → dynamic {
-  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call};
+  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call}{() →* void};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.expect b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.expect
index 7b89feb..3be713b 100644
--- a/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.expect
@@ -19,6 +19,6 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test(self::Class* c) → dynamic {
-  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call};
+  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call}{() →* void};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.transformed.expect
index 7b89feb..3be713b 100644
--- a/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.transformed.expect
@@ -19,6 +19,6 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test(self::Class* c) → dynamic {
-  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call};
+  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call}{() →* void};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31198.dart.weak.expect
index d8c2257..3bc5419 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.weak.expect
@@ -34,7 +34,7 @@
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
   B(): super().foo() {}
-       ^".foo() {}
+       ^"{dynamic}.foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31198.dart.weak.transformed.expect
index d8c2257..3bc5419 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
   B(): super().foo() {}
-       ^".foo() {}
+       ^"{dynamic}.foo() {}
 }
 static method bad() → dynamic {
   new self::B::•();
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.weak.expect b/pkg/front_end/testcases/regress/issue_42423.dart.weak.expect
index 55da096..ed0856a 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.weak.expect
@@ -13,7 +13,7 @@
     if(!(#t2 == null))
       for (final dynamic #t3 in #t2) {
         final core::int* #t4 = #t3 as{TypeError} core::int*;
-        #t1.{core::Set::add}(#t4){(core::int*) →* core::bool*};
+        #t1.{core::Set::add}{Invariant}(#t4){(core::int*) →* core::bool*};
       }
   } =>#t1;
 }
@@ -24,7 +24,7 @@
     if(!(#t6 == null))
       for (final dynamic #t7 in #t6) {
         final core::int* #t8 = #t7 as{TypeError} core::int*;
-        #t5.{core::List::add}(#t8){(core::int*) →* void};
+        #t5.{core::List::add}{Invariant}(#t8){(core::int*) →* void};
       }
   } =>#t5;
 }
@@ -36,7 +36,7 @@
       for (final core::MapEntry<dynamic, dynamic>* #t11 in #t10.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}) {
         final core::int* #t12 = #t11.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
         final core::int* #t13 = #t11.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-        #t9.{core::Map::[]=}(#t12, #t13){(core::int*, core::int*) →* void};
+        #t9.{core::Map::[]=}{Invariant}(#t12, #t13){(core::int*, core::int*) →* void};
       }
   } =>#t9;
 }
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_42423.dart.weak.transformed.expect
index 8aff3a5..2fb8e72 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.weak.transformed.expect
@@ -16,7 +16,7 @@
         final dynamic #t3 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t4 = #t3 as{TypeError} core::int*;
-          #t1.{core::Set::add}(#t4){(core::int*) →* core::bool*};
+          #t1.{core::Set::add}{Invariant}(#t4){(core::int*) →* core::bool*};
         }
       }
     }
@@ -32,7 +32,7 @@
         final dynamic #t7 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t8 = #t7 as{TypeError} core::int*;
-          #t5.{core::List::add}(#t8){(core::int*) →* void};
+          #t5.{core::List::add}{Invariant}(#t8){(core::int*) →* void};
         }
       }
     }
@@ -49,7 +49,7 @@
         {
           final core::int* #t12 = #t11.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
           final core::int* #t13 = #t11.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
-          #t9.{core::Map::[]=}(#t12, #t13){(core::int*, core::int*) →* void};
+          #t9.{core::Map::[]=}{Invariant}(#t12, #t13){(core::int*, core::int*) →* void};
         }
       }
     }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.expect
index eb56668..bffdb53 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.expect
@@ -19,5 +19,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  () →* void x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call};
+  () →* void x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.transformed.expect
index eb56668..bffdb53 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.transformed.expect
@@ -19,5 +19,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  () →* void x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call};
+  () →* void x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.expect
index 2d573c9..edf5d5c 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call};
+  FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.transformed.expect
index 2d573c9..edf5d5c 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.transformed.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call};
+  FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
 }
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 5dd912a..7c64966 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -29,6 +29,7 @@
 constructor_tearoffs/nongeneric_tearoff_with_context: FormatterCrash
 constructor_tearoffs/nongeneric_tearoff_without_context: FormatterCrash
 constructor_tearoffs/redirecting_constructors: FormatterCrash
+constructor_tearoffs/simple_instantiated_type_literals: FormatterCrash
 constructor_tearoffs/unnamed_constructor: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
diff --git a/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.expect b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.expect
index 2e6cfa8..9474a72 100644
--- a/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.expect
@@ -10,22 +10,22 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t1 = <core::int*>[element0 as{TypeError,ForDynamic} core::int*, element1 as{TypeError} core::int*, element2];
     if(true)
-      #t1.{core::List::add}(3){(core::int*) →* void};
-    #t1.{core::List::add}(4){(core::int*) →* void};
-    #t1.{core::List::add}(5){(core::int*) →* void};
-    #t1.{core::List::add}(6){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t1;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(element2){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element2){(core::int*) →* core::bool*};
     if(true)
-      #t2.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t2;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -35,26 +35,26 @@
     final core::List<core::int*>* #t3 = <core::int*>[];
     for (final dynamic #t4 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t5 = #t4 as{TypeError} core::int*;
-      #t3.{core::List::add}(#t5){(core::int*) →* void};
+      #t3.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
     }
     if(true)
-      #t3.{core::List::add}(3){(core::int*) →* void};
-    #t3.{core::List::add}(4){(core::int*) →* void};
-    #t3.{core::List::add}(5){(core::int*) →* void};
-    #t3.{core::List::add}(6){(core::int*) →* void};
+      #t3.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t3;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t7 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t8 = #t7 as{TypeError} core::int*;
-      #t6.{core::Set::add}(#t8){(core::int*) →* core::bool*};
+      #t6.{core::Set::add}{Invariant}(#t8){(core::int*) →* core::bool*};
     }
     if(true)
-      #t6.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t6.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t6;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -64,26 +64,26 @@
     final core::List<core::int*>* #t9 = <core::int*>[];
     for (final dynamic #t10 in initial) {
       final core::int* #t11 = #t10 as{TypeError} core::int*;
-      #t9.{core::List::add}(#t11){(core::int*) →* void};
+      #t9.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
     }
     if(true)
-      #t9.{core::List::add}(3){(core::int*) →* void};
-    #t9.{core::List::add}(4){(core::int*) →* void};
-    #t9.{core::List::add}(5){(core::int*) →* void};
-    #t9.{core::List::add}(6){(core::int*) →* void};
+      #t9.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t9;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t13 in initial) {
       final core::int* #t14 = #t13 as{TypeError} core::int*;
-      #t12.{core::Set::add}(#t14){(core::int*) →* core::bool*};
+      #t12.{core::Set::add}{Invariant}(#t14){(core::int*) →* core::bool*};
     }
     if(true)
-      #t12.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t12.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t12;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -93,26 +93,26 @@
     final core::List<core::int*>* #t15 = <core::int*>[];
     for (final dynamic #t16 in initial) {
       final core::int* #t17 = #t16 as{TypeError} core::int*;
-      #t15.{core::List::add}(#t17){(core::int*) →* void};
+      #t15.{core::List::add}{Invariant}(#t17){(core::int*) →* void};
     }
     if(true)
-      #t15.{core::List::add}(3){(core::int*) →* void};
-    #t15.{core::List::add}(4){(core::int*) →* void};
-    #t15.{core::List::add}(5){(core::int*) →* void};
-    #t15.{core::List::add}(6){(core::int*) →* void};
+      #t15.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t15;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t18 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t19 in initial) {
       final core::int* #t20 = #t19 as{TypeError} core::int*;
-      #t18.{core::Set::add}(#t20){(core::int*) →* core::bool*};
+      #t18.{core::Set::add}{Invariant}(#t20){(core::int*) →* core::bool*};
     }
     if(true)
-      #t18.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t18.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t18;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -121,19 +121,19 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t21 = core::List::of<core::int*>(initial);
     if(true)
-      #t21.{core::List::add}(3){(core::int*) →* void};
-    #t21.{core::List::add}(4){(core::int*) →* void};
-    #t21.{core::List::add}(5){(core::int*) →* void};
-    #t21.{core::List::add}(6){(core::int*) →* void};
+      #t21.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t21;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t22 = col::LinkedHashSet::of<core::int*>(initial);
     if(true)
-      #t22.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t22.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t22;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -142,19 +142,19 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t23 = core::List::of<core::int*>(initial);
     if(true)
-      #t23.{core::List::add}(3){(core::int*) →* void};
-    #t23.{core::List::add}(4){(core::int*) →* void};
-    #t23.{core::List::add}(5){(core::int*) →* void};
-    #t23.{core::List::add}(6){(core::int*) →* void};
+      #t23.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t23;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t24 = col::LinkedHashSet::of<core::int*>(initial);
     if(true)
-      #t24.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t24.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t24;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -164,24 +164,24 @@
     final core::List<core::int*>* #t25 = <core::int*>[];
     final core::Iterable<core::int*>* #t26 = initial;
     if(!(#t26 == null))
-      #t25.{core::List::addAll}(#t26){(core::Iterable<core::int*>*) →* void};
+      #t25.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
     if(true)
-      #t25.{core::List::add}(3){(core::int*) →* void};
-    #t25.{core::List::add}(4){(core::int*) →* void};
-    #t25.{core::List::add}(5){(core::int*) →* void};
-    #t25.{core::List::add}(6){(core::int*) →* void};
+      #t25.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t25;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t27 = col::LinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t28 = initial;
     if(!(#t28 == null))
-      #t27.{core::Set::addAll}(#t28){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t28){(core::Iterable<core::int*>*) →* void};
     if(true)
-      #t27.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t27.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t27;
   self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
diff --git a/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.transformed.expect
index 371f045..7ebbdd7 100644
--- a/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.transformed.expect
@@ -10,22 +10,22 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t1 = core::_GrowableList::_literal3<core::int*>(element0 as{TypeError,ForDynamic} core::int*, element1 as{TypeError} core::int*, element2);
     if(true)
-      #t1.{core::List::add}(3){(core::int*) →* void};
-    #t1.{core::List::add}(4){(core::int*) →* void};
-    #t1.{core::List::add}(5){(core::int*) →* void};
-    #t1.{core::List::add}(6){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t1;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(element2){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element2){(core::int*) →* core::bool*};
     if(true)
-      #t2.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t2.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t2;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -39,15 +39,15 @@
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t5 = #t4 as{TypeError} core::int*;
-          #t3.{core::List::add}(#t5){(core::int*) →* void};
+          #t3.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
         }
       }
     }
     if(true)
-      #t3.{core::List::add}(3){(core::int*) →* void};
-    #t3.{core::List::add}(4){(core::int*) →* void};
-    #t3.{core::List::add}(5){(core::int*) →* void};
-    #t3.{core::List::add}(6){(core::int*) →* void};
+      #t3.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t3;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
@@ -58,15 +58,15 @@
         final dynamic #t7 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t8 = #t7 as{TypeError} core::int*;
-          #t6.{core::Set::add}(#t8){(core::int*) →* core::bool*};
+          #t6.{core::Set::add}{Invariant}(#t8){(core::int*) →* core::bool*};
         }
       }
     }
     if(true)
-      #t6.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t6.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t6;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -80,15 +80,15 @@
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t11 = #t10 as{TypeError} core::int*;
-          #t9.{core::List::add}(#t11){(core::int*) →* void};
+          #t9.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
         }
       }
     }
     if(true)
-      #t9.{core::List::add}(3){(core::int*) →* void};
-    #t9.{core::List::add}(4){(core::int*) →* void};
-    #t9.{core::List::add}(5){(core::int*) →* void};
-    #t9.{core::List::add}(6){(core::int*) →* void};
+      #t9.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t9;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
@@ -99,15 +99,15 @@
         final dynamic #t13 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t14 = #t13 as{TypeError} core::int*;
-          #t12.{core::Set::add}(#t14){(core::int*) →* core::bool*};
+          #t12.{core::Set::add}{Invariant}(#t14){(core::int*) →* core::bool*};
         }
       }
     }
     if(true)
-      #t12.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t12.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t12.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t12;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -121,15 +121,15 @@
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t17 = #t16 as{TypeError} core::int*;
-          #t15.{core::List::add}(#t17){(core::int*) →* void};
+          #t15.{core::List::add}{Invariant}(#t17){(core::int*) →* void};
         }
       }
     }
     if(true)
-      #t15.{core::List::add}(3){(core::int*) →* void};
-    #t15.{core::List::add}(4){(core::int*) →* void};
-    #t15.{core::List::add}(5){(core::int*) →* void};
-    #t15.{core::List::add}(6){(core::int*) →* void};
+      #t15.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t15;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
@@ -140,15 +140,15 @@
         final dynamic #t19 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t20 = #t19 as{TypeError} core::int*;
-          #t18.{core::Set::add}(#t20){(core::int*) →* core::bool*};
+          #t18.{core::Set::add}{Invariant}(#t20){(core::int*) →* core::bool*};
         }
       }
     }
     if(true)
-      #t18.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t18.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t18.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t18;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -157,19 +157,19 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t21 = core::List::of<core::int*>(initial);
     if(true)
-      #t21.{core::List::add}(3){(core::int*) →* void};
-    #t21.{core::List::add}(4){(core::int*) →* void};
-    #t21.{core::List::add}(5){(core::int*) →* void};
-    #t21.{core::List::add}(6){(core::int*) →* void};
+      #t21.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t21;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t22 = col::LinkedHashSet::of<core::int*>(initial);
     if(true)
-      #t22.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t22.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t22.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t22;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -178,19 +178,19 @@
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t23 = core::List::of<core::int*>(initial);
     if(true)
-      #t23.{core::List::add}(3){(core::int*) →* void};
-    #t23.{core::List::add}(4){(core::int*) →* void};
-    #t23.{core::List::add}(5){(core::int*) →* void};
-    #t23.{core::List::add}(6){(core::int*) →* void};
+      #t23.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t23;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t24 = col::LinkedHashSet::of<core::int*>(initial);
     if(true)
-      #t24.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t24.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t24.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t24;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
@@ -200,24 +200,24 @@
     final core::List<core::int*>* #t25 = core::_GrowableList::•<core::int*>(0);
     final core::Iterable<core::int*>* #t26 = initial;
     if(!(#t26 == null))
-      #t25.{core::List::addAll}(#t26){(core::Iterable<core::int*>*) →* void};
+      #t25.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
     if(true)
-      #t25.{core::List::add}(3){(core::int*) →* void};
-    #t25.{core::List::add}(4){(core::int*) →* void};
-    #t25.{core::List::add}(5){(core::int*) →* void};
-    #t25.{core::List::add}(6){(core::int*) →* void};
+      #t25.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(6){(core::int*) →* void};
   } =>#t25;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t27 = new col::_CompactLinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t28 = initial;
     if(!(#t28 == null))
-      #t27.{core::Set::addAll}(#t28){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t28){(core::Iterable<core::int*>*) →* void};
     if(true)
-      #t27.{core::Set::add}(3){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(4){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(5){(core::int*) →* core::bool*};
-    #t27.{core::Set::add}(6){(core::int*) →* core::bool*};
+      #t27.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
   } =>#t27;
   self::expect(core::_GrowableList::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
 }
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.weak.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.expect
index 4292215..78bb3e0 100644
--- a/pkg/front_end/testcases/unified_collections/invariance.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.expect
@@ -9,64 +9,64 @@
   dynamic list3 = <core::int*>[0];
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t1 = <core::int*>[0];
-    #t1.{core::List::addAll}(list1){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(list1){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t2 in list2) {
       final core::int* #t3 = #t2 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t3){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
     }
     for (final dynamic #t4 in list3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t5 = #t4 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t5){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
     }
     if(true)
-      #t1.{core::List::add}(2){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
   } =>#t1;
   core::Set<core::int*>* set1 = block {
     final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
-    #t6.{core::Set::add}(0){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
   } =>#t6;
   core::Set<core::num*>* set2 = block {
     final core::Set<core::num*>* #t7 = col::LinkedHashSet::•<core::num*>();
-    #t7.{core::Set::add}(0){(core::num*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(0){(core::num*) →* core::bool*};
   } =>#t7;
   dynamic set3 = block {
     final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
-    #t8.{core::Set::add}(0){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(0){(core::int*) →* core::bool*};
-    #t9.{core::Set::addAll}(set1){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t9.{core::Set::addAll}{Invariant}(set1){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t10 in set2) {
       final core::int* #t11 = #t10 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
     }
     for (final dynamic #t12 in set3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t13 = #t12 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t13){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
     }
     if(true)
-      #t9.{core::Set::add}(2){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
   } =>#t9;
   core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
   core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
   dynamic map3 = <core::int*, core::String*>{0: "baz"};
   core::Map<core::int*, core::String*>* map = block {
     final core::Map<core::int*, core::String*>* #t14 = <core::int*, core::String*>{};
-    #t14.{core::Map::[]=}(0, "foo"){(core::int*, core::String*) →* void};
+    #t14.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
     for (final core::MapEntry<core::int*, core::String*>* #t15 in map1.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>})
-      #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::int*}, #t15.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::int*}, #t15.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
     for (final core::MapEntry<dynamic, dynamic>* #t16 in map2.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
       final core::int* #t17 = #t16.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
       final core::String* #t18 = #t16.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
-      #t14.{core::Map::[]=}(#t17, #t18){(core::int*, core::String*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(#t17, #t18){(core::int*, core::String*) →* void};
     }
     for (final core::MapEntry<dynamic, dynamic>* #t19 in (map3 as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
       final core::int* #t20 = #t19.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
       final core::String* #t21 = #t19.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
-      #t14.{core::Map::[]=}(#t20, #t21){(core::int*, core::String*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(#t20, #t21){(core::int*, core::String*) →* void};
     }
     if(true)
-      #t14.{core::Map::[]=}(2, "baz"){(core::int*, core::String*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(2, "baz"){(core::int*, core::String*) →* void};
   } =>#t14;
 }
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.transformed.expect
index c778d8e..64652c2 100644
--- a/pkg/front_end/testcases/unified_collections/invariance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.transformed.expect
@@ -9,14 +9,14 @@
   dynamic list3 = core::_GrowableList::_literal1<core::int*>(0);
   core::List<core::int*>* list = block {
     final core::List<core::int*>* #t1 = core::_GrowableList::_literal1<core::int*>(0);
-    #t1.{core::List::addAll}(list1){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(list1){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = list2.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t3 = #t2 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t3){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
         }
       }
     }
@@ -26,36 +26,36 @@
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t5 = #t4 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t5){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
         }
       }
     }
     if(true)
-      #t1.{core::List::add}(2){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
   } =>#t1;
   core::Set<core::int*>* set1 = block {
     final core::Set<core::int*>* #t6 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t6.{core::Set::add}(0){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
   } =>#t6;
   core::Set<core::num*>* set2 = block {
     final core::Set<core::num*>* #t7 = new col::_CompactLinkedHashSet::•<core::num*>();
-    #t7.{core::Set::add}(0){(core::num*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(0){(core::num*) →* core::bool*};
   } =>#t7;
   dynamic set3 = block {
     final core::Set<core::int*>* #t8 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t8.{core::Set::add}(0){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set = block {
     final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(0){(core::int*) →* core::bool*};
-    #t9.{core::Set::addAll}(set1){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t9.{core::Set::addAll}{Invariant}(set1){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = set2.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t11 = #t10 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
         }
       }
     }
@@ -65,24 +65,24 @@
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t13 = #t12 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t13){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
         }
       }
     }
     if(true)
-      #t9.{core::Set::add}(2){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
   } =>#t9;
   core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
   core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
   dynamic map3 = <core::int*, core::String*>{0: "baz"};
   core::Map<core::int*, core::String*>* map = block {
     final core::Map<core::int*, core::String*>* #t14 = <core::int*, core::String*>{};
-    #t14.{core::Map::[]=}(0, "foo"){(core::int*, core::String*) →* void};
+    #t14.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
     {
       core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = map1.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::String*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int*, core::String*>* #t15 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::String*>};
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}{core::int*}, #t15.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::int*}, #t15.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
       }
     }
     {
@@ -92,7 +92,7 @@
         {
           final core::int* #t17 = #t16.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
           final core::String* #t18 = #t16.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
-          #t14.{core::Map::[]=}(#t17, #t18){(core::int*, core::String*) →* void};
+          #t14.{core::Map::[]=}{Invariant}(#t17, #t18){(core::int*, core::String*) →* void};
         }
       }
     }
@@ -103,11 +103,11 @@
         {
           final core::int* #t20 = #t19.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
           final core::String* #t21 = #t19.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
-          #t14.{core::Map::[]=}(#t20, #t21){(core::int*, core::String*) →* void};
+          #t14.{core::Map::[]=}{Invariant}(#t20, #t21){(core::int*, core::String*) →* void};
         }
       }
     }
     if(true)
-      #t14.{core::Map::[]=}(2, "baz"){(core::int*, core::String*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(2, "baz"){(core::int*, core::String*) →* void};
   } =>#t14;
 }
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.expect b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.expect
index 3a1f942..253e487 100644
--- a/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.expect
@@ -15,29 +15,29 @@
     final core::List<core::int*>* #t1 = <core::int*>[];
     for (final dynamic #t2 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t3 = #t2 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t3){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
     }
     for (final dynamic #t4 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t5 = #t4 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t5){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
     }
-    #t1.{core::List::addAll}(iterableIntList){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t6 in iterableNumList1) {
       final core::int* #t7 = #t6 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t7){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t7){(core::int*) →* void};
     }
     for (final dynamic #t8 in iterableNumList2) {
       final core::int* #t9 = #t8 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t9){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t9){(core::int*) →* void};
     }
-    #t1.{core::List::addAll}(intList){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t10 in numList1) {
       final core::int* #t11 = #t10 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t11){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
     }
     for (final dynamic #t12 in numList2) {
       final core::int* #t13 = #t12 as{TypeError} core::int*;
-      #t1.{core::List::add}(#t13){(core::int*) →* void};
+      #t1.{core::List::add}{Invariant}(#t13){(core::int*) →* void};
     }
   } =>#t1;
   self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list1);
@@ -45,18 +45,18 @@
     final core::List<core::num*>* #t14 = <core::num*>[];
     for (final dynamic #t15 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::num* #t16 = #t15 as{TypeError} core::num*;
-      #t14.{core::List::add}(#t16){(core::num*) →* void};
+      #t14.{core::List::add}{Invariant}(#t16){(core::num*) →* void};
     }
     for (final dynamic #t17 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::num* #t18 = #t17 as{TypeError} core::num*;
-      #t14.{core::List::add}(#t18){(core::num*) →* void};
+      #t14.{core::List::add}{Invariant}(#t18){(core::num*) →* void};
     }
-    #t14.{core::List::addAll}(iterableIntList){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(intList){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(numList1){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(numList2){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList2){(core::Iterable<core::num*>*) →* void};
   } =>#t14;
   self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list2);
   core::List<core::int*>* list3 = block {
@@ -65,43 +65,43 @@
     if(!(#t20 == null))
       for (final dynamic #t21 in #t20) {
         final core::int* #t22 = #t21 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t22){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t22){(core::int*) →* void};
       }
     final core::Iterable<dynamic>* #t23 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
     if(!(#t23 == null))
       for (final dynamic #t24 in #t23) {
         final core::int* #t25 = #t24 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t25){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t25){(core::int*) →* void};
       }
     final core::Iterable<core::int*>* #t26 = iterableIntList;
     if(!(#t26 == null))
-      #t19.{core::List::addAll}(#t26){(core::Iterable<core::int*>*) →* void};
+      #t19.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t27 = iterableNumList1;
     if(!(#t27 == null))
       for (final dynamic #t28 in #t27) {
         final core::int* #t29 = #t28 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t29){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t29){(core::int*) →* void};
       }
     final core::Iterable<dynamic>* #t30 = iterableNumList2;
     if(!(#t30 == null))
       for (final dynamic #t31 in #t30) {
         final core::int* #t32 = #t31 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t32){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t32){(core::int*) →* void};
       }
     final core::Iterable<core::int*>* #t33 = intList;
     if(!(#t33 == null))
-      #t19.{core::List::addAll}(#t33){(core::Iterable<core::int*>*) →* void};
+      #t19.{core::List::addAll}{Invariant}(#t33){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t34 = numList1;
     if(!(#t34 == null))
       for (final dynamic #t35 in #t34) {
         final core::int* #t36 = #t35 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t36){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t36){(core::int*) →* void};
       }
     final core::Iterable<dynamic>* #t37 = numList2;
     if(!(#t37 == null))
       for (final dynamic #t38 in #t37) {
         final core::int* #t39 = #t38 as{TypeError} core::int*;
-        #t19.{core::List::add}(#t39){(core::int*) →* void};
+        #t19.{core::List::add}{Invariant}(#t39){(core::int*) →* void};
       }
   } =>#t19;
   self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list3);
@@ -111,32 +111,32 @@
     if(!(#t41 == null))
       for (final dynamic #t42 in #t41) {
         final core::num* #t43 = #t42 as{TypeError} core::num*;
-        #t40.{core::List::add}(#t43){(core::num*) →* void};
+        #t40.{core::List::add}{Invariant}(#t43){(core::num*) →* void};
       }
     final core::Iterable<dynamic>* #t44 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
     if(!(#t44 == null))
       for (final dynamic #t45 in #t44) {
         final core::num* #t46 = #t45 as{TypeError} core::num*;
-        #t40.{core::List::add}(#t46){(core::num*) →* void};
+        #t40.{core::List::add}{Invariant}(#t46){(core::num*) →* void};
       }
     final core::Iterable<core::num*>* #t47 = iterableIntList;
     if(!(#t47 == null))
-      #t40.{core::List::addAll}(#t47){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t47){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t48 = iterableNumList1;
     if(!(#t48 == null))
-      #t40.{core::List::addAll}(#t48){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t48){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t49 = iterableNumList2;
     if(!(#t49 == null))
-      #t40.{core::List::addAll}(#t49){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t49){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t50 = intList;
     if(!(#t50 == null))
-      #t40.{core::List::addAll}(#t50){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t50){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t51 = numList1;
     if(!(#t51 == null))
-      #t40.{core::List::addAll}(#t51){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t51){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t52 = numList2;
     if(!(#t52 == null))
-      #t40.{core::List::addAll}(#t52){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t52){(core::Iterable<core::num*>*) →* void};
   } =>#t40;
   self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list4);
 }
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.transformed.expect
index cc8f344..92a2f2a 100644
--- a/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t3 = #t2 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t3){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
         }
       }
     }
@@ -29,18 +29,18 @@
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t5 = #t4 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t5){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
         }
       }
     }
-    #t1.{core::List::addAll}(iterableIntList){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = iterableNumList1.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t6 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t7 = #t6 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t7){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t7){(core::int*) →* void};
         }
       }
     }
@@ -50,18 +50,18 @@
         final dynamic #t8 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t9 = #t8 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t9){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t9){(core::int*) →* void};
         }
       }
     }
-    #t1.{core::List::addAll}(intList){(core::Iterable<core::int*>*) →* void};
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = numList1.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t11 = #t10 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t11){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
         }
       }
     }
@@ -71,7 +71,7 @@
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t13 = #t12 as{TypeError} core::int*;
-          #t1.{core::List::add}(#t13){(core::int*) →* void};
+          #t1.{core::List::add}{Invariant}(#t13){(core::int*) →* void};
         }
       }
     }
@@ -85,7 +85,7 @@
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t16 = #t15 as{TypeError} core::num*;
-          #t14.{core::List::add}(#t16){(core::num*) →* void};
+          #t14.{core::List::add}{Invariant}(#t16){(core::num*) →* void};
         }
       }
     }
@@ -95,16 +95,16 @@
         final dynamic #t17 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t18 = #t17 as{TypeError} core::num*;
-          #t14.{core::List::add}(#t18){(core::num*) →* void};
+          #t14.{core::List::add}{Invariant}(#t18){(core::num*) →* void};
         }
       }
     }
-    #t14.{core::List::addAll}(iterableIntList){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(intList){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(numList1){(core::Iterable<core::num*>*) →* void};
-    #t14.{core::List::addAll}(numList2){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList2){(core::Iterable<core::num*>*) →* void};
   } =>#t14;
   self::expect(core::_GrowableList::generate<core::num*>(24, (core::int* i) → core::int* => i), list2);
   core::List<core::int*>* list3 = block {
@@ -116,7 +116,7 @@
         final dynamic #t21 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t22 = #t21 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t22){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t22){(core::int*) →* void};
         }
       }
     }
@@ -127,13 +127,13 @@
         final dynamic #t24 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t25 = #t24 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t25){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t25){(core::int*) →* void};
         }
       }
     }
     final core::Iterable<core::int*>* #t26 = iterableIntList;
     if(!(#t26 == null))
-      #t19.{core::List::addAll}(#t26){(core::Iterable<core::int*>*) →* void};
+      #t19.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t27 = iterableNumList1;
     if(!(#t27 == null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t27.{core::Iterable::iterator}{core::Iterator<dynamic>*};
@@ -141,7 +141,7 @@
         final dynamic #t28 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t29 = #t28 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t29){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t29){(core::int*) →* void};
         }
       }
     }
@@ -152,13 +152,13 @@
         final dynamic #t31 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t32 = #t31 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t32){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t32){(core::int*) →* void};
         }
       }
     }
     final core::Iterable<core::int*>* #t33 = intList;
     if(!(#t33 == null))
-      #t19.{core::List::addAll}(#t33){(core::Iterable<core::int*>*) →* void};
+      #t19.{core::List::addAll}{Invariant}(#t33){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t34 = numList1;
     if(!(#t34 == null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t34.{core::Iterable::iterator}{core::Iterator<dynamic>*};
@@ -166,7 +166,7 @@
         final dynamic #t35 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t36 = #t35 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t36){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t36){(core::int*) →* void};
         }
       }
     }
@@ -177,7 +177,7 @@
         final dynamic #t38 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t39 = #t38 as{TypeError} core::int*;
-          #t19.{core::List::add}(#t39){(core::int*) →* void};
+          #t19.{core::List::add}{Invariant}(#t39){(core::int*) →* void};
         }
       }
     }
@@ -192,7 +192,7 @@
         final dynamic #t42 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t43 = #t42 as{TypeError} core::num*;
-          #t40.{core::List::add}(#t43){(core::num*) →* void};
+          #t40.{core::List::add}{Invariant}(#t43){(core::num*) →* void};
         }
       }
     }
@@ -203,28 +203,28 @@
         final dynamic #t45 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t46 = #t45 as{TypeError} core::num*;
-          #t40.{core::List::add}(#t46){(core::num*) →* void};
+          #t40.{core::List::add}{Invariant}(#t46){(core::num*) →* void};
         }
       }
     }
     final core::Iterable<core::num*>* #t47 = iterableIntList;
     if(!(#t47 == null))
-      #t40.{core::List::addAll}(#t47){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t47){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t48 = iterableNumList1;
     if(!(#t48 == null))
-      #t40.{core::List::addAll}(#t48){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t48){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t49 = iterableNumList2;
     if(!(#t49 == null))
-      #t40.{core::List::addAll}(#t49){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t49){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t50 = intList;
     if(!(#t50 == null))
-      #t40.{core::List::addAll}(#t50){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t50){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t51 = numList1;
     if(!(#t51 == null))
-      #t40.{core::List::addAll}(#t51){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t51){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t52 = numList2;
     if(!(#t52 == null))
-      #t40.{core::List::addAll}(#t52){(core::Iterable<core::num*>*) →* void};
+      #t40.{core::List::addAll}{Invariant}(#t52){(core::Iterable<core::num*>*) →* void};
   } =>#t40;
   self::expect(core::_GrowableList::generate<core::num*>(24, (core::int* i) → core::int* => i), list4);
 }
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.expect b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.expect
index f5d6b5f..c6f63bf 100644
--- a/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.expect
@@ -12,36 +12,36 @@
     final core::List<core::int> #t1 = <core::int>[];
     for (final dynamic #t2 in dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::List::add}(#t3){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(#t3){(core::int) → void};
     }
     for (final dynamic #t4 in dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t5 = #t4 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::List::add}(#t5){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(#t5){(core::int) → void};
     }
     for (final dynamic #t6 in dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t7 = #t6 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::List::add}(#t7){(core::int) → void};
+      #t1.{core::List::add}{Invariant}(#t7){(core::int) → void};
     }
-    #t1.{core::List::addAll}(iterableIntList){(core::Iterable<core::int>) → void};
-    #t1.{core::List::addAll}(intList){(core::Iterable<core::int>) → void};
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int>) → void};
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int>) → void};
   } =>#t1;
   self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i), list1);
   core::List<core::num> list2 = block {
     final core::List<core::num> #t8 = <core::num>[];
     for (final dynamic #t9 in dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::num;
-      #t8.{core::List::add}(#t10){(core::num) → void};
+      #t8.{core::List::add}{Invariant}(#t10){(core::num) → void};
     }
     for (final dynamic #t11 in dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::num;
-      #t8.{core::List::add}(#t12){(core::num) → void};
+      #t8.{core::List::add}{Invariant}(#t12){(core::num) → void};
     }
     for (final dynamic #t13 in dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::num;
-      #t8.{core::List::add}(#t14){(core::num) → void};
+      #t8.{core::List::add}{Invariant}(#t14){(core::num) → void};
     }
-    #t8.{core::List::addAll}(iterableIntList){(core::Iterable<core::num>) → void};
-    #t8.{core::List::addAll}(intList){(core::Iterable<core::num>) → void};
+    #t8.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num>) → void};
+    #t8.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num>) → void};
   } =>#t8;
   self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i), list2);
 }
@@ -57,26 +57,26 @@
     if(!(#t16 == null))
       for (final dynamic #t17 in #t16{core::Iterable<dynamic>}) {
         final core::int #t18 = #t17 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::List::add}(#t18){(core::int) → void};
+        #t15.{core::List::add}{Invariant}(#t18){(core::int) → void};
       }
     final core::Iterable<dynamic>? #t19 = dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t19 == null))
       for (final dynamic #t20 in #t19{core::Iterable<dynamic>}) {
         final core::int #t21 = #t20 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::List::add}(#t21){(core::int) → void};
+        #t15.{core::List::add}{Invariant}(#t21){(core::int) → void};
       }
     final core::Iterable<dynamic>? #t22 = dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t22 == null))
       for (final dynamic #t23 in #t22{core::Iterable<dynamic>}) {
         final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::List::add}(#t24){(core::int) → void};
+        #t15.{core::List::add}{Invariant}(#t24){(core::int) → void};
       }
     final core::Iterable<core::int>? #t25 = iterableIntList;
     if(!(#t25 == null))
-      #t15.{core::List::addAll}(#t25{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t15.{core::List::addAll}{Invariant}(#t25{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
     final core::Iterable<core::int>? #t26 = intList;
     if(!(#t26 == null))
-      #t15.{core::List::addAll}(#t26{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t15.{core::List::addAll}{Invariant}(#t26{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t15;
   self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i), list1);
   core::List<core::num> list2 = block {
@@ -85,26 +85,26 @@
     if(!(#t28 == null))
       for (final dynamic #t29 in #t28{core::Iterable<dynamic>}) {
         final core::num #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::num;
-        #t27.{core::List::add}(#t30){(core::num) → void};
+        #t27.{core::List::add}{Invariant}(#t30){(core::num) → void};
       }
     final core::Iterable<dynamic>? #t31 = dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t31 == null))
       for (final dynamic #t32 in #t31{core::Iterable<dynamic>}) {
         final core::num #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::num;
-        #t27.{core::List::add}(#t33){(core::num) → void};
+        #t27.{core::List::add}{Invariant}(#t33){(core::num) → void};
       }
     final core::Iterable<dynamic>? #t34 = dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t34 == null))
       for (final dynamic #t35 in #t34{core::Iterable<dynamic>}) {
         final core::num #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::num;
-        #t27.{core::List::add}(#t36){(core::num) → void};
+        #t27.{core::List::add}{Invariant}(#t36){(core::num) → void};
       }
     final core::Iterable<core::num>? #t37 = iterableIntList;
     if(!(#t37 == null))
-      #t27.{core::List::addAll}(#t37{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t27.{core::List::addAll}{Invariant}(#t37{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
     final core::Iterable<core::num>? #t38 = intList;
     if(!(#t38 == null))
-      #t27.{core::List::addAll}(#t38{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t27.{core::List::addAll}{Invariant}(#t38{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
   } =>#t27;
   self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i), list2);
 }
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.transformed.expect
index 441c8f3..9fbd382 100644
--- a/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.transformed.expect
@@ -16,7 +16,7 @@
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-          #t1.{core::List::add}(#t3){(core::int) → void};
+          #t1.{core::List::add}{Invariant}(#t3){(core::int) → void};
         }
       }
     }
@@ -26,7 +26,7 @@
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t5 = #t4 as{TypeError,ForNonNullableByDefault} core::int;
-          #t1.{core::List::add}(#t5){(core::int) → void};
+          #t1.{core::List::add}{Invariant}(#t5){(core::int) → void};
         }
       }
     }
@@ -36,12 +36,12 @@
         final dynamic #t6 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t7 = #t6 as{TypeError,ForNonNullableByDefault} core::int;
-          #t1.{core::List::add}(#t7){(core::int) → void};
+          #t1.{core::List::add}{Invariant}(#t7){(core::int) → void};
         }
       }
     }
-    #t1.{core::List::addAll}(iterableIntList){(core::Iterable<core::int>) → void};
-    #t1.{core::List::addAll}(intList){(core::Iterable<core::int>) → void};
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int>) → void};
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int>) → void};
   } =>#t1;
   self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i), list1);
   core::List<core::num> list2 = block {
@@ -52,7 +52,7 @@
         final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::num;
-          #t8.{core::List::add}(#t10){(core::num) → void};
+          #t8.{core::List::add}{Invariant}(#t10){(core::num) → void};
         }
       }
     }
@@ -62,7 +62,7 @@
         final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::num;
-          #t8.{core::List::add}(#t12){(core::num) → void};
+          #t8.{core::List::add}{Invariant}(#t12){(core::num) → void};
         }
       }
     }
@@ -72,12 +72,12 @@
         final dynamic #t13 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::num;
-          #t8.{core::List::add}(#t14){(core::num) → void};
+          #t8.{core::List::add}{Invariant}(#t14){(core::num) → void};
         }
       }
     }
-    #t8.{core::List::addAll}(iterableIntList){(core::Iterable<core::num>) → void};
-    #t8.{core::List::addAll}(intList){(core::Iterable<core::num>) → void};
+    #t8.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num>) → void};
+    #t8.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num>) → void};
   } =>#t8;
   self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i), list2);
 }
@@ -96,7 +96,7 @@
         final dynamic #t17 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t18 = #t17 as{TypeError,ForNonNullableByDefault} core::int;
-          #t15.{core::List::add}(#t18){(core::int) → void};
+          #t15.{core::List::add}{Invariant}(#t18){(core::int) → void};
         }
       }
     }
@@ -107,7 +107,7 @@
         final dynamic #t20 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t21 = #t20 as{TypeError,ForNonNullableByDefault} core::int;
-          #t15.{core::List::add}(#t21){(core::int) → void};
+          #t15.{core::List::add}{Invariant}(#t21){(core::int) → void};
         }
       }
     }
@@ -118,16 +118,16 @@
         final dynamic #t23 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-          #t15.{core::List::add}(#t24){(core::int) → void};
+          #t15.{core::List::add}{Invariant}(#t24){(core::int) → void};
         }
       }
     }
     final core::Iterable<core::int>? #t25 = iterableIntList;
     if(!(#t25 == null))
-      #t15.{core::List::addAll}(#t25{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t15.{core::List::addAll}{Invariant}(#t25{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
     final core::Iterable<core::int>? #t26 = intList;
     if(!(#t26 == null))
-      #t15.{core::List::addAll}(#t26{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t15.{core::List::addAll}{Invariant}(#t26{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t15;
   self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i), list1);
   core::List<core::num> list2 = block {
@@ -139,7 +139,7 @@
         final dynamic #t29 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::num;
-          #t27.{core::List::add}(#t30){(core::num) → void};
+          #t27.{core::List::add}{Invariant}(#t30){(core::num) → void};
         }
       }
     }
@@ -150,7 +150,7 @@
         final dynamic #t32 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::num;
-          #t27.{core::List::add}(#t33){(core::num) → void};
+          #t27.{core::List::add}{Invariant}(#t33){(core::num) → void};
         }
       }
     }
@@ -161,16 +161,16 @@
         final dynamic #t35 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::num;
-          #t27.{core::List::add}(#t36){(core::num) → void};
+          #t27.{core::List::add}{Invariant}(#t36){(core::num) → void};
         }
       }
     }
     final core::Iterable<core::num>? #t37 = iterableIntList;
     if(!(#t37 == null))
-      #t27.{core::List::addAll}(#t37{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t27.{core::List::addAll}{Invariant}(#t37{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
     final core::Iterable<core::num>? #t38 = intList;
     if(!(#t38 == null))
-      #t27.{core::List::addAll}(#t38{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t27.{core::List::addAll}{Invariant}(#t38{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
   } =>#t27;
   self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i), list2);
 }
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.expect
index b90b3064..a1e49d5 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.expect
@@ -47,104 +47,104 @@
 static field core::Map<dynamic, dynamic>* map1 = block {
   final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
   if(self::b)
-    #t1.{core::Map::[]=}(0, 1){(dynamic, dynamic) →* void};
+    #t1.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
   else
     for (final core::MapEntry<dynamic, dynamic>* #t2 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
 } =>#t1;
 static field core::Map<dynamic, dynamic>* map2 = block {
   final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
   if(self::b)
     for (final core::MapEntry<dynamic, dynamic>* #t4 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
   else
-    #t3.{core::Map::[]=}(0, 1){(dynamic, dynamic) →* void};
+    #t3.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
 } =>#t3;
 static field core::Map<dynamic, dynamic>* map3 = block {
   final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
   if(self::b)
     for (final core::MapEntry<dynamic, dynamic>* #t6 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
   else
     for (final core::MapEntry<dynamic, dynamic>* #t7 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
-      #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
 } =>#t5;
 static field core::Map<dynamic, core::int*>* map4 = block {
   final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
   if(self::b)
-    #t8.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t8.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (dynamic a in self::list)
-      #t8.{core::Map::[]=}(a, 1){(dynamic, core::int*) →* void};
+      #t8.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
 } =>#t8;
 static field core::Map<dynamic, core::int*>* map5 = block {
   final core::Map<dynamic, core::int*>* #t9 = <dynamic, core::int*>{};
   if(self::b)
     for (dynamic a in self::list)
-      #t9.{core::Map::[]=}(a, 1){(dynamic, core::int*) →* void};
+      #t9.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
   else
-    #t9.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t9.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t9;
 static field core::Map<dynamic, core::int*>* map6 = block {
   final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
   if(self::b)
-    #t10.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t10.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (dynamic a in self::list)
       for (final core::MapEntry<dynamic, core::int*>* #t11 in <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
 } =>#t10;
 static field core::Map<dynamic, core::int*>* map7 = block {
   final core::Map<dynamic, core::int*>* #t12 = <dynamic, core::int*>{};
   if(self::b)
     for (dynamic a in self::list)
       for (final core::MapEntry<dynamic, core::int*>* #t13 in <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
   else
-    #t12.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t12;
 static field core::Map<dynamic, core::int*>* map8 = block {
   final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
   if(self::b)
-    #t14.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t14.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t14.{core::Map::[]=}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
 } =>#t14;
 static field core::Map<dynamic, core::int*>* map9 = block {
   final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t15.{core::Map::[]=}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
   else
-    #t15.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t15.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t15;
 static field core::Map<dynamic, core::int*>* map10 = block {
   final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
   if(self::b)
-    #t16.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t16.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<dynamic, core::int*>* #t17 in <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
 } =>#t16;
 static field core::Map<dynamic, core::int*>* map11 = block {
   final core::Map<dynamic, core::int*>* #t18 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
       for (final core::MapEntry<dynamic, core::int*>* #t19 in <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
   else
-    #t18.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t18.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t18;
 static field core::Map<core::int*, core::int*>* map12 = block {
   final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
   if(self::b)
-    #t20.{core::Map::[]=}(0, 1){(core::int*, core::int*) →* void};
+    #t20.{core::Map::[]=}{Invariant}(0, 1){(core::int*, core::int*) →* void};
   else
     if(self::b)
       for (final core::MapEntry<core::int*, core::int*>* #t21 in <core::int*, core::int*>{0: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}{core::int*}, #t21.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::int*}, #t21.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
 } =>#t20;
 static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.transformed.expect
index 2becbbe..cf02136 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.transformed.expect
@@ -47,12 +47,12 @@
 static field core::Map<dynamic, dynamic>* map1 = block {
   final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
   if(self::b)
-    #t1.{core::Map::[]=}(0, 1){(dynamic, dynamic) →* void};
+    #t1.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
   else {
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic>* #t2 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
     }
   }
 } =>#t1;
@@ -62,11 +62,11 @@
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic>* #t4 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
     }
   }
   else
-    #t3.{core::Map::[]=}(0, 1){(dynamic, dynamic) →* void};
+    #t3.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
 } =>#t3;
 static field core::Map<dynamic, dynamic>* map3 = block {
   final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
@@ -74,26 +74,26 @@
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
     }
   }
   else {
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, dynamic>>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       final core::MapEntry<dynamic, dynamic>* #t7 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, dynamic>};
-      #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
     }
   }
 } =>#t5;
 static field core::Map<dynamic, core::int*>* map4 = block {
   final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
   if(self::b)
-    #t8.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t8.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else {
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator}{core::Iterator<dynamic>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       dynamic a = :sync-for-iterator.{core::Iterator::current}{dynamic};
-      #t8.{core::Map::[]=}(a, 1){(dynamic, core::int*) →* void};
+      #t8.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
     }
   }
 } =>#t8;
@@ -103,16 +103,16 @@
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator}{core::Iterator<dynamic>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
       dynamic a = :sync-for-iterator.{core::Iterator::current}{dynamic};
-      #t9.{core::Map::[]=}(a, 1){(dynamic, core::int*) →* void};
+      #t9.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
     }
   }
   else
-    #t9.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t9.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t9;
 static field core::Map<dynamic, core::int*>* map6 = block {
   final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
   if(self::b)
-    #t10.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t10.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else {
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator}{core::Iterator<dynamic>*};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
@@ -121,7 +121,7 @@
         core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, core::int*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<dynamic, core::int*>* #t11 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, core::int*>};
-          #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+          #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
         }
       }
     }
@@ -137,40 +137,40 @@
         core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, core::int*>>*};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::MapEntry<dynamic, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, core::int*>};
-          #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+          #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
         }
       }
     }
   }
   else
-    #t12.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t12;
 static field core::Map<dynamic, core::int*>* map8 = block {
   final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
   if(self::b)
-    #t14.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t14.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t14.{core::Map::[]=}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
 } =>#t14;
 static field core::Map<dynamic, core::int*>* map9 = block {
   final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
-      #t15.{core::Map::[]=}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
   else
-    #t15.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t15.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t15;
 static field core::Map<dynamic, core::int*>* map10 = block {
   final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
   if(self::b)
-    #t16.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t16.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
       core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, core::int*>};
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
       }
     }
 } =>#t16;
@@ -181,22 +181,22 @@
       core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<dynamic, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<dynamic, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<dynamic, core::int*>};
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
       }
     }
   else
-    #t18.{core::Map::[]=}(0, 1){(dynamic, core::int*) →* void};
+    #t18.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
 } =>#t18;
 static field core::Map<core::int*, core::int*>* map12 = block {
   final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
   if(self::b)
-    #t20.{core::Map::[]=}(0, 1){(core::int*, core::int*) →* void};
+    #t20.{core::Map::[]=}{Invariant}(0, 1){(core::int*, core::int*) →* void};
   else
     if(self::b) {
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{0: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}.{core::Iterable::iterator}{core::Iterator<core::MapEntry<core::int*, core::int*>>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::MapEntry<core::int*, core::int*>* #t21 = :sync-for-iterator.{core::Iterator::current}{core::MapEntry<core::int*, core::int*>};
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}{core::int*}, #t21.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::int*}, #t21.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
       }
     }
 } =>#t20;
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.expect b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.expect
index d99b951..5fe44fb 100644
--- a/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.expect
@@ -7,79 +7,79 @@
 static method useAddAll() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
-    #t1.{core::Set::add}(0){(core::int*) →* core::bool*};
-    #t1.{core::Set::add}(1){(core::int*) →* core::bool*};
-    #t1.{core::Set::add}(2){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
   } =>#t1;
   dynamic dynamicSet2 = block {
     final core::Set<core::num*>* #t2 = col::LinkedHashSet::•<core::num*>();
-    #t2.{core::Set::add}(3){(core::num*) →* core::bool*};
-    #t2.{core::Set::add}(4){(core::num*) →* core::bool*};
-    #t2.{core::Set::add}(5){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(3){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::num*) →* core::bool*};
   } =>#t2;
   core::Iterable<core::int*>* iterableIntSet = block {
     final core::Set<core::int*>* #t3 = col::LinkedHashSet::•<core::int*>();
-    #t3.{core::Set::add}(6){(core::int*) →* core::bool*};
-    #t3.{core::Set::add}(7){(core::int*) →* core::bool*};
-    #t3.{core::Set::add}(8){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(7){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(8){(core::int*) →* core::bool*};
   } =>#t3;
   core::Iterable<core::num*>* iterableNumSet1 = block {
     final core::Set<core::int*>* #t4 = col::LinkedHashSet::•<core::int*>();
-    #t4.{core::Set::add}(9){(core::int*) →* core::bool*};
-    #t4.{core::Set::add}(10){(core::int*) →* core::bool*};
-    #t4.{core::Set::add}(11){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(9){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(10){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(11){(core::int*) →* core::bool*};
   } =>#t4;
   core::Iterable<core::num*>* iterableNumSet2 = block {
     final core::Set<core::num*>* #t5 = col::LinkedHashSet::•<core::num*>();
-    #t5.{core::Set::add}(12){(core::num*) →* core::bool*};
-    #t5.{core::Set::add}(13){(core::num*) →* core::bool*};
-    #t5.{core::Set::add}(14){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(12){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(13){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(14){(core::num*) →* core::bool*};
   } =>#t5;
   core::Set<core::int*>* intSet = block {
     final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
-    #t6.{core::Set::add}(15){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(16){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(17){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(15){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(16){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(17){(core::int*) →* core::bool*};
   } =>#t6;
   core::Set<core::num*>* numSet1 = block {
     final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(18){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(19){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(20){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(18){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(19){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(20){(core::int*) →* core::bool*};
   } =>#t7;
   core::Set<core::num*>* numSet2 = block {
     final core::Set<core::num*>* #t8 = col::LinkedHashSet::•<core::num*>();
-    #t8.{core::Set::add}(21){(core::num*) →* core::bool*};
-    #t8.{core::Set::add}(22){(core::num*) →* core::bool*};
-    #t8.{core::Set::add}(23){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(21){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(22){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(23){(core::num*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set1 = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t10 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t11 = #t10 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
     }
     for (final dynamic #t12 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::int* #t13 = #t12 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t13){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
     }
-    #t9.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t14 in iterableNumSet1) {
       final core::int* #t15 = #t14 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t15){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t15){(core::int*) →* core::bool*};
     }
     for (final dynamic #t16 in iterableNumSet2) {
       final core::int* #t17 = #t16 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t17){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t17){(core::int*) →* core::bool*};
     }
-    #t9.{core::Set::addAll}(intSet){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int*>*) →* void};
     for (final dynamic #t18 in numSet1) {
       final core::int* #t19 = #t18 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t19){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t19){(core::int*) →* core::bool*};
     }
     for (final dynamic #t20 in numSet2) {
       final core::int* #t21 = #t20 as{TypeError} core::int*;
-      #t9.{core::Set::add}(#t21){(core::int*) →* core::bool*};
+      #t9.{core::Set::add}{Invariant}(#t21){(core::int*) →* core::bool*};
     }
   } =>#t9;
   self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set1);
@@ -87,18 +87,18 @@
     final core::Set<core::num*>* #t22 = col::LinkedHashSet::•<core::num*>();
     for (final dynamic #t23 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::num* #t24 = #t23 as{TypeError} core::num*;
-      #t22.{core::Set::add}(#t24){(core::num*) →* core::bool*};
+      #t22.{core::Set::add}{Invariant}(#t24){(core::num*) →* core::bool*};
     }
     for (final dynamic #t25 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
       final core::num* #t26 = #t25 as{TypeError} core::num*;
-      #t22.{core::Set::add}(#t26){(core::num*) →* core::bool*};
+      #t22.{core::Set::add}{Invariant}(#t26){(core::num*) →* core::bool*};
     }
-    #t22.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(intSet){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(numSet1){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(numSet2){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet2){(core::Iterable<core::num*>*) →* void};
   } =>#t22;
   self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set2);
   core::Set<core::int*>* set3 = block {
@@ -107,43 +107,43 @@
     if(!(#t28 == null))
       for (final dynamic #t29 in #t28) {
         final core::int* #t30 = #t29 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t30){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t30){(core::int*) →* core::bool*};
       }
     final core::Iterable<dynamic>* #t31 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
     if(!(#t31 == null))
       for (final dynamic #t32 in #t31) {
         final core::int* #t33 = #t32 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t33){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t33){(core::int*) →* core::bool*};
       }
     final core::Iterable<core::int*>* #t34 = iterableIntSet;
     if(!(#t34 == null))
-      #t27.{core::Set::addAll}(#t34){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t34){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t35 = iterableNumSet1;
     if(!(#t35 == null))
       for (final dynamic #t36 in #t35) {
         final core::int* #t37 = #t36 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t37){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t37){(core::int*) →* core::bool*};
       }
     final core::Iterable<dynamic>* #t38 = iterableNumSet2;
     if(!(#t38 == null))
       for (final dynamic #t39 in #t38) {
         final core::int* #t40 = #t39 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t40){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t40){(core::int*) →* core::bool*};
       }
     final core::Iterable<core::int*>* #t41 = intSet;
     if(!(#t41 == null))
-      #t27.{core::Set::addAll}(#t41){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t41){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t42 = numSet1;
     if(!(#t42 == null))
       for (final dynamic #t43 in #t42) {
         final core::int* #t44 = #t43 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t44){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t44){(core::int*) →* core::bool*};
       }
     final core::Iterable<dynamic>* #t45 = numSet2;
     if(!(#t45 == null))
       for (final dynamic #t46 in #t45) {
         final core::int* #t47 = #t46 as{TypeError} core::int*;
-        #t27.{core::Set::add}(#t47){(core::int*) →* core::bool*};
+        #t27.{core::Set::add}{Invariant}(#t47){(core::int*) →* core::bool*};
       }
   } =>#t27;
   self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set3);
@@ -153,32 +153,32 @@
     if(!(#t49 == null))
       for (final dynamic #t50 in #t49) {
         final core::num* #t51 = #t50 as{TypeError} core::num*;
-        #t48.{core::Set::add}(#t51){(core::num*) →* core::bool*};
+        #t48.{core::Set::add}{Invariant}(#t51){(core::num*) →* core::bool*};
       }
     final core::Iterable<dynamic>* #t52 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
     if(!(#t52 == null))
       for (final dynamic #t53 in #t52) {
         final core::num* #t54 = #t53 as{TypeError} core::num*;
-        #t48.{core::Set::add}(#t54){(core::num*) →* core::bool*};
+        #t48.{core::Set::add}{Invariant}(#t54){(core::num*) →* core::bool*};
       }
     final core::Iterable<core::num*>* #t55 = iterableIntSet;
     if(!(#t55 == null))
-      #t48.{core::Set::addAll}(#t55){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t55){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t56 = iterableNumSet1;
     if(!(#t56 == null))
-      #t48.{core::Set::addAll}(#t56){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t56){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t57 = iterableNumSet2;
     if(!(#t57 == null))
-      #t48.{core::Set::addAll}(#t57){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t57){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t58 = intSet;
     if(!(#t58 == null))
-      #t48.{core::Set::addAll}(#t58){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t59 = numSet1;
     if(!(#t59 == null))
-      #t48.{core::Set::addAll}(#t59){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t59){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t60 = numSet2;
     if(!(#t60 == null))
-      #t48.{core::Set::addAll}(#t60){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t60){(core::Iterable<core::num*>*) →* void};
   } =>#t48;
   self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set4);
 }
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.transformed.expect
index 1623845..be03a2d 100644
--- a/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.transformed.expect
@@ -7,51 +7,51 @@
 static method useAddAll() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t1.{core::Set::add}(0){(core::int*) →* core::bool*};
-    #t1.{core::Set::add}(1){(core::int*) →* core::bool*};
-    #t1.{core::Set::add}(2){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
   } =>#t1;
   dynamic dynamicSet2 = block {
     final core::Set<core::num*>* #t2 = new col::_CompactLinkedHashSet::•<core::num*>();
-    #t2.{core::Set::add}(3){(core::num*) →* core::bool*};
-    #t2.{core::Set::add}(4){(core::num*) →* core::bool*};
-    #t2.{core::Set::add}(5){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(3){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::num*) →* core::bool*};
   } =>#t2;
   core::Iterable<core::int*>* iterableIntSet = block {
     final core::Set<core::int*>* #t3 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t3.{core::Set::add}(6){(core::int*) →* core::bool*};
-    #t3.{core::Set::add}(7){(core::int*) →* core::bool*};
-    #t3.{core::Set::add}(8){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(7){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(8){(core::int*) →* core::bool*};
   } =>#t3;
   core::Iterable<core::num*>* iterableNumSet1 = block {
     final core::Set<core::int*>* #t4 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t4.{core::Set::add}(9){(core::int*) →* core::bool*};
-    #t4.{core::Set::add}(10){(core::int*) →* core::bool*};
-    #t4.{core::Set::add}(11){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(9){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(10){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(11){(core::int*) →* core::bool*};
   } =>#t4;
   core::Iterable<core::num*>* iterableNumSet2 = block {
     final core::Set<core::num*>* #t5 = new col::_CompactLinkedHashSet::•<core::num*>();
-    #t5.{core::Set::add}(12){(core::num*) →* core::bool*};
-    #t5.{core::Set::add}(13){(core::num*) →* core::bool*};
-    #t5.{core::Set::add}(14){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(12){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(13){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(14){(core::num*) →* core::bool*};
   } =>#t5;
   core::Set<core::int*>* intSet = block {
     final core::Set<core::int*>* #t6 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t6.{core::Set::add}(15){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(16){(core::int*) →* core::bool*};
-    #t6.{core::Set::add}(17){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(15){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(16){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(17){(core::int*) →* core::bool*};
   } =>#t6;
   core::Set<core::num*>* numSet1 = block {
     final core::Set<core::int*>* #t7 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t7.{core::Set::add}(18){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(19){(core::int*) →* core::bool*};
-    #t7.{core::Set::add}(20){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(18){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(19){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(20){(core::int*) →* core::bool*};
   } =>#t7;
   core::Set<core::num*>* numSet2 = block {
     final core::Set<core::num*>* #t8 = new col::_CompactLinkedHashSet::•<core::num*>();
-    #t8.{core::Set::add}(21){(core::num*) →* core::bool*};
-    #t8.{core::Set::add}(22){(core::num*) →* core::bool*};
-    #t8.{core::Set::add}(23){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(21){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(22){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(23){(core::num*) →* core::bool*};
   } =>#t8;
   core::Set<core::int*>* set1 = block {
     final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -61,7 +61,7 @@
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t11 = #t10 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t11){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
         }
       }
     }
@@ -71,18 +71,18 @@
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t13 = #t12 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t13){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
         }
       }
     }
-    #t9.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = iterableNumSet1.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t15 = #t14 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t15){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t15){(core::int*) →* core::bool*};
         }
       }
     }
@@ -92,18 +92,18 @@
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t17 = #t16 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t17){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t17){(core::int*) →* core::bool*};
         }
       }
     }
-    #t9.{core::Set::addAll}(intSet){(core::Iterable<core::int*>*) →* void};
+    #t9.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int*>*) →* void};
     {
       core::Iterator<core::num*>* :sync-for-iterator = numSet1.{core::Iterable::iterator}{core::Iterator<core::num*>*};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t18 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t19 = #t18 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t19){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t19){(core::int*) →* core::bool*};
         }
       }
     }
@@ -113,7 +113,7 @@
         final dynamic #t20 = :sync-for-iterator.{core::Iterator::current}{core::num*};
         {
           final core::int* #t21 = #t20 as{TypeError} core::int*;
-          #t9.{core::Set::add}(#t21){(core::int*) →* core::bool*};
+          #t9.{core::Set::add}{Invariant}(#t21){(core::int*) →* core::bool*};
         }
       }
     }
@@ -127,7 +127,7 @@
         final dynamic #t23 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t24 = #t23 as{TypeError} core::num*;
-          #t22.{core::Set::add}(#t24){(core::num*) →* core::bool*};
+          #t22.{core::Set::add}{Invariant}(#t24){(core::num*) →* core::bool*};
         }
       }
     }
@@ -137,16 +137,16 @@
         final dynamic #t25 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t26 = #t25 as{TypeError} core::num*;
-          #t22.{core::Set::add}(#t26){(core::num*) →* core::bool*};
+          #t22.{core::Set::add}{Invariant}(#t26){(core::num*) →* core::bool*};
         }
       }
     }
-    #t22.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(intSet){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(numSet1){(core::Iterable<core::num*>*) →* void};
-    #t22.{core::Set::addAll}(numSet2){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet2){(core::Iterable<core::num*>*) →* void};
   } =>#t22;
   self::expect(core::_GrowableList::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set2);
   core::Set<core::int*>* set3 = block {
@@ -158,7 +158,7 @@
         final dynamic #t29 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t30 = #t29 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t30){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t30){(core::int*) →* core::bool*};
         }
       }
     }
@@ -169,13 +169,13 @@
         final dynamic #t32 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t33 = #t32 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t33){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t33){(core::int*) →* core::bool*};
         }
       }
     }
     final core::Iterable<core::int*>* #t34 = iterableIntSet;
     if(!(#t34 == null))
-      #t27.{core::Set::addAll}(#t34){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t34){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t35 = iterableNumSet1;
     if(!(#t35 == null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t35.{core::Iterable::iterator}{core::Iterator<dynamic>*};
@@ -183,7 +183,7 @@
         final dynamic #t36 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t37 = #t36 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t37){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t37){(core::int*) →* core::bool*};
         }
       }
     }
@@ -194,13 +194,13 @@
         final dynamic #t39 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t40 = #t39 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t40){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t40){(core::int*) →* core::bool*};
         }
       }
     }
     final core::Iterable<core::int*>* #t41 = intSet;
     if(!(#t41 == null))
-      #t27.{core::Set::addAll}(#t41){(core::Iterable<core::int*>*) →* void};
+      #t27.{core::Set::addAll}{Invariant}(#t41){(core::Iterable<core::int*>*) →* void};
     final core::Iterable<dynamic>* #t42 = numSet1;
     if(!(#t42 == null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t42.{core::Iterable::iterator}{core::Iterator<dynamic>*};
@@ -208,7 +208,7 @@
         final dynamic #t43 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t44 = #t43 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t44){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t44){(core::int*) →* core::bool*};
         }
       }
     }
@@ -219,7 +219,7 @@
         final dynamic #t46 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int* #t47 = #t46 as{TypeError} core::int*;
-          #t27.{core::Set::add}(#t47){(core::int*) →* core::bool*};
+          #t27.{core::Set::add}{Invariant}(#t47){(core::int*) →* core::bool*};
         }
       }
     }
@@ -234,7 +234,7 @@
         final dynamic #t50 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t51 = #t50 as{TypeError} core::num*;
-          #t48.{core::Set::add}(#t51){(core::num*) →* core::bool*};
+          #t48.{core::Set::add}{Invariant}(#t51){(core::num*) →* core::bool*};
         }
       }
     }
@@ -245,28 +245,28 @@
         final dynamic #t53 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num* #t54 = #t53 as{TypeError} core::num*;
-          #t48.{core::Set::add}(#t54){(core::num*) →* core::bool*};
+          #t48.{core::Set::add}{Invariant}(#t54){(core::num*) →* core::bool*};
         }
       }
     }
     final core::Iterable<core::num*>* #t55 = iterableIntSet;
     if(!(#t55 == null))
-      #t48.{core::Set::addAll}(#t55){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t55){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t56 = iterableNumSet1;
     if(!(#t56 == null))
-      #t48.{core::Set::addAll}(#t56){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t56){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t57 = iterableNumSet2;
     if(!(#t57 == null))
-      #t48.{core::Set::addAll}(#t57){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t57){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t58 = intSet;
     if(!(#t58 == null))
-      #t48.{core::Set::addAll}(#t58){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t59 = numSet1;
     if(!(#t59 == null))
-      #t48.{core::Set::addAll}(#t59){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t59){(core::Iterable<core::num*>*) →* void};
     final core::Iterable<core::num*>* #t60 = numSet2;
     if(!(#t60 == null))
-      #t48.{core::Set::addAll}(#t60){(core::Iterable<core::num*>*) →* void};
+      #t48.{core::Set::addAll}{Invariant}(#t60){(core::Iterable<core::num*>*) →* void};
   } =>#t48;
   self::expect(core::_GrowableList::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set4);
 }
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.expect b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.expect
index 867c99e..4037509 100644
--- a/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.expect
@@ -7,101 +7,101 @@
 static method useAddAll() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
-    #t1.{core::Set::add}(0){(core::int) → core::bool};
-    #t1.{core::Set::add}(1){(core::int) → core::bool};
-    #t1.{core::Set::add}(2){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
   } =>#t1;
   dynamic dynamicSet2 = block {
     final core::Set<core::num> #t2 = col::LinkedHashSet::•<core::num>();
-    #t2.{core::Set::add}(3){(core::num) → core::bool};
-    #t2.{core::Set::add}(4){(core::num) → core::bool};
-    #t2.{core::Set::add}(5){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
   } =>#t2;
   dynamic dynamicSet3 = block {
     final core::Set<core::int?> #t3 = col::LinkedHashSet::•<core::int?>();
-    #t3.{core::Set::add}(6){(core::int?) → core::bool};
-    #t3.{core::Set::add}(7){(core::int?) → core::bool};
-    #t3.{core::Set::add}(8){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
   } =>#t3;
   core::Iterable<core::int> iterableIntSet = block {
     final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
-    #t4.{core::Set::add}(9){(core::int) → core::bool};
-    #t4.{core::Set::add}(10){(core::int) → core::bool};
-    #t4.{core::Set::add}(11){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
   } =>#t4;
   core::Set<core::int> intSet = block {
     final core::Set<core::int> #t5 = col::LinkedHashSet::•<core::int>();
-    #t5.{core::Set::add}(12){(core::int) → core::bool};
-    #t5.{core::Set::add}(13){(core::int) → core::bool};
-    #t5.{core::Set::add}(14){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
   } =>#t5;
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
     for (final dynamic #t7 in dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t8 = #t7 as{TypeError,ForNonNullableByDefault} core::int;
-      #t6.{core::Set::add}(#t8){(core::int) → core::bool};
+      #t6.{core::Set::add}{Invariant}(#t8){(core::int) → core::bool};
     }
     for (final dynamic #t9 in dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::int;
-      #t6.{core::Set::add}(#t10){(core::int) → core::bool};
+      #t6.{core::Set::add}{Invariant}(#t10){(core::int) → core::bool};
     }
     for (final dynamic #t11 in dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::int #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::int;
-      #t6.{core::Set::add}(#t12){(core::int) → core::bool};
+      #t6.{core::Set::add}{Invariant}(#t12){(core::int) → core::bool};
     }
-    #t6.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::int>) → void};
-    #t6.{core::Set::addAll}(intSet){(core::Iterable<core::int>) → void};
+    #t6.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int>) → void};
+    #t6.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int>) → void};
   } =>#t6;
   self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
   core::Set<core::num> set2 = block {
     final core::Set<core::num> #t13 = col::LinkedHashSet::•<core::num>();
     for (final dynamic #t14 in dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t15 = #t14 as{TypeError,ForNonNullableByDefault} core::num;
-      #t13.{core::Set::add}(#t15){(core::num) → core::bool};
+      #t13.{core::Set::add}{Invariant}(#t15){(core::num) → core::bool};
     }
     for (final dynamic #t16 in dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::num;
-      #t13.{core::Set::add}(#t17){(core::num) → core::bool};
+      #t13.{core::Set::add}{Invariant}(#t17){(core::num) → core::bool};
     }
     for (final dynamic #t18 in dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       final core::num #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::num;
-      #t13.{core::Set::add}(#t19){(core::num) → core::bool};
+      #t13.{core::Set::add}{Invariant}(#t19){(core::num) → core::bool};
     }
-    #t13.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::num>) → void};
-    #t13.{core::Set::addAll}(intSet){(core::Iterable<core::num>) → void};
+    #t13.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num>) → void};
+    #t13.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num>) → void};
   } =>#t13;
   self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
 }
 static method useAddAllNullable() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int> #t20 = col::LinkedHashSet::•<core::int>();
-    #t20.{core::Set::add}(0){(core::int) → core::bool};
-    #t20.{core::Set::add}(1){(core::int) → core::bool};
-    #t20.{core::Set::add}(2){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
   } =>#t20;
   dynamic dynamicSet2 = block {
     final core::Set<core::num> #t21 = col::LinkedHashSet::•<core::num>();
-    #t21.{core::Set::add}(3){(core::num) → core::bool};
-    #t21.{core::Set::add}(4){(core::num) → core::bool};
-    #t21.{core::Set::add}(5){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
   } =>#t21;
   dynamic dynamicSet3 = block {
     final core::Set<core::int?> #t22 = col::LinkedHashSet::•<core::int?>();
-    #t22.{core::Set::add}(6){(core::int?) → core::bool};
-    #t22.{core::Set::add}(7){(core::int?) → core::bool};
-    #t22.{core::Set::add}(8){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
   } =>#t22;
   core::Iterable<core::int>? iterableIntSet = true ?{core::Set<core::int>?} block {
     final core::Set<core::int> #t23 = col::LinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(9){(core::int) → core::bool};
-    #t23.{core::Set::add}(10){(core::int) → core::bool};
-    #t23.{core::Set::add}(11){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
   } =>#t23 : null;
   core::Set<core::int>? intSet = true ?{core::Set<core::int>?} block {
     final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
-    #t24.{core::Set::add}(12){(core::int) → core::bool};
-    #t24.{core::Set::add}(13){(core::int) → core::bool};
-    #t24.{core::Set::add}(14){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
   } =>#t24 : null;
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
@@ -109,26 +109,26 @@
     if(!(#t26 == null))
       for (final dynamic #t27 in #t26{core::Iterable<dynamic>}) {
         final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t28){(core::int) → core::bool};
+        #t25.{core::Set::add}{Invariant}(#t28){(core::int) → core::bool};
       }
     final core::Iterable<dynamic>? #t29 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t29 == null))
       for (final dynamic #t30 in #t29{core::Iterable<dynamic>}) {
         final core::int #t31 = #t30 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t31){(core::int) → core::bool};
+        #t25.{core::Set::add}{Invariant}(#t31){(core::int) → core::bool};
       }
     final core::Iterable<dynamic>? #t32 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t32 == null))
       for (final dynamic #t33 in #t32{core::Iterable<dynamic>}) {
         final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t34){(core::int) → core::bool};
+        #t25.{core::Set::add}{Invariant}(#t34){(core::int) → core::bool};
       }
     final core::Iterable<core::int>? #t35 = iterableIntSet;
     if(!(#t35 == null))
-      #t25.{core::Set::addAll}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t25.{core::Set::addAll}{Invariant}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
     final core::Iterable<core::int>? #t36 = intSet;
     if(!(#t36 == null))
-      #t25.{core::Set::addAll}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t25.{core::Set::addAll}{Invariant}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t25;
   self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
   core::Set<core::num> set2 = block {
@@ -137,26 +137,26 @@
     if(!(#t38 == null))
       for (final dynamic #t39 in #t38{core::Iterable<dynamic>}) {
         final core::num #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::num;
-        #t37.{core::Set::add}(#t40){(core::num) → core::bool};
+        #t37.{core::Set::add}{Invariant}(#t40){(core::num) → core::bool};
       }
     final core::Iterable<dynamic>? #t41 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t41 == null))
       for (final dynamic #t42 in #t41{core::Iterable<dynamic>}) {
         final core::num #t43 = #t42 as{TypeError,ForNonNullableByDefault} core::num;
-        #t37.{core::Set::add}(#t43){(core::num) → core::bool};
+        #t37.{core::Set::add}{Invariant}(#t43){(core::num) → core::bool};
       }
     final core::Iterable<dynamic>? #t44 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
     if(!(#t44 == null))
       for (final dynamic #t45 in #t44{core::Iterable<dynamic>}) {
         final core::num #t46 = #t45 as{TypeError,ForNonNullableByDefault} core::num;
-        #t37.{core::Set::add}(#t46){(core::num) → core::bool};
+        #t37.{core::Set::add}{Invariant}(#t46){(core::num) → core::bool};
       }
     final core::Iterable<core::num>? #t47 = iterableIntSet;
     if(!(#t47 == null))
-      #t37.{core::Set::addAll}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t37.{core::Set::addAll}{Invariant}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
     final core::Iterable<core::num>? #t48 = intSet;
     if(!(#t48 == null))
-      #t37.{core::Set::addAll}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t37.{core::Set::addAll}{Invariant}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
   } =>#t37;
   self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
 }
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.transformed.expect
index bc0fac7..65a9653 100644
--- a/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.transformed.expect
@@ -7,33 +7,33 @@
 static method useAddAll() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int> #t1 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t1.{core::Set::add}(0){(core::int) → core::bool};
-    #t1.{core::Set::add}(1){(core::int) → core::bool};
-    #t1.{core::Set::add}(2){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
   } =>#t1;
   dynamic dynamicSet2 = block {
     final core::Set<core::num> #t2 = new col::_CompactLinkedHashSet::•<core::num>();
-    #t2.{core::Set::add}(3){(core::num) → core::bool};
-    #t2.{core::Set::add}(4){(core::num) → core::bool};
-    #t2.{core::Set::add}(5){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
   } =>#t2;
   dynamic dynamicSet3 = block {
     final core::Set<core::int?> #t3 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t3.{core::Set::add}(6){(core::int?) → core::bool};
-    #t3.{core::Set::add}(7){(core::int?) → core::bool};
-    #t3.{core::Set::add}(8){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
   } =>#t3;
   core::Iterable<core::int> iterableIntSet = block {
     final core::Set<core::int> #t4 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t4.{core::Set::add}(9){(core::int) → core::bool};
-    #t4.{core::Set::add}(10){(core::int) → core::bool};
-    #t4.{core::Set::add}(11){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
   } =>#t4;
   core::Set<core::int> intSet = block {
     final core::Set<core::int> #t5 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t5.{core::Set::add}(12){(core::int) → core::bool};
-    #t5.{core::Set::add}(13){(core::int) → core::bool};
-    #t5.{core::Set::add}(14){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
   } =>#t5;
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t6 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -43,7 +43,7 @@
         final dynamic #t7 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t8 = #t7 as{TypeError,ForNonNullableByDefault} core::int;
-          #t6.{core::Set::add}(#t8){(core::int) → core::bool};
+          #t6.{core::Set::add}{Invariant}(#t8){(core::int) → core::bool};
         }
       }
     }
@@ -53,7 +53,7 @@
         final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::int;
-          #t6.{core::Set::add}(#t10){(core::int) → core::bool};
+          #t6.{core::Set::add}{Invariant}(#t10){(core::int) → core::bool};
         }
       }
     }
@@ -63,12 +63,12 @@
         final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::int;
-          #t6.{core::Set::add}(#t12){(core::int) → core::bool};
+          #t6.{core::Set::add}{Invariant}(#t12){(core::int) → core::bool};
         }
       }
     }
-    #t6.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::int>) → void};
-    #t6.{core::Set::addAll}(intSet){(core::Iterable<core::int>) → void};
+    #t6.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int>) → void};
+    #t6.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int>) → void};
   } =>#t6;
   self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
   core::Set<core::num> set2 = block {
@@ -79,7 +79,7 @@
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t15 = #t14 as{TypeError,ForNonNullableByDefault} core::num;
-          #t13.{core::Set::add}(#t15){(core::num) → core::bool};
+          #t13.{core::Set::add}{Invariant}(#t15){(core::num) → core::bool};
         }
       }
     }
@@ -89,7 +89,7 @@
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::num;
-          #t13.{core::Set::add}(#t17){(core::num) → core::bool};
+          #t13.{core::Set::add}{Invariant}(#t17){(core::num) → core::bool};
         }
       }
     }
@@ -99,45 +99,45 @@
         final dynamic #t18 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::num;
-          #t13.{core::Set::add}(#t19){(core::num) → core::bool};
+          #t13.{core::Set::add}{Invariant}(#t19){(core::num) → core::bool};
         }
       }
     }
-    #t13.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::num>) → void};
-    #t13.{core::Set::addAll}(intSet){(core::Iterable<core::num>) → void};
+    #t13.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num>) → void};
+    #t13.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num>) → void};
   } =>#t13;
   self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
 }
 static method useAddAllNullable() → void {
   dynamic dynamicSet1 = block {
     final core::Set<core::int> #t20 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t20.{core::Set::add}(0){(core::int) → core::bool};
-    #t20.{core::Set::add}(1){(core::int) → core::bool};
-    #t20.{core::Set::add}(2){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
   } =>#t20;
   dynamic dynamicSet2 = block {
     final core::Set<core::num> #t21 = new col::_CompactLinkedHashSet::•<core::num>();
-    #t21.{core::Set::add}(3){(core::num) → core::bool};
-    #t21.{core::Set::add}(4){(core::num) → core::bool};
-    #t21.{core::Set::add}(5){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
   } =>#t21;
   dynamic dynamicSet3 = block {
     final core::Set<core::int?> #t22 = new col::_CompactLinkedHashSet::•<core::int?>();
-    #t22.{core::Set::add}(6){(core::int?) → core::bool};
-    #t22.{core::Set::add}(7){(core::int?) → core::bool};
-    #t22.{core::Set::add}(8){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
   } =>#t22;
   core::Iterable<core::int>? iterableIntSet = true ?{core::Set<core::int>?} block {
     final core::Set<core::int> #t23 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t23.{core::Set::add}(9){(core::int) → core::bool};
-    #t23.{core::Set::add}(10){(core::int) → core::bool};
-    #t23.{core::Set::add}(11){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
   } =>#t23 : null;
   core::Set<core::int>? intSet = true ?{core::Set<core::int>?} block {
     final core::Set<core::int> #t24 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t24.{core::Set::add}(12){(core::int) → core::bool};
-    #t24.{core::Set::add}(13){(core::int) → core::bool};
-    #t24.{core::Set::add}(14){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
   } =>#t24 : null;
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -148,7 +148,7 @@
         final dynamic #t27 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t28){(core::int) → core::bool};
+          #t25.{core::Set::add}{Invariant}(#t28){(core::int) → core::bool};
         }
       }
     }
@@ -159,7 +159,7 @@
         final dynamic #t30 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t31 = #t30 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t31){(core::int) → core::bool};
+          #t25.{core::Set::add}{Invariant}(#t31){(core::int) → core::bool};
         }
       }
     }
@@ -170,16 +170,16 @@
         final dynamic #t33 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t34){(core::int) → core::bool};
+          #t25.{core::Set::add}{Invariant}(#t34){(core::int) → core::bool};
         }
       }
     }
     final core::Iterable<core::int>? #t35 = iterableIntSet;
     if(!(#t35 == null))
-      #t25.{core::Set::addAll}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t25.{core::Set::addAll}{Invariant}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
     final core::Iterable<core::int>? #t36 = intSet;
     if(!(#t36 == null))
-      #t25.{core::Set::addAll}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+      #t25.{core::Set::addAll}{Invariant}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
   } =>#t25;
   self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
   core::Set<core::num> set2 = block {
@@ -191,7 +191,7 @@
         final dynamic #t39 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::num;
-          #t37.{core::Set::add}(#t40){(core::num) → core::bool};
+          #t37.{core::Set::add}{Invariant}(#t40){(core::num) → core::bool};
         }
       }
     }
@@ -202,7 +202,7 @@
         final dynamic #t42 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t43 = #t42 as{TypeError,ForNonNullableByDefault} core::num;
-          #t37.{core::Set::add}(#t43){(core::num) → core::bool};
+          #t37.{core::Set::add}{Invariant}(#t43){(core::num) → core::bool};
         }
       }
     }
@@ -213,16 +213,16 @@
         final dynamic #t45 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
           final core::num #t46 = #t45 as{TypeError,ForNonNullableByDefault} core::num;
-          #t37.{core::Set::add}(#t46){(core::num) → core::bool};
+          #t37.{core::Set::add}{Invariant}(#t46){(core::num) → core::bool};
         }
       }
     }
     final core::Iterable<core::num>? #t47 = iterableIntSet;
     if(!(#t47 == null))
-      #t37.{core::Set::addAll}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t37.{core::Set::addAll}{Invariant}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
     final core::Iterable<core::num>? #t48 = intSet;
     if(!(#t48 == null))
-      #t37.{core::Set::addAll}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+      #t37.{core::Set::addAll}{Invariant}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
   } =>#t37;
   self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
 }
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.expect
index 93346f1..2263773 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.expect
@@ -7,6 +7,6 @@
   block {
     final core::List<core::String*>* #t1 = <core::String*>["ab"];
     if(b)
-      #t1.{core::List::add}("cd"){(core::String*) →* void};
+      #t1.{core::List::add}{Invariant}("cd"){(core::String*) →* void};
   } =>#t1;
 }
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.transformed.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.transformed.expect
index 0a6d17a..30ae805 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   block {
     final core::List<core::String*>* #t1 = core::_GrowableList::_literal1<core::String*>("ab");
     if(b)
-      #t1.{core::List::add}("cd"){(core::String*) →* void};
+      #t1.{core::List::add}{Invariant}("cd"){(core::String*) →* void};
   } =>#t1;
 }
 
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
index ab48d3f..31c63c2 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
@@ -60,11 +60,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int?} && this.{self::Cat::numberOfWhiskers}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int?};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int?}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int?}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int?}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int?}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -88,7 +88,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
index 7e11dd4..b4dffa3 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
@@ -60,11 +60,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int?} && this.{self::Cat::numberOfWhiskers}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int?};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int?}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int?}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int?}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int?}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -88,7 +88,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
index ab48d3f..31c63c2 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
@@ -60,11 +60,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int?} && this.{self::Cat::numberOfWhiskers}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int?};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int?}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int?}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int?}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int?}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -88,7 +88,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
index 7e11dd4..b4dffa3 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
@@ -60,11 +60,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int?} && this.{self::Cat::numberOfWhiskers}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int?};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int?}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int?}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int?}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int?}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -88,7 +88,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
index ee36638..d243d4d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::EmptyClass;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "EmptyClass()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
index dfd863f..eae2ec9 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::EmptyClass;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "EmptyClass()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
index ee36638..d243d4d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::EmptyClass;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "EmptyClass()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
index dfd863f..eae2ec9 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::EmptyClass;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "EmptyClass()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
index 874cf34..0509836 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -45,7 +45,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::F;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "F()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
index 9c48f3b..f3cd9d1 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -40,7 +40,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -53,7 +53,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::F;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "F()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
index 874cf34..0509836 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -45,7 +45,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::F;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "F()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
index 9c48f3b..f3cd9d1 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -40,7 +40,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -53,7 +53,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::F;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "F()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
index ef4afe1..a3eef16 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
@@ -18,11 +18,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
index ef4afe1..a3eef16 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
@@ -18,11 +18,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
index ef4afe1..a3eef16 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
@@ -18,11 +18,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
index ef4afe1..a3eef16 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
@@ -18,11 +18,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
index 59a319e..eca2eeb 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
@@ -19,11 +19,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
index 59a319e..eca2eeb 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
@@ -19,11 +19,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
index 59a319e..eca2eeb 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
@@ -19,11 +19,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
index 59a319e..eca2eeb 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
@@ -19,11 +19,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
index b2a184a..6759904 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
@@ -24,11 +24,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
index b2a184a..6759904 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
@@ -24,11 +24,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
index b2a184a..6759904 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
@@ -24,11 +24,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
index b2a184a..6759904 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
@@ -24,11 +24,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
index f0a1c74..cee962b 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -40,11 +40,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
index 6c1ece6..0144bcf 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
@@ -40,11 +40,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
index f0a1c74..cee962b 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -40,11 +40,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
index 6c1ece6..0144bcf 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
@@ -40,11 +40,11 @@
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
index 08b2269..682fc4d 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
@@ -46,11 +46,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
index 3954e85..955fab2 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
@@ -46,11 +46,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
index 08b2269..682fc4d 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
@@ -46,11 +46,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
index 3954e85..955fab2 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
@@ -46,11 +46,11 @@
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
index 263682d..068409c 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -49,7 +49,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat2;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat2()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
index 523dee1f..846d751 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -49,7 +49,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat2;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat2()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
index 263682d..068409c 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -49,7 +49,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat2;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat2()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
index 523dee1f..846d751 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -49,7 +49,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::Cat2;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "Cat2()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
index 0f84494..47528c5 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
@@ -88,11 +88,11 @@
     : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Cat::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Cat::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -109,11 +109,11 @@
     : self::Cat2::numberOfLegs = numberOfLegs, self::Cat2::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
+    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfLegs}{core::int} && this.{self::Cat2::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}{core::int}, this.{self::Cat2::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat2::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
index b0fba59..28477fa 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
@@ -88,11 +88,11 @@
     : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Cat::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Cat::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -109,11 +109,11 @@
     : self::Cat2::numberOfLegs = numberOfLegs, self::Cat2::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
+    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfLegs}{core::int} && this.{self::Cat2::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}{core::int}, this.{self::Cat2::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat2::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
index 0f84494..47528c5 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
@@ -88,11 +88,11 @@
     : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Cat::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Cat::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -109,11 +109,11 @@
     : self::Cat2::numberOfLegs = numberOfLegs, self::Cat2::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
+    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfLegs}{core::int} && this.{self::Cat2::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}{core::int}, this.{self::Cat2::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat2::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
index b0fba59..28477fa 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
@@ -88,11 +88,11 @@
     : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
+    return other is self::Cat && this.{self::Cat::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Cat::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -109,11 +109,11 @@
     : self::Cat2::numberOfLegs = numberOfLegs, self::Cat2::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
     ;
   operator /*isLegacy*/ ==(core::Object other) → core::bool
-    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
+    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfLegs}{core::int} && this.{self::Cat2::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfWhiskers}{core::int};
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}{core::int}, this.{self::Cat2::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat2::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
   method /*isLegacy*/ toString() → core::String
-    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
   method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
index fa9583c..391ae35 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
index 9904420..86f6243 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
index fa9583c..391ae35 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
index 9904420..86f6243 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
@@ -30,7 +30,7 @@
   operator /*isLegacy*/ ==(core::Object other) → core::bool
     return other is self::A;
   get /*isLegacy*/ hashCode() → core::int
-    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
   method /*isLegacy*/ toString() → core::String
     return "A()";
   method /*isLegacy*/ copyWith() → dynamic
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 2389f01..3e8f7b2 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5063,8 +5063,14 @@
   Name get name;
 }
 
-class DynamicInvocation extends InvocationExpression {
+abstract class InstanceInvocationExpression extends InvocationExpression {
+  Expression get receiver;
+}
+
+class DynamicInvocation extends InstanceInvocationExpression {
   final DynamicAccessKind kind;
+
+  @override
   Expression receiver;
 
   @override
@@ -5203,7 +5209,7 @@
 
 /// An invocation of an instance method with a statically known interface
 /// target.
-class InstanceInvocation extends InvocationExpression {
+class InstanceInvocation extends InstanceInvocationExpression {
   // Must match serialized bit positions.
   static const int FlagInvariant = 1 << 0;
   static const int FlagBoundsSafe = 1 << 1;
@@ -5376,7 +5382,7 @@
 /// This is used only for web backend in order to support invocation of
 /// native properties as functions. This node will be removed when this
 /// invocation style is no longer supported.
-class InstanceGetterInvocation extends InvocationExpression {
+class InstanceGetterInvocation extends InstanceInvocationExpression {
   // Must match serialized bit positions.
   static const int FlagInvariant = 1 << 0;
   static const int FlagBoundsSafe = 1 << 1;
@@ -5580,9 +5586,10 @@
 
 /// An invocation of the 'call' method on an expression whose static type is
 /// a function type or the type 'Function'.
-class FunctionInvocation extends InvocationExpression {
+class FunctionInvocation extends InstanceInvocationExpression {
   final FunctionAccessKind kind;
 
+  @override
   Expression receiver;
 
   @override
@@ -5948,11 +5955,12 @@
 }
 
 /// Expression of form `x.foo(y)`.
-class MethodInvocation extends InvocationExpression {
+class MethodInvocation extends InstanceInvocationExpression {
   // Must match serialized bit positions.
   static const int FlagInvariant = 1 << 0;
   static const int FlagBoundsSafe = 1 << 1;
 
+  @override
   Expression receiver;
 
   @override
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index ac9470e..0017fd4 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1495,6 +1495,16 @@
     writeSymbol('.');
     writeInterfaceTarget(node.name, node.interfaceTargetReference);
     _writeInstanceAccessKind(node.kind);
+    List<String> flags = <String>[];
+    if (node.isInvariant) {
+      flags.add('Invariant');
+    }
+    if (node.isBoundsSafe) {
+      flags.add('BoundsSafe');
+    }
+    if (flags.isNotEmpty) {
+      write('{${flags.join(',')}}');
+    }
     writeNode(node.arguments);
     writeSymbol('{');
     writeType(node.functionType);
diff --git a/pkg/kernel/lib/transformations/scanner.dart b/pkg/kernel/lib/transformations/scanner.dart
index c49a934..d80aa65 100644
--- a/pkg/kernel/lib/transformations/scanner.dart
+++ b/pkg/kernel/lib/transformations/scanner.dart
@@ -243,17 +243,18 @@
 }
 
 abstract class MethodInvocationScanner<Y extends TreeNode?>
-    extends RecursiveVisitor implements Scanner<MethodInvocation, Y> {
+    extends RecursiveVisitor
+    implements Scanner<InstanceInvocationExpression, Y> {
   final Scanner<Y, TreeNode>? next;
-  ScanResult<MethodInvocation, Y>? _result;
+  ScanResult<InstanceInvocationExpression, Y>? _result;
 
   MethodInvocationScanner(this.next);
 
-  bool predicate(MethodInvocation node);
+  bool predicate(InstanceInvocationExpression node);
 
-  ScanResult<MethodInvocation, Y> scan(TreeNode node) {
-    ScanResult<MethodInvocation, Y> result =
-        _result = new ScanResult<MethodInvocation, Y>();
+  ScanResult<InstanceInvocationExpression, Y> scan(TreeNode node) {
+    ScanResult<InstanceInvocationExpression, Y> result =
+        _result = new ScanResult<InstanceInvocationExpression, Y>();
     node.accept(this);
     _result = null;
     return result;
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index b50c56f..014256c 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -34,13 +34,14 @@
   }
 }
 
-class AllMemberScanner extends MemberScanner<MethodInvocation> {
-  AllMemberScanner(Scanner<MethodInvocation, TreeNode?> next) : super(next);
+class AllMemberScanner extends MemberScanner<InstanceInvocationExpression> {
+  AllMemberScanner(Scanner<InstanceInvocationExpression, TreeNode?> next)
+      : super(next);
 
   bool predicate(Member member) => true;
 }
 
-// Scans and matches all copyWith invocations were the reciever is _ as dynamic
+// Scans and matches all copyWith invocations were the receiver is _ as dynamic
 // It will filter out the results that are not value classes afterwards
 class ValueClassCopyWithScanner extends MethodInvocationScanner<Null> {
   ValueClassCopyWithScanner() : super(null);
@@ -49,7 +50,7 @@
   // @valueClass V {}
   // V v;
   // (v as dynamic).copyWith() as V
-  bool predicate(MethodInvocation node) {
+  bool predicate(InstanceInvocationExpression node) {
     return node.name.text == "copyWith" &&
         _isValueClassAsConstruct(node.receiver);
   }
@@ -60,14 +61,17 @@
 }
 
 void transformComponent(Component node, CoreTypes coreTypes,
-    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment,
+    {required bool useNewMethodInvocationEncoding}) {
   ValueClassScanner scanner = new ValueClassScanner();
   ScanResult<Class, Null> valueClasses = scanner.scan(node);
   for (Class valueClass in valueClasses.targets.keys) {
-    transformValueClass(valueClass, coreTypes, hierarchy, typeEnvironment);
+    transformValueClass(valueClass, coreTypes, hierarchy, typeEnvironment,
+        useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
   }
 
-  treatCopyWithCallSites(node, coreTypes, typeEnvironment, hierarchy);
+  treatCopyWithCallSites(node, coreTypes, typeEnvironment, hierarchy,
+      useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
 
   for (Class valueClass in valueClasses.targets.keys) {
     removeValueClassAnnotation(valueClass);
@@ -75,7 +79,8 @@
 }
 
 void transformValueClass(Class cls, CoreTypes coreTypes,
-    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
+    ClassHierarchy hierarchy, TypeEnvironment typeEnvironment,
+    {required bool useNewMethodInvocationEncoding}) {
   Constructor? syntheticConstructor = null;
   for (Constructor constructor in cls.constructors) {
     if (constructor.isSynthetic) {
@@ -88,9 +93,12 @@
   allVariablesList.sort((a, b) => a.name!.compareTo(b.name!));
 
   addConstructor(cls, coreTypes, syntheticConstructor!);
-  addEqualsOperator(cls, coreTypes, hierarchy, allVariablesList);
-  addHashCode(cls, coreTypes, hierarchy, allVariablesList);
-  addToString(cls, coreTypes, hierarchy, allVariablesList);
+  addEqualsOperator(cls, coreTypes, hierarchy, allVariablesList,
+      useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
+  addHashCode(cls, coreTypes, hierarchy, allVariablesList,
+      useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
+  addToString(cls, coreTypes, hierarchy, allVariablesList,
+      useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
   addCopyWith(cls, coreTypes, hierarchy, allVariablesList, syntheticConstructor,
       typeEnvironment);
 }
@@ -132,7 +140,8 @@
 }
 
 void addEqualsOperator(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    List<VariableDeclaration> allVariablesList,
+    {required bool useNewMethodInvocationEncoding}) {
   List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Operator &&
@@ -167,14 +176,18 @@
       ProcedureKind.Operator,
       FunctionNode(
           ReturnStatement(allVariables
-              .map((f) => MethodInvocation(
-                  PropertyGet(ThisExpression(), Name(f.name!), targets[f]),
-                  Name("=="),
-                  Arguments([
-                    PropertyGet(
-                        VariableGet(other, myType), Name(f.name!), targets[f])
-                  ]),
-                  targetsEquals[f]))
+              .map((f) => _createEquals(
+                  _createGet(ThisExpression(), Name(f.name!),
+                      interfaceTarget: targets[f],
+                      useNewMethodInvocationEncoding:
+                          useNewMethodInvocationEncoding),
+                  _createGet(VariableGet(other, myType), Name(f.name!),
+                      interfaceTarget: targets[f],
+                      useNewMethodInvocationEncoding:
+                          useNewMethodInvocationEncoding),
+                  interfaceTarget: targetsEquals[f] as Procedure,
+                  useNewMethodInvocationEncoding:
+                      useNewMethodInvocationEncoding))
               .fold(
                   IsExpression(VariableGet(other), myType),
                   (previousValue, element) => LogicalExpression(
@@ -187,7 +200,8 @@
 }
 
 void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    List<VariableDeclaration> allVariablesList,
+    {required bool useNewMethodInvocationEncoding}) {
   List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Getter &&
@@ -239,19 +253,25 @@
               hashFinish!,
               Arguments([
                 allVariables
-                    .map((f) => (PropertyGet(
-                        PropertyGet(
-                            ThisExpression(), Name(f.name!), targets[f]),
+                    .map((f) => (_createGet(
+                        _createGet(ThisExpression(), Name(f.name!),
+                            interfaceTarget: targets[f],
+                            useNewMethodInvocationEncoding:
+                                useNewMethodInvocationEncoding),
                         Name("hashCode"),
-                        targetsHashcode[f])))
+                        interfaceTarget: targetsHashcode[f],
+                        useNewMethodInvocationEncoding:
+                            useNewMethodInvocationEncoding)))
                     .fold(
-                        PropertyGet(
+                        _createGet(
                             StringLiteral(
                                 cls.enclosingLibrary.importUri.toString() +
                                     cls.name),
                             Name("hashCode"),
-                            hierarchy.getInterfaceMember(
-                                coreTypes.stringClass, Name("hashCode"))),
+                            interfaceTarget: hierarchy.getInterfaceMember(
+                                coreTypes.stringClass, Name("hashCode")),
+                            useNewMethodInvocationEncoding:
+                                useNewMethodInvocationEncoding),
                         (previousValue, element) => StaticInvocation(
                             hashCombine!, Arguments([previousValue, element])))
               ]))),
@@ -261,20 +281,27 @@
 }
 
 void addToString(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariablesList) {
+    List<VariableDeclaration> allVariablesList,
+    {required bool useNewMethodInvocationEncoding}) {
   List<Expression> wording = [StringLiteral("${cls.name}(")];
 
   for (VariableDeclaration variable in allVariablesList) {
     wording.add(StringLiteral("${variable.name}: "));
-    wording.add(MethodInvocation(
-        PropertyGet(ThisExpression(), Name(variable.name!),
-            hierarchy.getInterfaceMember(cls, Name(variable.name!))),
+    Member? variableTarget =
+        hierarchy.getInterfaceMember(cls, Name(variable.name!));
+    Procedure toStringTarget = hierarchy.getInterfaceMember(
+        variable.type is InterfaceType
+            ? (variable.type as InterfaceType).classNode
+            : coreTypes.objectClass,
+        Name("toString")) as Procedure;
+    wording.add(_createInvocation(
+        _createGet(ThisExpression(), Name(variable.name!),
+            interfaceTarget: variableTarget,
+            useNewMethodInvocationEncoding: useNewMethodInvocationEncoding),
         Name("toString"),
         Arguments([]),
-        (variable.type is InterfaceType)
-            ? hierarchy.getInterfaceMember(
-                (variable.type as InterfaceType).classNode, Name("toString"))
-            : null));
+        interfaceTarget: toStringTarget,
+        useNewMethodInvocationEncoding: useNewMethodInvocationEncoding));
     wording.add(StringLiteral(", "));
   }
   if (allVariablesList.length != 0) {
@@ -365,19 +392,20 @@
 }
 
 void treatCopyWithCallSites(Component component, CoreTypes coreTypes,
-    TypeEnvironment typeEnvironment, ClassHierarchy hierarchy) {
+    TypeEnvironment typeEnvironment, ClassHierarchy hierarchy,
+    {required bool useNewMethodInvocationEncoding}) {
   ValueClassCopyWithScanner valueCopyWithScanner =
       new ValueClassCopyWithScanner();
   AllMemberScanner copyWithScanner = AllMemberScanner(valueCopyWithScanner);
-  ScanResult<Member, MethodInvocation> copyWithCallSites =
+  ScanResult<Member, InstanceInvocationExpression> copyWithCallSites =
       copyWithScanner.scan(component);
   for (Member memberWithCopyWith in copyWithCallSites.targets.keys) {
-    Map<MethodInvocation, ScanResult<TreeNode?, TreeNode?>?>? targets =
-        copyWithCallSites.targets[memberWithCopyWith]?.targets;
+    Map<InstanceInvocationExpression, ScanResult<TreeNode?, TreeNode?>?>?
+        targets = copyWithCallSites.targets[memberWithCopyWith]?.targets;
     if (targets != null) {
       StaticTypeContext staticTypeContext =
           StaticTypeContext(memberWithCopyWith, typeEnvironment);
-      for (MethodInvocation copyWithCall in targets.keys) {
+      for (InstanceInvocationExpression copyWithCall in targets.keys) {
         AsExpression receiver = copyWithCall.receiver as AsExpression;
 
         Expression valueClassInstance = receiver.operand;
@@ -387,7 +415,8 @@
           Class valueClass = valueClassType.classNode;
           if (isValueClass(valueClass)) {
             treatCopyWithCallSite(
-                valueClass, copyWithCall, coreTypes, hierarchy);
+                valueClass, copyWithCall, coreTypes, hierarchy,
+                useNewMethodInvocationEncoding: useNewMethodInvocationEncoding);
           }
         }
       }
@@ -395,8 +424,12 @@
   }
 }
 
-void treatCopyWithCallSite(Class valueClass, MethodInvocation copyWithCall,
-    CoreTypes coreTypes, ClassHierarchy hierarchy) {
+void treatCopyWithCallSite(
+    Class valueClass,
+    InstanceInvocationExpression copyWithCall,
+    CoreTypes coreTypes,
+    ClassHierarchy hierarchy,
+    {required bool useNewMethodInvocationEncoding}) {
   Map<String, Expression> preTransformationArguments = new Map();
   for (NamedExpression argument in copyWithCall.arguments.named) {
     preTransformationArguments[argument.name] = argument.value;
@@ -419,15 +452,18 @@
           argument.name!, preTransformationArguments[argument.name]!)
         ..parent = postTransformationArguments);
     } else {
-      postTransformationArguments.named.add(NamedExpression(argument.name!,
-          PropertyGet(VariableGet(letVariable), Name(argument.name!)))
+      postTransformationArguments.named.add(NamedExpression(
+          argument.name!,
+          _createGet(VariableGet(letVariable), Name(argument.name!),
+              useNewMethodInvocationEncoding: useNewMethodInvocationEncoding))
         ..parent = postTransformationArguments);
     }
   }
   copyWithCall.replaceWith(Let(
       letVariable,
-      MethodInvocation(VariableGet(letVariable), Name("copyWith"),
-          postTransformationArguments)));
+      _createInvocation(VariableGet(letVariable), Name("copyWith"),
+          postTransformationArguments,
+          useNewMethodInvocationEncoding: useNewMethodInvocationEncoding)));
 }
 
 bool isValueClass(Class node) {
@@ -442,3 +478,52 @@
   }
   return false;
 }
+
+// TODO(johnniwinther): Ensure correct invocation function type and instance
+// access kind on InstanceInvocation.
+Expression _createInvocation(
+    Expression receiver, Name name, Arguments arguments,
+    {Procedure? interfaceTarget,
+    required bool useNewMethodInvocationEncoding}) {
+  if (useNewMethodInvocationEncoding) {
+    if (interfaceTarget != null) {
+      return InstanceInvocation(
+          InstanceAccessKind.Instance, receiver, name, arguments,
+          interfaceTarget: interfaceTarget,
+          functionType: interfaceTarget.getterType as FunctionType);
+    } else {
+      return DynamicInvocation(
+          DynamicAccessKind.Dynamic, receiver, name, arguments);
+    }
+  } else {
+    return MethodInvocation(receiver, name, arguments, interfaceTarget);
+  }
+}
+
+Expression _createEquals(Expression left, Expression right,
+    {required Procedure interfaceTarget,
+    required bool useNewMethodInvocationEncoding}) {
+  if (useNewMethodInvocationEncoding) {
+    return EqualsCall(left, right,
+        interfaceTarget: interfaceTarget,
+        functionType: interfaceTarget.getterType as FunctionType);
+  } else {
+    return MethodInvocation(left, Name('=='), Arguments([right]));
+  }
+}
+
+// TODO(johnniwinther): Ensure correct result type on InstanceGet.
+Expression _createGet(Expression receiver, Name name,
+    {Member? interfaceTarget, required bool useNewMethodInvocationEncoding}) {
+  if (useNewMethodInvocationEncoding) {
+    if (interfaceTarget != null) {
+      return InstanceGet(InstanceAccessKind.Instance, receiver, name,
+          interfaceTarget: interfaceTarget,
+          resultType: interfaceTarget.getterType);
+    } else {
+      return DynamicGet(DynamicAccessKind.Dynamic, receiver, name);
+    }
+  } else {
+    return PropertyGet(receiver, name, interfaceTarget);
+  }
+}
diff --git a/runtime/tests/vm/dart/deopt/indirect_goto_regress_46399_test.dart b/runtime/tests/vm/dart/deopt/indirect_goto_regress_46399_test.dart
new file mode 100644
index 0000000..f28ef6b
--- /dev/null
+++ b/runtime/tests/vm/dart/deopt/indirect_goto_regress_46399_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--deterministic --deoptimize-on-runtime-call-every=1 --optimization-counter-threshold=1
+
+import 'package:expect/expect.dart';
+
+main() {
+  final res = RegExp('a.*b');
+  for (int i = 0; i < 100; ++i) {
+    Expect.isNull(res.firstMatch('*** Failers'));
+  }
+}
diff --git a/runtime/tests/vm/dart_2/deopt/indirect_goto_regress_46399_test.dart b/runtime/tests/vm/dart_2/deopt/indirect_goto_regress_46399_test.dart
new file mode 100644
index 0000000..f28ef6b
--- /dev/null
+++ b/runtime/tests/vm/dart_2/deopt/indirect_goto_regress_46399_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--deterministic --deoptimize-on-runtime-call-every=1 --optimization-counter-threshold=1
+
+import 'package:expect/expect.dart';
+
+main() {
+  final res = RegExp('a.*b');
+  for (int i = 0; i < 100; ++i) {
+    Expect.isNull(res.firstMatch('*** Failers'));
+  }
+}
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 5e299f0..568e8fd 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1073,9 +1073,9 @@
   // We're not retaining the parent due to this function, so wrap it with
   // a weak serialization reference.
   const auto& data = ClosureData::CheckedHandle(Z, function.data());
-  const auto& wsr = WeakSerializationReference::Handle(
-      Z, WeakSerializationReference::New(parent_function,
-                                         Object::null_function()));
+  const auto& wsr =
+      Object::Handle(Z, WeakSerializationReference::New(
+                            parent_function, Object::null_function()));
   data.set_parent_function(wsr);
 }
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 750271b..9a6ac0d 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -3180,28 +3180,39 @@
 
 // IndirectGotoInstr represents a dynamically computed jump. Only
 // IndirectEntryInstr targets are valid targets of an indirect goto. The
-// concrete target to jump to is given as a parameter to the indirect goto.
+// concrete target index to jump to is given as a parameter to the indirect
+// goto.
 //
 // In order to preserve split-edge form, an indirect goto does not itself point
 // to its targets. Instead, for each possible target, the successors_ field
 // will contain an ordinary goto instruction that jumps to the target.
 // TODO(zerny): Implement direct support instead of embedding gotos.
 //
-// Byte offsets of all possible targets are stored in the offsets_ array. The
-// desired offset is looked up while the generated code is executing, and passed
-// to IndirectGoto as an input.
+// The input to the [IndirectGotoInstr] is the target index to jump to.
+// All targets of the [IndirectGotoInstr] are added via [AddSuccessor] and get
+// increasing indices.
+//
+// The FlowGraphCompiler will - as a post-processing step - invoke
+// [ComputeOffsetTable] of all [IndirectGotoInstr]s. In there we initialize a
+// TypedDataInt32Array containing offsets of all [IndirectEntryInstr]s (the
+// offests are relative to start of the instruction payload).
+//
+//  => See `FlowGraphCompiler::CompileGraph()`
+//  => See `IndirectGotoInstr::ComputeOffsetTable`
 class IndirectGotoInstr : public TemplateInstruction<1, NoThrow> {
  public:
-  IndirectGotoInstr(const TypedData* offsets, Value* offset_from_start)
-      : offsets_(*offsets) {
-    SetInputAt(0, offset_from_start);
+  IndirectGotoInstr(intptr_t target_count, Value* target_index)
+      : offsets_(TypedData::ZoneHandle(TypedData::New(kTypedDataInt32ArrayCid,
+                                                      target_count,
+                                                      Heap::kOld))) {
+    SetInputAt(0, target_index);
   }
 
   DECLARE_INSTRUCTION(IndirectGoto)
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
-    return kNoRepresentation;
+    return kTagged;
   }
 
   void AddSuccessor(TargetEntryInstr* successor) {
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index a0d6420..07999cc 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -7404,31 +7404,38 @@
 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = 2;
 
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
+  summary->set_temp(1, Location::RequiresRegister());
 
   return summary;
 }
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register target_address_reg = locs()->temp_slot(0)->reg();
+  Register index_reg = locs()->in(0).reg();
+  Register target_address_reg = locs()->temp(0).reg();
+  Register offset_reg = locs()->temp(1).reg();
+
+  ASSERT(RequiredInputRepresentation(0) == kTagged);
+  __ LoadObject(offset_reg, offsets_);
+  const auto element_address = __ ElementAddressForRegIndex(
+      /*is_load=*/true,
+      /*is_external=*/false, kTypedDataInt32ArrayCid,
+      /*index_scale=*/4,
+      /*index_unboxed=*/false, offset_reg, index_reg);
+  __ ldr(offset_reg, element_address);
 
   // Offset is relative to entry pc.
   const intptr_t entry_to_pc_offset = __ CodeSize() + Instr::kPCReadOffset;
   __ mov(target_address_reg, compiler::Operand(PC));
   __ AddImmediate(target_address_reg, -entry_to_pc_offset);
-  // Add the offset.
-  Register offset_reg = locs()->in(0).reg();
-  compiler::Operand offset_opr =
-      (offset()->definition()->representation() == kTagged)
-          ? compiler::Operand(offset_reg, ASR, kSmiTagSize)
-          : compiler::Operand(offset_reg);
-  __ add(target_address_reg, target_address_reg, offset_opr);
+
+  __ add(target_address_reg, target_address_reg, compiler::Operand(offset_reg));
 
   // Jump to the absolute address.
   __ bx(target_address_reg);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 8402871..b66dd0b 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -6420,19 +6420,30 @@
 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = 2;
 
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
+  summary->set_temp(1, Location::RequiresRegister());
 
   return summary;
 }
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register target_address_reg = locs()->temp_slot(0)->reg();
+  Register index_reg = locs()->in(0).reg();
+  Register target_address_reg = locs()->temp(0).reg();
+  Register offset_reg = locs()->temp(1).reg();
+
+  ASSERT(RequiredInputRepresentation(0) == kTagged);
+  __ LoadObject(offset_reg, offsets_);
+  const auto element_address = __ ElementAddressForRegIndex(
+      /*is_external=*/false, kTypedDataInt32ArrayCid,
+      /*index_scale=*/4,
+      /*index_unboxed=*/false, offset_reg, index_reg, TMP);
+  __ ldr(offset_reg, element_address, compiler::kFourBytes);
 
   // Load code entry point.
   const intptr_t entry_offset = __ CodeSize();
@@ -6443,13 +6454,7 @@
     __ AddImmediate(target_address_reg, -entry_offset);
   }
 
-  // Add the offset.
-  Register offset_reg = locs()->in(0).reg();
-  compiler::Operand offset_opr =
-      (offset()->definition()->representation() == kTagged)
-          ? compiler::Operand(offset_reg, ASR, kSmiTagSize)
-          : compiler::Operand(offset_reg);
-  __ add(target_address_reg, target_address_reg, offset_opr);
+  __ add(target_address_reg, target_address_reg, compiler::Operand(offset_reg));
 
   // Jump to the absolute address.
   __ br(target_address_reg);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index d165691..d51429f 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -6477,19 +6477,29 @@
 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = 2;
 
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
+  summary->set_temp(1, Location::RequiresRegister());
 
   return summary;
 }
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register target_reg = locs()->temp_slot(0)->reg();
+  Register index_reg = locs()->in(0).reg();
+  Register target_reg = locs()->temp(0).reg();
+  Register offset = locs()->temp(1).reg();
+
+  ASSERT(RequiredInputRepresentation(0) == kTagged);
+  __ LoadObject(offset, offsets_);
+  __ movl(offset, compiler::Assembler::ElementAddressForRegIndex(
+                      /*is_external=*/false, kTypedDataInt32ArrayCid,
+                      /*index_scale=*/4,
+                      /*index_unboxed=*/false, offset, index_reg));
 
   // Load code object from frame.
   __ movl(target_reg,
@@ -6501,13 +6511,7 @@
                           target_reg, Code::saved_instructions_offset()));
   __ addl(target_reg,
           compiler::Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-
-  // Add the offset.
-  Register offset_reg = locs()->in(0).reg();
-  if (offset()->definition()->representation() == kTagged) {
-    __ SmiUntag(offset_reg);
-  }
-  __ addl(target_reg, offset_reg);
+  __ addl(target_reg, offset);
 
   // Jump to the absolute address.
   __ jmp(target_reg);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index da71487..0fb1260 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -6845,27 +6845,36 @@
 }
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register offset_reg = locs()->in(0).reg();
-  Register target_address_reg = locs()->temp(0).reg();
+  Register index_reg = locs()->in(0).reg();
+  Register offset_reg = locs()->temp(0).reg();
+
+  ASSERT(RequiredInputRepresentation(0) == kTagged);
+#if defined(DART_COMPRESSED_POINTERS)
+  // The upper half of a compressed Smi contains undefined bits, but no x64
+  // addressing mode will ignore these bits. Assume that the index is
+  // non-negative and clear the upper bits, which is shorter than
+  // sign-extension (movsxd). Note: we don't bother to ensure index is a
+  // writable input because any other instructions using it must also not
+  // rely on the upper bits.
+  __ orl(index_reg, index_reg);
+#endif
+  __ LoadObject(offset_reg, offsets_);
+  __ movsxd(offset_reg, compiler::Assembler::ElementAddressForRegIndex(
+                            /*is_external=*/false, kTypedDataInt32ArrayCid,
+                            /*index_scale=*/4,
+                            /*index_unboxed=*/false, offset_reg, index_reg));
 
   {
     const intptr_t kRIPRelativeLeaqSize = 7;
     const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
-    __ leaq(target_address_reg,
-            compiler::Address::AddressRIPRelative(-entry_to_rip_offset));
+    __ leaq(TMP, compiler::Address::AddressRIPRelative(-entry_to_rip_offset));
     ASSERT(__ CodeSize() == entry_to_rip_offset);
   }
 
-  // Load from FP+compiler::target::frame_layout.code_from_fp.
-
-  // Calculate the final absolute address.
-  if (offset()->definition()->representation() == kTagged) {
-    __ SmiUntag(offset_reg);
-  }
-  __ addq(target_address_reg, offset_reg);
+  __ addq(TMP, offset_reg);
 
   // Jump to the absolute address.
-  __ jmp(target_address_reg);
+  __ jmp(TMP);
 }
 
 LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 4b33c48..226faffb 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -541,23 +541,9 @@
   IndirectGotoInstr* indirect_goto;
   if (FLAG_async_igoto_threshold >= 0 &&
       continuation_count >= FLAG_async_igoto_threshold) {
-    const auto& offsets = TypedData::ZoneHandle(
-        Z, TypedData::New(kTypedDataInt32ArrayCid, continuation_count,
-                          Heap::kOld));
-
-    dispatch += Constant(offsets);
     dispatch += LoadLocal(scopes()->switch_variable);
-
-    // Ideally this would just be LoadIndexed(kTypedDataInt32ArrayCid),
-    // but that doesn't work in unoptimised code.
-    // The optimiser will turn this into that in any case.
-    dispatch += InstanceCall(TokenPosition::kNoSource, Symbols::IndexToken(),
-                             Token::kINDEX, /*argument_count=*/2);
-
-    Value* offset_from_start = Pop();
-
-    indirect_goto = new (Z) IndirectGotoInstr(&offsets, offset_from_start);
-    dispatch <<= indirect_goto;
+    dispatch += IndirectGoto(continuation_count);
+    indirect_goto = dispatch.current->AsIndirectGoto();
 
     for (intptr_t i = 0; i < continuation_count; i++) {
       if (i >= 1) {
@@ -1533,6 +1519,10 @@
   return flow_graph_builder_->LoadLocal(variable);
 }
 
+Fragment StreamingFlowGraphBuilder::IndirectGoto(intptr_t target_count) {
+  return flow_graph_builder_->IndirectGoto(target_count);
+}
+
 Fragment StreamingFlowGraphBuilder::Return(TokenPosition position,
                                            intptr_t yield_index) {
   return flow_graph_builder_->Return(position, /*omit_result_type_check=*/false,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index f53e58c..36cae3e 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -153,6 +153,7 @@
   void InlineBailout(const char* reason);
   Fragment DebugStepCheck(TokenPosition position);
   Fragment LoadLocal(LocalVariable* variable);
+  Fragment IndirectGoto(intptr_t target_count);
   Fragment Return(
       TokenPosition position,
       intptr_t yield_index = UntaggedPcDescriptors::kInvalidYieldIndex);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 0261e82..a09201c 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -446,6 +446,11 @@
   }
 }
 
+Fragment FlowGraphBuilder::IndirectGoto(intptr_t target_count) {
+  Value* index = Pop();
+  return Fragment(new (Z) IndirectGotoInstr(target_count, index));
+}
+
 Fragment FlowGraphBuilder::ThrowLateInitializationError(
     TokenPosition position,
     const char* throw_method_name,
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index ced5185..7f606e4 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -196,6 +196,7 @@
   Fragment ThrowException(TokenPosition position);
   Fragment RethrowException(TokenPosition position, int catch_try_index);
   Fragment LoadLocal(LocalVariable* variable);
+  Fragment IndirectGoto(intptr_t target_count);
   Fragment StoreLateField(const Field& field,
                           LocalVariable* instance,
                           LocalVariable* setter_value);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index fbc6aba..477963e 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -192,6 +192,22 @@
   buffer->Printf("%.*s", static_cast<int>(len), &name[start_pos]);
 }
 
+#if defined(DART_PRECOMPILER)
+#define PRECOMPILER_WSR_FIELD_DEFINITION(Class, Type, Name)                    \
+  Type##Ptr Class::Name() const {                                              \
+    return Type::RawCast(WeakSerializationReference::Unwrap(untag()->Name())); \
+  }
+#else
+#define PRECOMPILER_WSR_FIELD_DEFINITION(Class, Type, Name)                    \
+  void Class::set_##Name(const Type& value) const {                            \
+    untag()->set_##Name(value.ptr());                                          \
+  }
+#endif
+
+PRECOMPILER_WSR_FIELD_DEFINITION(ClosureData, Function, parent_function)
+
+#undef PRECOMPILER_WSR_FIELD_DEFINITION
+
 // Remove private keys, but retain getter/setter/constructor/mixin manglings.
 StringPtr String::RemovePrivateKey(const String& name) {
   ASSERT(name.IsOneByteString());
@@ -7354,14 +7370,7 @@
   if (!IsClosureFunction()) return Function::null();
   Object& obj = Object::Handle(untag()->data());
   ASSERT(!obj.IsNull());
-#if defined(DART_PRECOMPILER)
-  obj = ClosureData::Cast(obj).parent_function();
-  obj = WeakSerializationReference::Unwrap(obj);
-  if (!obj.IsFunction()) return Function::null();
-  return Function::RawCast(obj.ptr());
-#else
   return ClosureData::Cast(obj).parent_function();
-#endif
 }
 
 void Function::set_parent_function(const Function& value) const {
@@ -10295,16 +10304,6 @@
   untag()->set_closure<std::memory_order_release>(closure.ptr());
 }
 
-#if defined(DART_PRECOMPILER)
-void ClosureData::set_parent_function(const Object& value) const {
-  untag()->set_parent_function(value.ptr());
-}
-#else
-void ClosureData::set_parent_function(const Function& value) const {
-  untag()->set_parent_function(value.ptr());
-}
-#endif
-
 void FfiTrampolineData::set_c_signature(const FunctionType& value) const {
   untag()->set_c_signature(value.ptr());
 }
@@ -16504,10 +16503,24 @@
   return Object::Handle(target()).ToCString();
 }
 
-WeakSerializationReferencePtr WeakSerializationReference::New(
-    const Object& target,
-    const Object& replacement) {
+ObjectPtr WeakSerializationReference::New(const Object& target,
+                                          const Object& replacement) {
   ASSERT(Object::weak_serialization_reference_class() != Class::null());
+  // Don't wrap any object in the VM heap, as all objects in the VM isolate
+  // heap are currently serialized.
+  //
+  // Note that we _do_ wrap Smis if requested. Smis are serialized in the Mint
+  // cluster, and so dropping them if not strongly referenced saves space in
+  // the snapshot.
+  if (target.ptr()->IsHeapObject() && target.InVMIsolateHeap()) {
+    return target.ptr();
+  }
+  // If the target is a WSR that already uses the replacement, then return it.
+  if (target.IsWeakSerializationReference() &&
+      WeakSerializationReference::Cast(target).replacement() ==
+          replacement.ptr()) {
+    return target.ptr();
+  }
   WeakSerializationReference& result = WeakSerializationReference::Handle();
   {
     ObjectPtr raw = Object::Allocate(
@@ -16517,7 +16530,10 @@
     NoSafepointScope no_safepoint;
 
     result ^= raw;
-    result.untag()->set_target(target.ptr());
+    // Don't nest WSRs, instead just use the old WSR's target.
+    result.untag()->set_target(target.IsWeakSerializationReference()
+                                   ? WeakSerializationReference::Unwrap(target)
+                                   : target.ptr());
     result.untag()->set_replacement(replacement.ptr());
   }
   return result.ptr();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 70dcdcc..e5a26b3 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -873,6 +873,18 @@
   DISALLOW_COPY_AND_ASSIGN(Object);
 };
 
+#if defined(DART_PRECOMPILER)
+#define PRECOMPILER_WSR_FIELD_DECLARATION(Type, Name)                          \
+  Type##Ptr Name() const;                                                      \
+  void set_##Name(const Object& value) const {                                 \
+    untag()->set_##Name(value.ptr());                                          \
+  }
+#else
+#define PRECOMPILER_WSR_FIELD_DECLARATION(Type, Name)                          \
+  Type##Ptr Name() const { return untag()->Name(); }                           \
+  void set_##Name(const Type& value) const;
+#endif
+
 class PassiveObject : public Object {
  public:
   void operator=(ObjectPtr value) { ptr_ = value; }
@@ -3824,14 +3836,7 @@
   void set_context_scope(const ContextScope& value) const;
 
   // Enclosing function of this local function.
-#if defined(DART_PRECOMPILER)
-  // Can be WSR wrapped in the precompiler.
-  ObjectPtr parent_function() const { return untag()->parent_function(); }
-  void set_parent_function(const Object& value) const;
-#else
-  FunctionPtr parent_function() const { return untag()->parent_function(); }
-  void set_parent_function(const Function& value) const;
-#endif
+  PRECOMPILER_WSR_FIELD_DECLARATION(Function, parent_function)
 
   ClosurePtr implicit_static_closure() const {
     return untag()->closure<std::memory_order_acquire>();
@@ -6011,29 +6016,25 @@
 
 // A WeakSerializationReference (WSR) denotes a type of weak reference to a
 // target object. In particular, objects that can only be reached from roots via
-// WSR edges during serialization of AOT snapshots should not be serialized. Of
-// course, the target object may still be serialized if there are paths to the
-// object from the roots that do not go through one of these objects, in which
-// case the WSR is discarded in favor of a direct reference during serialization
-// to avoid runtime overhead.
+// WSR edges during serialization of AOT snapshots should not be serialized, but
+// instead references to these objects should be replaced with a reference to
+// the provided replacement object.
 //
-// Note: Some objects cannot be dropped during AOT serialization, and thus
-//       Wrap() may return the original object in some cases. The CanWrap()
-//       function returns false if Wrap() will return the original object.
-//       In particular, the null object will never be wrapped, so receiving
-//       Object::null() from target() means the WSR represents a dropped target.
+// Of course, the target object may still be serialized if there are paths to
+// the object from the roots that do not go through one of these objects. In
+// this case, references through WSRs are serialized as direct references to
+// the target.
 //
-// Unfortunately a WSR is not a proxy for the original object, so if WSRs may
-// appear as field contents (currently only possible for ObjectPtr fields),
-// then code that accesses that field must handle the case where an WSR has
-// been introduced. Before serialization, Unwrap can be used to take a
-// Object reference or RawObject pointer and remove any WSR wrapping before use.
-// After deserialization, any WSRs no longer contain a pointer to the target,
-// but instead contain only the class ID of the original target.
+// Unfortunately a WSR is not a proxy for the original object, so WSRs may
+// only currently be used with ObjectPtr fields. To ease this situation for
+// fields that are normally a non-ObjectPtr type outside of the precompiler,
+// use the following macros, which avoid the need to adjust other code to
+// handle the WSR case:
 //
-// Current uses of WSRs:
-//  * Code::owner_
-//  * Canonical table elements
+// * WSR_*POINTER_FIELD() in raw_object.h (i.e., just append WSR_ to the
+//   original field declaration).
+// * PRECOMPILER_WSR_FIELD_DECLARATION() in object.h
+// * PRECOMPILER_WSR_FIELD_DEFINITION() in object.cc
 class WeakSerializationReference : public Object {
  public:
   ObjectPtr target() const { return TargetOf(ptr()); }
@@ -6057,11 +6058,15 @@
     return RoundedAllocationSize(sizeof(UntaggedWeakSerializationReference));
   }
 
-  static WeakSerializationReferencePtr New(const Object& target,
-                                           const Object& replacement);
+  // Returns an ObjectPtr as the target may not need wrapping (e.g., it
+  // is guaranteed to be serialized).
+  static ObjectPtr New(const Object& target, const Object& replacement);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakSerializationReference, Object);
+
+  ObjectPtr replacement() const { return untag()->replacement(); }
+
   friend class Class;
 };
 
@@ -12022,6 +12027,8 @@
 DART_WARN_UNUSED_RESULT
 ErrorPtr EntryPointMemberInvocationError(const Object& member);
 
+#undef PRECOMPILER_WSR_FIELD_DECLARATION
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_OBJECT_H_
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 19e2383..f928b2b 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -993,6 +993,14 @@
  protected:                                                                    \
   Compressed##type name##_;
 
+#if defined(DART_PRECOMPILER)
+#define WSR_COMPRESSED_POINTER_FIELD(Type, Name)                               \
+  COMPRESSED_POINTER_FIELD(ObjectPtr, Name)
+#else
+#define WSR_COMPRESSED_POINTER_FIELD(Type, Name)                               \
+  COMPRESSED_POINTER_FIELD(Type, Name)
+#endif
+
 class UntaggedClass : public UntaggedObject {
  public:
   enum ClassFinalizedState {
@@ -1425,12 +1433,7 @@
   COMPRESSED_POINTER_FIELD(ContextScopePtr, context_scope)
   VISIT_FROM(context_scope)
   // Enclosing function of this local function.
-#if defined(DART_PRECOMPILER)
-  // Can be wrapped by a WSR in the precompiler.
-  COMPRESSED_POINTER_FIELD(ObjectPtr, parent_function)
-#else
-  COMPRESSED_POINTER_FIELD(FunctionPtr, parent_function)
-#endif
+  WSR_COMPRESSED_POINTER_FIELD(FunctionPtr, parent_function)
   // Closure object for static implicit closures.
   COMPRESSED_POINTER_FIELD(ClosurePtr, closure)
   VISIT_TO(closure)
@@ -3347,6 +3350,8 @@
   friend class SnapshotReader;
 };
 
+#undef WSR_COMPRESSED_POINTER_FIELD
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_RAW_OBJECT_H_
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 552fc72..60dc2c6 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -216,17 +216,8 @@
 
   const intptr_t entries_count = entry_block_->indirect_entries().length();
 
-  TypedData& offsets = TypedData::ZoneHandle(
-      Z, TypedData::New(kTypedDataInt32ArrayCid, entries_count, Heap::kOld));
-
-  Value* block_offsets_push = Bind(new (Z) ConstantInstr(offsets));
   Value* block_id_push = Bind(PopStack());
-
-  Value* offset_value =
-      Bind(InstanceCall(InstanceCallDescriptor::FromToken(Token::kINDEX),
-                        block_offsets_push, block_id_push));
-
-  backtrack_goto_ = new (Z) IndirectGotoInstr(&offsets, offset_value);
+  backtrack_goto_ = new (Z) IndirectGotoInstr(entries_count, block_id_push);
   CloseBlockWith(backtrack_goto_);
 
   // Add an edge from the "indirect" goto to each of the targets.
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index c89d345..d005f24 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -170,13 +170,32 @@
     var errorCallback = this.errorCallback; // To enable promotion.
     // If the errorCallback returns something which is not a FutureOr<T>,
     // this return statement throws, and the caller handles the error.
+    dynamic result;
     if (errorCallback is dynamic Function(Object, StackTrace)) {
-      return _zone.runBinary<dynamic, Object, StackTrace>(
+      result = _zone.runBinary<dynamic, Object, StackTrace>(
           errorCallback, asyncError.error, asyncError.stackTrace);
     } else {
-      return _zone.runUnary<dynamic, Object>(
+      result = _zone.runUnary<dynamic, Object>(
           errorCallback as dynamic, asyncError.error);
     }
+    // Give better error messages if the result is not a valid
+    // FutureOr<T>.
+    try {
+      return result;
+    } on TypeError {
+      if (handlesValue) {
+        // This is a `.then` callback with an `onError`.
+        throw ArgumentError(
+            "The error handler of Future.then"
+                " must return a value of the returned future's type",
+            "onError");
+      }
+      // This is a `catchError` callback.
+      throw ArgumentError(
+          "The error handler of "
+              "Future.catchError must return a value of the future's type",
+          "onError");
+    }
   }
 
   dynamic handleWhenComplete() {
@@ -315,10 +334,20 @@
 
   Future<R> then<R>(FutureOr<R> f(T value), {Function? onError}) {
     Zone currentZone = Zone.current;
-    if (!identical(currentZone, _rootZone)) {
+    if (identical(currentZone, _rootZone)) {
+      if (onError != null &&
+          onError is! Function(Object, StackTrace) &&
+          onError is! Function(Object)) {
+        throw ArgumentError.value(
+            onError,
+            "onError",
+            "Error handler must accept one Object or one Object and a StackTrace"
+                " as arguments, and return a value of the returned future's type");
+      }
+    } else {
       f = currentZone.registerUnaryCallback<FutureOr<R>, T>(f);
       if (onError != null) {
-        // In checked mode, this checks that onError is assignable to one of:
+        // This call also checks that onError is assignable to one of:
         //   dynamic Function(Object)
         //   dynamic Function(Object, StackTrace)
         onError = _registerErrorHandler(onError, currentZone);
@@ -873,9 +902,9 @@
   if (errorHandler is dynamic Function(Object)) {
     return zone.registerUnaryCallback<dynamic, Object>(errorHandler);
   }
-  throw new ArgumentError.value(
+  throw ArgumentError.value(
       errorHandler,
       "onError",
       "Error handler must accept one Object or one Object and a StackTrace"
-          " as arguments, and return a valid result");
+          " as arguments, and return a value of the returned future's type");
 }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 4851883..d03e095 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -661,6 +661,14 @@
   /// If a broadcast stream is listened to more than once, each subscription
   /// will individually perform the `test` and handle the error.
   Stream<T> handleError(Function onError, {bool test(error)?}) {
+    if (onError is! void Function(Object, StackTrace) &&
+        onError is! void Function(Object)) {
+      throw ArgumentError.value(
+          onError,
+          "onError",
+          "Error handler must accept one Object or one Object and a StackTrace"
+              " as arguments.");
+    }
     return new _HandleErrorStream<T>(this, onError, test);
   }
 
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 60aff7e..4533043 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -243,14 +243,11 @@
 /// A stream pipe that converts or disposes error events
 /// before passing them on.
 class _HandleErrorStream<T> extends _ForwardingStream<T, T> {
-  final Function _transform;
+  final Function _onError;
   final bool Function(Object)? _test;
 
-  _HandleErrorStream(
-      Stream<T> source, Function onError, bool test(Object error)?)
-      : this._transform = onError,
-        this._test = test,
-        super(source);
+  _HandleErrorStream(Stream<T> source, this._onError, this._test)
+      : super(source);
 
   void _handleData(T data, _EventSink<T> sink) {
     sink._add(data);
@@ -269,7 +266,7 @@
     }
     if (matches) {
       try {
-        _invokeErrorHandler(_transform, error, stackTrace);
+        _invokeErrorHandler(_onError, error, stackTrace);
       } catch (e, s) {
         if (identical(e, error)) {
           sink._addError(error, stackTrace);
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 683267d..3770a2b 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -146,11 +146,16 @@
   /// Existing code may be using `message` to hold the invalid value.
   /// If the `message` is not a [String], it is assumed to be a value instead
   /// of a message.
+  ///
+  /// If [name] is provided, it should be the name of the parameter
+  /// which was invalid.
+  ///
+  /// Consider using [ArgumentError.value] instead to retain and document the
+  /// invalid value as well.
   @pragma("vm:entry-point")
-  ArgumentError([this.message])
+  ArgumentError([this.message, @Since("2.14") this.name])
       : invalidValue = null,
-        _hasValue = false,
-        name = null;
+        _hasValue = false;
 
   /// Creates error containing the invalid [value].
   ///
diff --git a/tools/VERSION b/tools/VERSION
index 2c257e5..c297383 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 238
+PRERELEASE 239
 PRERELEASE_PATCH 0
\ No newline at end of file