Version 2.15.0-115.0.dev

Merge commit '4aa6373724302f852639af58fa53b541cef99a94' into 'dev'
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index edf4483..eac31f6 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -798,71 +798,58 @@
   /// [HintCode.UNNECESSARY_TYPE_CHECK_TRUE], and
   /// [HintCode.UNNECESSARY_TYPE_CHECK_FALSE].
   bool _checkAllTypeChecks(IsExpression node) {
-    Expression expression = node.expression;
-    TypeAnnotation typeName = node.type;
-    var rhsType = typeName.type as TypeImpl;
-    var rhsNameStr = typeName is TypeName ? typeName.name.name : null;
-    // if x is dynamic
-    if (rhsType.isDynamic && rhsNameStr == Keyword.DYNAMIC.lexeme) {
-      if (node.notOperator == null) {
-        // the is case
-        _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node);
-      } else {
-        // the is not case
-        _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node);
-      }
-      return true;
+    var leftNode = node.expression;
+    var rightNode = node.type;
+    var rightType = rightNode.type as TypeImpl;
+
+    void report() {
+      _errorReporter.reportErrorForNode(
+        node.notOperator == null
+            ? HintCode.UNNECESSARY_TYPE_CHECK_TRUE
+            : HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
+        node,
+      );
     }
+
+    // `is dynamic` or `is! dynamic`
+    if (rightType.isDynamic) {
+      var rightTypeStr = rightNode is TypeName ? rightNode.name.name : null;
+      if (rightTypeStr == Keyword.DYNAMIC.lexeme) {
+        report();
+        return true;
+      }
+      return false;
+    }
+
     // `is Null` or `is! Null`
-    if (rhsType.isDartCoreNull) {
-      if (expression is NullLiteral) {
-        if (node.notOperator == null) {
-          _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
-            node,
-          );
-        } else {
-          _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
-            node,
-          );
-        }
+    if (rightType.isDartCoreNull) {
+      if (leftNode is NullLiteral) {
+        report();
       } else {
-        if (node.notOperator == null) {
-          _errorReporter.reportErrorForNode(
-            HintCode.TYPE_CHECK_IS_NULL,
-            node,
-          );
-        } else {
-          _errorReporter.reportErrorForNode(
-            HintCode.TYPE_CHECK_IS_NOT_NULL,
-            node,
-          );
-        }
+        _errorReporter.reportErrorForNode(
+          node.notOperator == null
+              ? HintCode.TYPE_CHECK_IS_NULL
+              : HintCode.TYPE_CHECK_IS_NOT_NULL,
+          node,
+        );
       }
       return true;
     }
-    // `is Object` or `is! Object`
-    if (rhsType.isDartCoreObject) {
-      var nullability = rhsType.nullabilitySuffix;
-      if (nullability == NullabilitySuffix.star ||
-          nullability == NullabilitySuffix.question) {
-        if (node.notOperator == null) {
-          _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
-            node,
-          );
-        } else {
-          _errorReporter.reportErrorForNode(
-            HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
-            node,
-          );
-        }
+
+    if (_isNonNullableByDefault) {
+      var leftType = leftNode.typeOrThrow;
+      if (_typeSystem.isSubtypeOf(leftType, rightType)) {
+        report();
+        return true;
+      }
+    } else {
+      // In legacy all types are subtypes of `Object`.
+      if (rightType.isDartCoreObject) {
+        report();
         return true;
       }
     }
+
     return false;
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_test.dart
index fef92e8..ab55baf 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,16 +20,87 @@
 @reflectiveTest
 class UnnecessaryTypeCheckFalseTest extends PubPackageResolutionTest
     with UnnecessaryTypeCheckFalseTestCases {
-  @override
-  test_type_not_object() async {
+  test_typeNonNullable_isNot_same() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  a is! int;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 18, 9),
+    ]);
+  }
+
+  test_typeNonNullable_isNot_subtype() async {
     await assertNoErrorsInCode(r'''
-void f<T>(T a) {
-  a is! Object;
+void f(num a) {
+  a is! int;
 }
 ''');
   }
 
-  test_type_not_objectQuestion() async {
+  test_typeNonNullable_isNot_supertype() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  a is! num;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 18, 9),
+    ]);
+  }
+
+  test_typeNullable_isNot_same() async {
+    await assertErrorsInCode(r'''
+void f(int? a) {
+  a is! int?;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 19, 10),
+    ]);
+  }
+
+  test_typeNullable_isNot_same_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? a) {
+  a is! int;
+}
+''');
+  }
+
+  test_typeNullable_isNot_subtype() async {
+    await assertNoErrorsInCode(r'''
+void f(num? a) {
+  a is! int?;
+}
+''');
+  }
+
+  test_typeNullable_isNot_subtype_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(num? a) {
+  a is! int;
+}
+''');
+  }
+
+  test_typeNullable_isNot_supertype() async {
+    await assertErrorsInCode(r'''
+void f(int? a) {
+  a is! num?;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 19, 10),
+    ]);
+  }
+
+  test_typeNullable_isNot_supertype_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? a) {
+  a is! num;
+}
+''');
+  }
+
+  test_typeParameter_isNot_objectQuestion() async {
     await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is! Object?;
@@ -40,7 +112,7 @@
 }
 
 mixin UnnecessaryTypeCheckFalseTestCases on PubPackageResolutionTest {
-  test_null_not_Null() async {
+  test_null_isNot_Null() async {
     await assertErrorsInCode(r'''
 var b = null is! Null;
 ''', [
@@ -48,7 +120,7 @@
     ]);
   }
 
-  test_type_not_dynamic() async {
+  test_typeParameter_isNot_dynamic() async {
     await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is! dynamic;
@@ -58,35 +130,110 @@
     ]);
   }
 
-  test_type_not_object() async {
+  test_typeParameter_isNot_object() async {
+    var expectedErrors = expectedErrorsByNullability(
+      nullable: [],
+      legacy: [
+        error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 19, 12),
+      ],
+    );
     await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is! Object;
 }
-''', [
-      error(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, 19, 12),
-    ]);
+''', expectedErrors);
   }
 }
 
 @reflectiveTest
 class UnnecessaryTypeCheckFalseWithoutNullSafetyTest
     extends PubPackageResolutionTest
-    with UnnecessaryTypeCheckFalseTestCases, WithoutNullSafetyMixin {}
+    with WithoutNullSafetyMixin, UnnecessaryTypeCheckFalseTestCases {}
 
 @reflectiveTest
 class UnnecessaryTypeCheckTrueTest extends PubPackageResolutionTest
     with UnnecessaryTypeCheckTrueTestCases {
-  @override
-  test_type_is_object() async {
+  test_typeNonNullable_is_same() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  a is int;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 18, 8),
+    ]);
+  }
+
+  test_typeNonNullable_is_subtype() async {
     await assertNoErrorsInCode(r'''
-void f<T>(T a) {
-  a is Object;
+void f(num a) {
+  a is int;
 }
 ''');
   }
 
-  test_type_is_objectQuestion() async {
+  test_typeNonNullable_is_supertype() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  a is num;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 18, 8),
+    ]);
+  }
+
+  test_typeNullable_is_same() async {
+    await assertErrorsInCode(r'''
+void f(int? a) {
+  a is int?;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 19, 9),
+    ]);
+  }
+
+  test_typeNullable_is_same_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? a) {
+  a is int;
+}
+''');
+  }
+
+  test_typeNullable_is_subtype() async {
+    await assertNoErrorsInCode(r'''
+void f(num? a) {
+  a is int?;
+}
+''');
+  }
+
+  test_typeNullable_is_subtype_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(num? a) {
+  a is int;
+}
+''');
+  }
+
+  test_typeNullable_is_supertype() async {
+    await assertErrorsInCode(r'''
+void f(int? a) {
+  a is num?;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 19, 9),
+    ]);
+  }
+
+  test_typeNullable_is_supertype_nonNullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? a) {
+  a is num;
+}
+''');
+  }
+
+  test_typeParameter_is_objectQuestion() async {
     await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is Object?;
@@ -108,6 +255,26 @@
 
   test_type_is_dynamic() async {
     await assertErrorsInCode(r'''
+void f(int a) {
+  a is dynamic;
+}
+''', [
+      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 18, 12),
+    ]);
+  }
+
+  test_type_is_unresolved() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  a is Unresolved;
+}
+''', [
+      error(CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME, 23, 10),
+    ]);
+  }
+
+  test_typeParameter_is_dynamic() async {
+    await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is dynamic;
 }
@@ -116,18 +283,22 @@
     ]);
   }
 
-  test_type_is_object() async {
+  test_typeParameter_is_object() async {
+    var expectedErrors = expectedErrorsByNullability(
+      nullable: [],
+      legacy: [
+        error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 19, 11),
+      ],
+    );
     await assertErrorsInCode(r'''
 void f<T>(T a) {
   a is Object;
 }
-''', [
-      error(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, 19, 11),
-    ]);
+''', expectedErrors);
   }
 }
 
 @reflectiveTest
 class UnnecessaryTypeCheckTrueWithoutNullSafetyTest
     extends PubPackageResolutionTest
-    with UnnecessaryTypeCheckTrueTestCases, WithoutNullSafetyMixin {}
+    with WithoutNullSafetyMixin, UnnecessaryTypeCheckTrueTestCases {}
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 3f1b27e..a5faee7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1381,11 +1381,6 @@
     reportNonNullableInNullAwareWarningIfNeeded(
         lhsResult.inferredType, "??", node.left.fileOffset);
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(
-            lhsResult.inferredType, equalsName, node.fileOffset)
-        .member!;
-
     // This ends any shorting in `node.left`.
     Expression left = lhsResult.expression;
 
@@ -1420,9 +1415,7 @@
       VariableDeclaration variable =
           createVariable(left, lhsResult.inferredType);
       Expression equalsNull = inferrer.createEqualsNull(
-          lhsResult.expression.fileOffset,
-          createVariableGet(variable),
-          equalsMember);
+          lhsResult.expression.fileOffset, createVariableGet(variable));
       VariableGet variableGet = createVariableGet(variable);
       if (inferrer.library.isNonNullableByDefault &&
           !identical(nonNullableLhsType, originalLhsType)) {
@@ -3130,10 +3123,6 @@
         receiverType, node.propertyName, writeTarget, rhs,
         forEffect: node.forEffect, valueType: writeType);
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.fileOffset)
-        .member!;
-
     DartType nonNullableReadType = readType.toNonNull();
     DartType inferredType = inferrer.typeSchemaEnvironment
         .getStandardUpperBound(
@@ -3145,8 +3134,7 @@
       //
       //     let v1 = o in v1.a == null ? v1.a = b : null
       //
-      Expression equalsNull =
-          inferrer.createEqualsNull(node.fileOffset, read, equalsMember);
+      Expression equalsNull = inferrer.createEqualsNull(node.fileOffset, read);
       ConditionalExpression conditional = new ConditionalExpression(equalsNull,
           write, new NullLiteral()..fileOffset = node.fileOffset, inferredType)
         ..fileOffset = node.fileOffset;
@@ -3160,7 +3148,7 @@
       //
       VariableDeclaration readVariable = createVariable(read, readType);
       Expression equalsNull = inferrer.createEqualsNull(
-          node.fileOffset, createVariableGet(readVariable), equalsMember);
+          node.fileOffset, createVariableGet(readVariable));
       VariableGet variableGet = createVariableGet(readVariable);
       if (inferrer.library.isNonNullableByDefault &&
           !identical(nonNullableReadType, readType)) {
@@ -3194,10 +3182,6 @@
         .inferExpression(node.write, typeContext, true, isVoidAllowed: true);
     inferrer.flowAnalysis.ifNullExpression_end();
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.fileOffset)
-        .member!;
-
     DartType originalReadType = readType;
     DartType nonNullableReadType = originalReadType.toNonNull();
     DartType inferredType = inferrer.typeSchemaEnvironment
@@ -3210,8 +3194,7 @@
       //
       //     a == null ? a = b : null
       //
-      Expression equalsNull =
-          inferrer.createEqualsNull(node.fileOffset, read, equalsMember);
+      Expression equalsNull = inferrer.createEqualsNull(node.fileOffset, read);
       replacement = new ConditionalExpression(
           equalsNull,
           writeResult.expression,
@@ -3225,7 +3208,7 @@
       //
       VariableDeclaration readVariable = createVariable(read, readType);
       Expression equalsNull = inferrer.createEqualsNull(
-          node.fileOffset, createVariableGet(readVariable), equalsMember);
+          node.fileOffset, createVariableGet(readVariable));
       VariableGet variableGet = createVariableGet(readVariable);
       if (inferrer.library.isNonNullableByDefault &&
           !identical(nonNullableReadType, originalReadType)) {
@@ -3568,10 +3551,6 @@
     DartType readType = readResult.inferredType;
     inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.testOffset)
-        .member!;
-
     writeIndex = inferrer.ensureAssignable(
         writeIndexType, indexResult.inferredType, writeIndex,
         whyNotPromoted: whyNotPromotedIndex);
@@ -3623,8 +3602,7 @@
       //     let indexVariable = a in
       //         o[indexVariable] == null ? o.[]=(indexVariable, b) : null
       //
-      Expression equalsNull =
-          inferrer.createEqualsNull(node.testOffset, read, equalsMember);
+      Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
       ConditionalExpression conditional = new ConditionalExpression(equalsNull,
           write, new NullLiteral()..fileOffset = node.testOffset, inferredType)
         ..fileOffset = node.testOffset;
@@ -3656,7 +3634,7 @@
       //
       VariableDeclaration readVariable = createVariable(read, readType);
       Expression equalsNull = inferrer.createEqualsNull(
-          node.testOffset, createVariableGet(readVariable), equalsMember);
+          node.testOffset, createVariableGet(readVariable));
       VariableDeclaration writeVariable =
           createVariable(write, const VoidType());
       VariableGet variableGet = createVariableGet(readVariable);
@@ -3701,10 +3679,6 @@
     DartType readIndexType =
         inferrer.getIndexKeyType(readTarget, inferrer.thisType!);
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.testOffset)
-        .member!;
-
     ObjectAccessTarget writeTarget = node.setter != null
         ? new ObjectAccessTarget.interfaceMember(node.setter!,
             isPotentiallyNullable: false)
@@ -3807,8 +3781,7 @@
       //        super[v1] == null ? super.[]=(v1, b) : null
       //
       assert(valueVariable == null);
-      Expression equalsNull =
-          inferrer.createEqualsNull(node.testOffset, read, equalsMember);
+      Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
       replacement = new ConditionalExpression(equalsNull, write,
           new NullLiteral()..fileOffset = node.testOffset, inferredType)
         ..fileOffset = node.testOffset;
@@ -3826,7 +3799,7 @@
 
       VariableDeclaration readVariable = createVariable(read, readType);
       Expression equalsNull = inferrer.createEqualsNull(
-          node.testOffset, createVariableGet(readVariable), equalsMember);
+          node.testOffset, createVariableGet(readVariable));
       VariableDeclaration writeVariable =
           createVariable(write, const VoidType());
       VariableGet readVariableGet = createVariableGet(readVariable);
@@ -3925,10 +3898,6 @@
     DartType readType = readResult.inferredType;
     inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
 
-    Member equalsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.testOffset)
-        .member!;
-
     writeIndex = inferrer.ensureAssignable(
         writeIndexType, indexResult.inferredType, writeIndex);
 
@@ -3974,8 +3943,7 @@
       //          ? receiverVariable.[]=(indexVariable, b) : null
       //
       assert(valueVariable == null);
-      Expression equalsNull =
-          inferrer.createEqualsNull(node.testOffset, read, equalsMember);
+      Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
       replacement = new ConditionalExpression(equalsNull, write,
           new NullLiteral()..fileOffset = node.testOffset, inferredType)
         ..fileOffset = node.testOffset;
@@ -3994,7 +3962,7 @@
       //
       VariableDeclaration readVariable = createVariable(read, readType);
       Expression equalsNull = inferrer.createEqualsNull(
-          node.testOffset, createVariableGet(readVariable), equalsMember);
+          node.testOffset, createVariableGet(readVariable));
       VariableDeclaration writeVariable =
           createVariable(write, const VoidType());
       VariableGet readVariableGet = createVariableGet(readVariable);
@@ -5697,10 +5665,6 @@
     DartType readType = readResult.inferredType;
     inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
 
-    Member readEqualsMember = inferrer
-        .findInterfaceMember(readType, equalsName, node.testOffset)
-        .member!;
-
     VariableDeclaration? readVariable;
     if (!node.forEffect) {
       readVariable = createVariable(read, readType);
@@ -5741,7 +5705,7 @@
       //
 
       Expression readEqualsNull =
-          inferrer.createEqualsNull(node.readOffset, read, readEqualsMember);
+          inferrer.createEqualsNull(node.readOffset, read);
       replacement = new ConditionalExpression(readEqualsNull, write,
           new NullLiteral()..fileOffset = node.writeOffset, inferredType)
         ..fileOffset = node.writeOffset;
@@ -5756,8 +5720,8 @@
       //
       assert(readVariable != null);
 
-      Expression readEqualsNull = inferrer.createEqualsNull(
-          receiverVariable.fileOffset, read, readEqualsMember);
+      Expression readEqualsNull =
+          inferrer.createEqualsNull(receiverVariable.fileOffset, read);
       VariableGet variableGet = createVariableGet(readVariable!);
       if (inferrer.library.isNonNullableByDefault &&
           !identical(nonNullableReadType, readType)) {
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 80f997c..9e2f6f5 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
@@ -1872,15 +1872,7 @@
   }
 
   NullAwareGuard createNullAwareGuard(VariableDeclaration variable) {
-    Member? equalsMember =
-        findInterfaceMember(variable.type, equalsName, variable.fileOffset)
-            .member;
-    // Ensure operator == member even for `Never`.
-    equalsMember ??= findInterfaceMember(const DynamicType(), equalsName, -1,
-            instrumented: false)
-        .member!;
-    return new NullAwareGuard(
-        variable, variable.fileOffset, equalsMember, this);
+    return new NullAwareGuard(variable, variable.fileOffset, this);
   }
 
   ExpressionInferenceResult wrapExpressionInferenceResultInProblem(
@@ -3290,6 +3282,25 @@
             'checkGetterReturn', new InstrumentationValueForType(functionType));
       }
     }
+
+    if (isExpressionInvocation) {
+      if (isTopLevel) {
+        // Create an expression invocation for reporting the error during
+        // full inference.
+        return new ExpressionInferenceResult(
+            const InvalidType(),
+            new ExpressionInvocation(receiver, arguments)
+              ..fileOffset = fileOffset);
+      } else {
+        Expression error = helper!.buildProblem(
+            templateImplicitCallOfNonMethod.withArguments(
+                receiverType, isNonNullableByDefault),
+            fileOffset,
+            noLength);
+        return new ExpressionInferenceResult(const InvalidType(), error);
+      }
+    }
+
     ExpressionInferenceResult invocationResult = inferMethodInvocation(
         arguments.fileOffset,
         const Link<NullAwareGuard>(),
@@ -3303,15 +3314,6 @@
         isImplicitCall: true,
         implicitInvocationPropertyName: getter.name);
 
-    if (!isTopLevel && isExpressionInvocation) {
-      Expression error = helper!.buildProblem(
-          templateImplicitCallOfNonMethod.withArguments(
-              receiverType, isNonNullableByDefault),
-          fileOffset,
-          noLength);
-      return new ExpressionInferenceResult(const DynamicType(), error);
-    }
-
     if (!isTopLevel && target.isNullable) {
       // Handles cases like:
       //   C? c;
@@ -3475,6 +3477,24 @@
       }
     }
 
+    if (isExpressionInvocation) {
+      if (isTopLevel) {
+        // Create an expression invocation for reporting the error during
+        // full inference.
+        return new ExpressionInferenceResult(
+            const InvalidType(),
+            new ExpressionInvocation(receiver, arguments)
+              ..fileOffset = fileOffset);
+      } else {
+        Expression error = helper!.buildProblem(
+            templateImplicitCallOfNonMethod.withArguments(
+                receiverType, isNonNullableByDefault),
+            fileOffset,
+            noLength);
+        return new ExpressionInferenceResult(const InvalidType(), error);
+      }
+    }
+
     ExpressionInferenceResult invocationResult = inferMethodInvocation(
         arguments.fileOffset,
         const Link<NullAwareGuard>(),
@@ -3488,15 +3508,6 @@
         hoistedExpressions: hoistedExpressions,
         implicitInvocationPropertyName: field.name);
 
-    if (!isTopLevel && isExpressionInvocation) {
-      Expression error = helper!.buildProblem(
-          templateImplicitCallOfNonMethod.withArguments(
-              receiverType, isNonNullableByDefault),
-          fileOffset,
-          noLength);
-      return new ExpressionInferenceResult(const DynamicType(), error);
-    }
-
     if (!isTopLevel && target.isNullable) {
       // Handles cases like:
       //   C? c;
@@ -4471,10 +4482,8 @@
   }
 
   /// Creates a `e == null` test for the expression [left] using the
-  /// [fileOffset] as file offset for the created nodes and [equalsMember] as
-  /// the interface target of the created method invocation.
-  Expression createEqualsNull(
-      int fileOffset, Expression left, Member equalsMember) {
+  /// [fileOffset] as file offset for the created nodes.
+  Expression createEqualsNull(int fileOffset, Expression left) {
     return new EqualsNull(left)..fileOffset = fileOffset;
   }
 }
@@ -4808,20 +4817,15 @@
   /// The file offset used for the null-test.
   int _nullAwareFileOffset;
 
-  /// The [Member] used for the == call.
-  final Member _nullAwareEquals;
-
   final TypeInferrerImpl _inferrer;
 
-  NullAwareGuard(this._nullAwareVariable, this._nullAwareFileOffset,
-      this._nullAwareEquals, this._inferrer)
+  NullAwareGuard(
+      this._nullAwareVariable, this._nullAwareFileOffset, this._inferrer)
       // ignore: unnecessary_null_comparison
       : assert(_nullAwareVariable != null),
         // ignore: unnecessary_null_comparison
         assert(_nullAwareFileOffset != null),
         // ignore: unnecessary_null_comparison
-        assert(_nullAwareEquals != null),
-        // ignore: unnecessary_null_comparison
         assert(_inferrer != null) {
     // Ensure the initializer of [_nullAwareVariable] is promoted to
     // non-nullable.
@@ -4850,8 +4854,8 @@
     _inferrer.flowAnalysis.nullAwareAccess_end();
     // End non-nullable promotion of the initializer of [_nullAwareVariable].
     _inferrer.flowAnalysis.nullAwareAccess_end();
-    Expression equalsNull = _inferrer.createEqualsNull(_nullAwareFileOffset,
-        createVariableGet(_nullAwareVariable), _nullAwareEquals);
+    Expression equalsNull = _inferrer.createEqualsNull(
+        _nullAwareFileOffset, createVariableGet(_nullAwareVariable));
     ConditionalExpression condition = new ConditionalExpression(
         equalsNull,
         new NullLiteral()..fileOffset = _nullAwareFileOffset,
@@ -4864,8 +4868,7 @@
 
   @override
   String toString() =>
-      'NullAwareGuard($_nullAwareVariable,$_nullAwareFileOffset,'
-      '$_nullAwareEquals)';
+      'NullAwareGuard($_nullAwareVariable,$_nullAwareFileOffset)';
 }
 
 /// The result of an expression inference that is guarded with a null aware
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
index 9fbb059..d38841f 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.expect
@@ -22,22 +22,12 @@
 // var topLevel4 = 1.0("10");
 //                    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-// var topLevel5 = a(2);
-//                  ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 // var topLevel5 = a(2);
 //                  ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Too many positional arguments: 0 allowed, but 2 found.
-// Try removing the extra positional arguments.
-// var topLevel6 = a(2, "3");
-//                  ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
@@ -64,22 +54,12 @@
 //   1.0("10");
 //      ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   a(2);
-//    ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 //   a(2);
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Too many positional arguments: 0 allowed, but 2 found.
-// Try removing the extra positional arguments.
-//   a(2, "3");
-//    ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
@@ -155,17 +135,17 @@
 var topLevel4 = 1.0(\"10\");
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
 static field self::A* a = new self::A::•();
-static field core::String* topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel5 = a(2);
-                 ^" as{TypeError,ForDynamic} core::String*;
+                 ^";
 static field self::B* b = new self::B::•();
-static field core::String* topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel6 = a(2, \"3\");
-                 ^" as{TypeError,ForDynamic} core::String*;
+                 ^";
 static method _extension#0|get#call(lowered final core::int* #this) → core::String*
   return "My name is int";
 static method _extension#1|get#call(lowered final core::num* #this) → core::String*
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
index 173e1a4..1745cce 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.outline.expect
@@ -48,9 +48,9 @@
 static field core::String* topLevel3;
 static field core::String* topLevel4;
 static field self::A* a;
-static field core::String* topLevel5;
+static field invalid-type topLevel5;
 static field self::B* b;
-static field core::String* topLevel6;
+static field invalid-type topLevel6;
 static method _extension#0|get#call(lowered final core::int* #this) → core::String*
   ;
 static method _extension#1|get#call(lowered final core::num* #this) → core::String*
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
index f07583d..d38841f 100644
--- a/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.transformed.expect
@@ -22,22 +22,12 @@
 // var topLevel4 = 1.0("10");
 //                    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-// var topLevel5 = a(2);
-//                  ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 // var topLevel5 = a(2);
 //                  ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Too many positional arguments: 0 allowed, but 2 found.
-// Try removing the extra positional arguments.
-// var topLevel6 = a(2, "3");
-//                  ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
@@ -64,22 +54,12 @@
 //   1.0("10");
 //      ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   a(2);
-//    ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
 //   a(2);
 //    ^
 //
-// pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Too many positional arguments: 0 allowed, but 2 found.
-// Try removing the extra positional arguments.
-//   a(2, "3");
-//    ^
-//
 // pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
 //  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 // Try changing 'call' to a method or explicitly invoke 'call'.
@@ -155,13 +135,13 @@
 var topLevel4 = 1.0(\"10\");
                    ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
 static field self::A* a = new self::A::•();
-static field core::String* topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel5 = a(2);
                  ^";
 static field self::B* b = new self::B::•();
-static field core::String* topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var topLevel6 = a(2, \"3\");
diff --git a/pkg/front_end/testcases/general/call.dart.weak.expect b/pkg/front_end/testcases/general/call.dart.weak.expect
index c717175..f9559169 100644
--- a/pkg/front_end/testcases/general/call.dart.weak.expect
+++ b/pkg/front_end/testcases/general/call.dart.weak.expect
@@ -139,7 +139,7 @@
 static field dynamic string3 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
 static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
 static field self::CallableGetter* callableGetter = new self::CallableGetter::•();
-static field dynamic string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+static field invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var string5 = callableGetter(1);
@@ -171,7 +171,7 @@
 static field dynamic nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
 var nothing8 = callable.call.call.call();
                                       ^" in self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
-static field dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+static field invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var nothing9 = callableGetter();
@@ -191,7 +191,7 @@
   dynamic string3 = callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
   dynamic string4 = callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
   self::CallableGetter* callableGetter = new self::CallableGetter::•();
-  dynamic string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+  invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   var string5 = callableGetter(1);
@@ -223,7 +223,7 @@
   invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
   var nothing8 = callable.call.call.call();
                                         ^" in callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
-  dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+  invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   var nothing9 = callableGetter();
diff --git a/pkg/front_end/testcases/general/call.dart.weak.outline.expect b/pkg/front_end/testcases/general/call.dart.weak.outline.expect
index 9026e42..9d8c931 100644
--- a/pkg/front_end/testcases/general/call.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/call.dart.weak.outline.expect
@@ -45,7 +45,7 @@
 static field dynamic string3;
 static field dynamic string4;
 static field self::CallableGetter* callableGetter;
-static field dynamic string5;
+static field invalid-type string5;
 static field dynamic string6;
 static field dynamic string7;
 static field dynamic string8;
@@ -57,7 +57,7 @@
 static field dynamic nothing6;
 static field dynamic nothing7;
 static field dynamic nothing8;
-static field dynamic nothing9;
+static field invalid-type nothing9;
 static field dynamic nothing10;
 static field dynamic nothing11;
 static field dynamic nothing12;
diff --git a/pkg/front_end/testcases/general/call.dart.weak.transformed.expect b/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
index 5d9b478..ccac183 100644
--- a/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/call.dart.weak.transformed.expect
@@ -139,7 +139,7 @@
 static field dynamic string3 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
 static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
 static field self::CallableGetter* callableGetter = new self::CallableGetter::•();
-static field dynamic string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+static field invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var string5 = callableGetter(1);
@@ -171,7 +171,7 @@
 static field dynamic nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
 var nothing8 = callable.call.call.call();
                                       ^" in self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
-static field dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+static field invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
 var nothing9 = callableGetter();
@@ -191,7 +191,7 @@
   dynamic string3 = callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
   dynamic string4 = callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
   self::CallableGetter* callableGetter = new self::CallableGetter::•();
-  dynamic string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+  invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   var string5 = callableGetter(1);
@@ -223,7 +223,7 @@
   invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
   var nothing8 = callable.call.call.call();
                                         ^" in callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
-  dynamic nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+  invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
 Try changing 'call' to a method or explicitly invoke 'call'.
   var nothing9 = callableGetter();
diff --git a/pkg/front_end/testcases/general/function_call1.dart b/pkg/front_end/testcases/general/function_call1.dart
new file mode 100644
index 0000000..418da83
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart
@@ -0,0 +1,26 @@
+// 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.
+
+class _Closure1 {
+  _Closure1 get call => this;
+}
+
+class _Closure2 {
+  final _Closure2 call;
+
+  _Closure2(this.call);
+}
+
+test(_Closure1 foo, _Closure2 bar) {
+  foo();
+  bar();
+}
+
+late _Closure1 closure1;
+late _Closure2 closure2;
+
+var field1 = closure1();
+var field2 = closure2();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/function_call1.dart.textual_outline.expect b/pkg/front_end/testcases/general/function_call1.dart.textual_outline.expect
new file mode 100644
index 0000000..aa8f3d6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class _Closure1 {
+  _Closure1 get call => this;
+}
+
+class _Closure2 {
+  final _Closure2 call;
+  _Closure2(this.call);
+}
+
+test(_Closure1 foo, _Closure2 bar) {}
+late _Closure1 closure1;
+late _Closure2 closure2;
+var field1 = closure1();
+var field2 = closure2();
+main() {}
diff --git a/pkg/front_end/testcases/general/function_call1.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/function_call1.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9249223
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.textual_outline_modelled.expect
@@ -0,0 +1,19 @@
+class _Closure1 {
+  _Closure1 get call => this;
+}
+class _Closure2 {
+  _Closure2(this.call);
+  final _Closure2 call;
+}
+test(_Closure1 foo, _Closure2 bar) {}
+---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+_Closure1 closure1;
+---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+_Closure2 closure2;
+main() {}
+var field1 = closure1();
+var field2 = closure2();
diff --git a/pkg/front_end/testcases/general/function_call1.dart.weak.expect b/pkg/front_end/testcases/general/function_call1.dart.weak.expect
new file mode 100644
index 0000000..c5b503d
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → self::_Closure1
+    return this;
+}
+class _Closure2 extends core::Object {
+  final field self::_Closure2 call;
+  constructor •(self::_Closure2 call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_call1.dart.weak.outline.expect b/pkg/front_end/testcases/general/function_call1.dart.weak.outline.expect
new file mode 100644
index 0000000..8c62285
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.weak.outline.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    ;
+  get call() → self::_Closure1
+    ;
+}
+class _Closure2 extends core::Object {
+  final field self::_Closure2 call;
+  constructor •(self::_Closure2 call) → self::_Closure2
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1;
+static field invalid-type field2;
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/function_call1.dart.weak.transformed.expect b/pkg/front_end/testcases/general/function_call1.dart.weak.transformed.expect
new file mode 100644
index 0000000..c5b503d
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → self::_Closure1
+    return this;
+}
+class _Closure2 extends core::Object {
+  final field self::_Closure2 call;
+  constructor •(self::_Closure2 call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_call2.dart b/pkg/front_end/testcases/general/function_call2.dart
new file mode 100644
index 0000000..06322b9
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart
@@ -0,0 +1,26 @@
+// 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.
+
+class _Closure1 {
+  void Function() get call => () {};
+}
+
+class _Closure2 {
+  final void Function() call;
+
+  _Closure2(this.call);
+}
+
+test(_Closure1 foo, _Closure2 bar) {
+  foo();
+  bar();
+}
+
+late _Closure1 closure1;
+late _Closure2 closure2;
+
+var field1 = closure1();
+var field2 = closure2();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/function_call2.dart.textual_outline.expect b/pkg/front_end/testcases/general/function_call2.dart.textual_outline.expect
new file mode 100644
index 0000000..183ffbe
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class _Closure1 {
+  void Function() get call => () {};
+}
+
+class _Closure2 {
+  final void Function() call;
+  _Closure2(this.call);
+}
+
+test(_Closure1 foo, _Closure2 bar) {}
+late _Closure1 closure1;
+late _Closure2 closure2;
+var field1 = closure1();
+var field2 = closure2();
+main() {}
diff --git a/pkg/front_end/testcases/general/function_call2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/function_call2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..eab5305
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.textual_outline_modelled.expect
@@ -0,0 +1,19 @@
+class _Closure1 {
+  void Function() get call => () {};
+}
+class _Closure2 {
+  _Closure2(this.call);
+  final void Function() call;
+}
+test(_Closure1 foo, _Closure2 bar) {}
+---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+_Closure1 closure1;
+---- unknown chunk starts ----
+late
+---- unknown chunk ends ----
+_Closure2 closure2;
+main() {}
+var field1 = closure1();
+var field2 = closure2();
diff --git a/pkg/front_end/testcases/general/function_call2.dart.weak.expect b/pkg/front_end/testcases/general/function_call2.dart.weak.expect
new file mode 100644
index 0000000..c0f6881
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → () → void
+    return () → void {};
+}
+class _Closure2 extends core::Object {
+  final field () → void call;
+  constructor •(() → void call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_call2.dart.weak.outline.expect b/pkg/front_end/testcases/general/function_call2.dart.weak.outline.expect
new file mode 100644
index 0000000..704879e
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.weak.outline.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    ;
+  get call() → () → void
+    ;
+}
+class _Closure2 extends core::Object {
+  final field () → void call;
+  constructor •(() → void call) → self::_Closure2
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1;
+static field invalid-type field2;
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/function_call2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/function_call2.dart.weak.transformed.expect
new file mode 100644
index 0000000..c0f6881
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → () → void
+    return () → void {};
+}
+class _Closure2 extends core::Object {
+  final field () → void call;
+  constructor •(() → void call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_in_field.dart b/pkg/front_end/testcases/general/function_in_field.dart
index 8234ef2..ccfa71b 100644
--- a/pkg/front_end/testcases/general/function_in_field.dart
+++ b/pkg/front_end/testcases/general/function_in_field.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2017, 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.
+
 // @dart=2.9
+
 var x = () {
   var y = 42;
   return y;
diff --git a/pkg/front_end/testcases/general/issue47223a.dart b/pkg/front_end/testcases/general/issue47223a.dart
new file mode 100644
index 0000000..2191ad1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart
@@ -0,0 +1,9 @@
+// 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.
+
+void test() {
+  (throw "some value") ?? "some other value";
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47223a.dart.textual_outline.expect
new file mode 100644
index 0000000..31c91a2
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+void test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47223a.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4742c78
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+main() {}
+void test() {}
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.weak.expect b/pkg/front_end/testcases/general/issue47223a.dart.weak.expect
new file mode 100644
index 0000000..1640c03
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.weak.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223a.dart:6:4: Warning: Operand of null-aware operation '??' has type 'Never' which excludes null.
+//   (throw "some value") ?? "some other value";
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1 == null ?{core::String} "some other value" : #t1;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47223a.dart.weak.outline.expect
new file mode 100644
index 0000000..d7d3d2f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.weak.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47223a.dart.weak.transformed.expect
new file mode 100644
index 0000000..1640c03
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.weak.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223a.dart:6:4: Warning: Operand of null-aware operation '??' has type 'Never' which excludes null.
+//   (throw "some value") ?? "some other value";
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1 == null ?{core::String} "some other value" : #t1;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart b/pkg/front_end/testcases/general/issue47223b.dart
new file mode 100644
index 0000000..8528113
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart
@@ -0,0 +1,9 @@
+// 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.
+
+void test() {
+  (throw "some value").foo ??= "foo";
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47223b.dart.textual_outline.expect
new file mode 100644
index 0000000..31c91a2
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+void test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47223b.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4742c78
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+main() {}
+void test() {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.weak.expect b/pkg/front_end/testcases/general/issue47223b.dart.weak.expect
new file mode 100644
index 0000000..13e925e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.weak.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223b.dart:6:24: Warning: Operand of null-aware operation '??=' has type 'Never' which excludes null.
+//   (throw "some value").foo ??= "foo";
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1{Never}.foo == null ?{core::String} #t1{Never}.foo = "foo" : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47223b.dart.weak.outline.expect
new file mode 100644
index 0000000..d7d3d2f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.weak.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47223b.dart.weak.transformed.expect
new file mode 100644
index 0000000..13e925e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.weak.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223b.dart:6:24: Warning: Operand of null-aware operation '??=' has type 'Never' which excludes null.
+//   (throw "some value").foo ??= "foo";
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1{Never}.foo == null ?{core::String} #t1{Never}.foo = "foo" : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart b/pkg/front_end/testcases/inference/bug30624.dart
index c074277..341d1e5 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart
+++ b/pkg/front_end/testcases/inference/bug30624.dart
@@ -9,21 +9,21 @@
 
 class C<E> {
   void barA([int cmp(E a, E b)]) {
-    /*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? _default);
+    /*@ typeArgs=C::E* */ foo(this, cmp  ?? _default);
   }
 
   void barB([int cmp(E a, E b)]) {
     /*@ typeArgs=C::E* */ foo(
-        this, cmp /*@target=Object.==*/ ?? (_default as int Function(E, E)));
+        this, cmp  ?? (_default as int Function(E, E)));
   }
 
   void barC([int cmp(E a, E b)]) {
     int Function(E, E) v = _default;
-    /*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? v);
+    /*@ typeArgs=C::E* */ foo(this, cmp  ?? v);
   }
 
   void barD([int cmp(E a, E b)]) {
-    foo<E>(this, cmp /*@target=Object.==*/ ?? _default);
+    foo<E>(this, cmp  ?? _default);
   }
 
   void barE([int cmp(E a, E b)]) {
diff --git a/pkg/front_end/testcases/inference/bug32291.dart b/pkg/front_end/testcases/inference/bug32291.dart
index c71cdb6..782a12c 100644
--- a/pkg/front_end/testcases/inference/bug32291.dart
+++ b/pkg/front_end/testcases/inference/bug32291.dart
@@ -12,7 +12,7 @@
   var /*@ type=Iterable<List<String*>*>* */ i1 =
       l. /*@target=Iterable.map*/ /*@ typeArgs=List<String*>* */ map(
           /*@ returnType=List<String*>* */ (/*@ type=List<String*>* */ ll) =>
-              ll /*@target=List.==*/ ?? /*@ typeArgs=String* */ []);
+              ll ?? /*@ typeArgs=String* */ []);
   var /*@ type=Iterable<int*>* */ i2 =
       i1. /*@target=Iterable.map*/ /*@ typeArgs=int* */ map(
           /*@ returnType=int* */ (List<String> l) =>
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart b/pkg/front_end/testcases/inference/future_then_ifNull.dart
index e3927d5..5b67f07 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart
@@ -18,20 +18,18 @@
   MyFuture<int> f;
   Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
       /*@ returnType=Future<int*>* */ (/*@ type=int* */ x) async =>
-          x /*@target=num.==*/ ?? await new Future<int>.value(3));
+          x ?? await new Future<int>.value(3));
   Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
       /*@returnType=FutureOr<int*>**/ (/*@ type=int* */ x) async {
-    return /*info:DOWN_CAST_COMPOSITE*/ await x /*@target=num.==*/ ??
-        new Future<int>.value(3);
+    return /*info:DOWN_CAST_COMPOSITE*/ await x ?? new Future<int>.value(3);
   });
   Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
       /*error:INVALID_CAST_FUNCTION_EXPR*/
       /*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) =>
-          x /*@target=num.==*/ ?? new Future<int>.value(3));
+          x ?? new Future<int>.value(3));
   Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
       /*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) {
-    return /*info:DOWN_CAST_COMPOSITE*/ x /*@target=num.==*/ ??
-        new Future<int>.value(3);
+    return /*info:DOWN_CAST_COMPOSITE*/ x ?? new Future<int>.value(3);
   });
 }
 
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
index bcc3b3f..ea24047 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
@@ -7,8 +7,7 @@
 
 abstract class C<E> {
   void sort([int compare(E a, E b)]) {
-    /*@ typeArgs=C::E* */ sort2(
-        this, compare /*@target=Object.==*/ ?? _compareAny);
+    /*@ typeArgs=C::E* */ sort2(this, compare ?? _compareAny);
   }
 
   static int _compareAny(a, b) {
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
index 51b65c1..c8f9c85 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
@@ -25,7 +25,7 @@
     /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
 
     /*@target=Test.member*/ /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -46,7 +46,7 @@
         /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 = /*@target=Test.member*/ /*@target=Test.member*/
-        member /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+        member  ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = /*@target=Test.member*/ /*@target=Test.member*/
         member /*@target=B.+*/ +=
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
index 9de089d..7892af4 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
@@ -16,7 +16,7 @@
     var /*@ type=int* */ v1 = /*@target=Test1.t*/ t = getInt();
 
     var /*@ type=int* */ v4 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=int* */ v7 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
         /*@target=num.+*/ += getInt();
@@ -41,13 +41,13 @@
     var /*@ type=double* */ v3 = /*@target=Test2.t*/ t = getDouble();
 
     var /*@ type=num* */ v4 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
         /*@target=num.+*/ += getInt();
@@ -74,7 +74,7 @@
     var /*@ type=double* */ v3 = /*@target=Test3.t*/ t = getDouble();
 
     var /*@ type=double* */ v6 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
         /*@target=double.+*/ += getInt();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
index b1840b1..f72d8ca 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
@@ -31,7 +31,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/
+        
         ??= /*@ typeArgs=B* */ f();
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
@@ -56,7 +56,7 @@
 
     var /*@ type=B* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/
+        
         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
index 4685ee6..f9e36a6 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
@@ -31,7 +31,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
 
     super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
-            /*@ typeArgs=Index* */ f()] /*@target=A.==*/
+            /*@ typeArgs=Index* */ f()] 
         ??= /*@ typeArgs=B* */ f();
 
     super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
@@ -56,7 +56,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
-            /*@ typeArgs=Index* */ f()] /*@target=A.==*/
+            /*@ typeArgs=Index* */ f()] 
         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
index 469bb25..d42816b 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
@@ -29,7 +29,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
 
     this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
-            /*@ typeArgs=Index* */ f()] /*@target=A.==*/
+            /*@ typeArgs=Index* */ f()] 
         ??= /*@ typeArgs=B* */ f();
 
     this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
@@ -54,7 +54,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
-            /*@ typeArgs=Index* */ f()] /*@target=A.==*/
+            /*@ typeArgs=Index* */ f()] 
         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v4 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart b/pkg/front_end/testcases/inference/infer_assign_to_local.dart
index 8123404..56ebaa0 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart
@@ -22,7 +22,7 @@
   B local;
   local = /*@ typeArgs=B* */ f();
 
-  local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  local  ??= /*@ typeArgs=B* */ f();
 
   local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -37,7 +37,7 @@
   var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      local  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 = local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
index 8dc2a3e..282340c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
@@ -12,7 +12,7 @@
 void test1(int t) {
   var /*@ type=int* */ v1 = t = getInt();
 
-  var /*@ type=int* */ v4 = t /*@target=num.==*/ ??= getInt();
+  var /*@ type=int* */ v4 = t  ??= getInt();
 
   var /*@ type=int* */ v7 = t /*@target=num.+*/ += getInt();
 
@@ -29,11 +29,11 @@
 
   var /*@ type=double* */ v3 = t = getDouble();
 
-  var /*@ type=num* */ v4 = t /*@target=num.==*/ ??= getInt();
+  var /*@ type=num* */ v4 = t  ??= getInt();
 
-  var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = t  ??= getNum();
 
-  var /*@ type=num* */ v6 = t /*@target=num.==*/ ??= getDouble();
+  var /*@ type=num* */ v6 = t  ??= getDouble();
 
   var /*@ type=num* */ v7 = t /*@target=num.+*/ += getInt();
 
@@ -50,7 +50,7 @@
 void test3(double t) {
   var /*@ type=double* */ v3 = t = getDouble();
 
-  var /*@ type=double* */ v6 = t /*@target=num.==*/ ??= getDouble();
+  var /*@ type=double* */ v6 = t  ??= getDouble();
 
   var /*@ type=double* */ v7 = t /*@target=double.+*/ += getInt();
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
index c112d9c..24d478e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
@@ -24,7 +24,7 @@
   static void test(Test t) {
     t. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
     /*@ type=Test* */ /*@target=Test.member*/ t. /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
     /*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
     /*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
@@ -40,7 +40,7 @@
     var /*@ type=B* */ v2 =
         /*@ type=Test* */ /*@target=Test.member*/ t
                 . /*@target=Test.member*/ member
-            /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+             ??= /*@ typeArgs=B* */ f();
     var /*@ type=A* */ v3 =
         /*@ type=Test* */ t
                 . /*@target=Test.member*/ /*@target=Test.member*/ member
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
index a41c144..f810644 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
@@ -22,62 +22,62 @@
   B member;
 
   static void test(Test t) {
-    /*@ type=Test* */ /*@target=Test.==*/ t?. /*@target=Test.member*/
+    /*@ type=Test* */  t?. /*@target=Test.member*/
         member = /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t
+     t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t
+     t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
-    /*@target=Test.==*/ t
+     t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.**/ *= /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t
+     t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.&*/ &= /*@ typeArgs=A* */ f();
 
-    /*@target=B.-*/ -- /*@target=Test.==*/ t
+    /*@target=B.-*/ --  t
         ?. /*@target=Test.member*/ /*@target=Test.member*/ member;
 
-    /*@target=Test.==*/ t
+     t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.-*/ --;
 
     var /*@ type=B* */ v1 =
-        /*@ type=Test* */ /*@target=Test.==*/ t?. /*@target=Test.member*/
+        /*@ type=Test* */  t?. /*@target=Test.member*/
             member = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
-            /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+             ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
     var /*@ type=B* */ v4 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.**/ *= /*@ typeArgs=B* */ f();
 
     var /*@ type=C* */ v5 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.&*/ &= /*@ typeArgs=A* */ f();
 
     var /*@ type=B* */ v6 =
-        /*@target=B.-*/ -- /*@target=Test.==*/ t
+        /*@target=B.-*/ --  t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member;
 
     var /*@ type=B* */ v7 =
-        /*@target=Test.==*/ t
+         t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.-*/ --;
   }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
index ad284c2..82e2b7c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
@@ -13,24 +13,24 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Test1.==*/ t
+    var /*@ type=int* */ v1 = /*@ type=Test1* */  t
         ?. /*@target=Test1.prop*/ prop = getInt();
 
     var /*@ type=int* */ v4 =
-        /*@target=Test1.==*/ t
+         t
                 ?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=int* */ v7 =
-        /*@target=Test1.==*/ t
+         t
                 ?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
             /*@target=num.+*/ += getInt();
 
-    var /*@ type=int* */ v10 = /*@target=num.+*/ ++ /*@target=Test1.==*/ t
+    var /*@ type=int* */ v10 = /*@target=num.+*/ ++  t
         ?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop;
 
     var /*@ type=int* */ v11 =
-        /*@target=Test1.==*/ t
+         t
             ?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
         /*@target=num.+*/ ++;
   }
@@ -40,49 +40,49 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=int* */ v1 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getInt();
 
-    var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=num* */ v2 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getNum();
 
-    var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=double* */ v3 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getDouble();
 
     var /*@ type=num* */ v4 =
-        /*@target=Test2.==*/ t
+         t
                 ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
-        /*@target=Test2.==*/ t
+         t
                 ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
-    var /*@ type=num* */ v6 = /*@target=Test2.==*/ t
+    var /*@ type=num* */ v6 =  t
             ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 =
-        /*@target=Test2.==*/ t
+         t
                 ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
             /*@target=num.+*/ += getInt();
 
     var /*@ type=num* */ v8 =
-        /*@target=Test2.==*/ t
+         t
                 ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
             /*@target=num.+*/ += getNum();
 
     var /*@ type=num* */ v9 =
-        /*@target=Test2.==*/ t
+         t
                 ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
             /*@target=num.+*/ += getDouble();
 
-    var /*@ type=num* */ v10 = /*@target=num.+*/ ++ /*@target=Test2.==*/ t
+    var /*@ type=num* */ v10 = /*@target=num.+*/ ++  t
         ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop;
 
     var /*@ type=num* */ v11 =
-        /*@target=Test2.==*/ t
+         t
             ?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
         /*@target=num.+*/ ++;
   }
@@ -93,35 +93,35 @@
 
   static void test3(Test3 t) {
     var /*@ type=double* */ v3 =
-        /*@ type=Test3* */ /*@target=Test3.==*/ t
+        /*@ type=Test3* */  t
             ?. /*@target=Test3.prop*/ prop = getDouble();
 
     var /*@ type=double* */ v6 =
-        /*@target=Test3.==*/ t?.
+         t?.
                 /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=double* */ v7 =
-        /*@target=Test3.==*/ t
+         t
                 ?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
             /*@target=double.+*/ += getInt();
 
     var /*@ type=double* */ v8 =
-        /*@target=Test3.==*/ t
+         t
                 ?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
             /*@target=double.+*/ += getNum();
 
     var /*@ type=double* */ v9 =
-        /*@target=Test3.==*/ t?.
+         t?.
                 /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
             /*@target=double.+*/ += getDouble();
 
     var /*@ type=double* */ v10 = /*@target=double.+*/ ++
-        /*@target=Test3.==*/ t
+         t
             ?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop;
 
     var /*@ type=double* */ v11 =
-        /*@target=Test3.==*/ t
+         t
             ?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
         /*@target=double.+*/ ++;
   }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
index e626518..1c94bce 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
@@ -27,7 +27,7 @@
     super.member = /*@ typeArgs=B* */ f();
 
     super. /*@target=Base.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     super. /*@target=Base.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -46,7 +46,7 @@
     var /*@ type=B* */ v1 = super.member = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 = super. /*@target=Base.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = super. /*@target=Base.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
index 5bb229f..b7a994d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
@@ -20,7 +20,7 @@
     var /*@ type=int* */ v1 = super.intProp = getInt();
 
     var /*@ type=int* */ v4 = super. /*@target=Base.intProp*/ intProp
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=int* */ v7 = super. /*@target=Base.intProp*/ intProp
         /*@target=num.+*/ += getInt();
@@ -43,13 +43,13 @@
     var /*@ type=double* */ v3 = super.numProp = getDouble();
 
     var /*@ type=num* */ v4 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = super. /*@target=Base.numProp*/ numProp
         /*@target=num.+*/ += getInt();
@@ -77,7 +77,7 @@
     var /*@ type=double* */ v3 = super.doubleProp = getDouble();
 
     var /*@ type=double* */ v6 = super. /*@target=Base.doubleProp*/ doubleProp
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = super. /*@target=Base.doubleProp*/ doubleProp
         /*@target=double.+*/ += getInt();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
index 26d84f6..541e475 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
@@ -16,7 +16,7 @@
     var /*@ type=int* */ v1 = t. /*@target=Test1.prop*/ prop = getInt();
     var /*@ type=int* */ v4 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
             . /*@target=Test1.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
     var /*@ type=int* */ v7 =
         /*@ type=Test1* */ t. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
             /*@target=num.+*/ += getInt();
@@ -37,13 +37,13 @@
     var /*@ type=double* */ v3 = t. /*@target=Test2.prop*/ prop = getDouble();
     var /*@ type=num* */ v4 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
     var /*@ type=num* */ v5 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
     var /*@ type=num* */ v6 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
     var /*@ type=num* */ v7 =
         /*@ type=Test2* */ t. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
             /*@target=num.+*/ += getInt();
@@ -68,7 +68,7 @@
     var /*@ type=double* */ v3 = t. /*@target=Test3.prop*/ prop = getDouble();
     var /*@ type=double* */ v6 =
         /*@ type=Test3* */ /*@target=Test3.prop*/ t. /*@target=Test3.prop*/
-            prop /*@target=num.==*/ ??= getDouble();
+            prop  ??= getDouble();
     var /*@ type=double* */ v7 =
         /*@ type=Test3* */ t. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
             /*@target=double.+*/ += getInt();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart b/pkg/front_end/testcases/inference/infer_assign_to_static.dart
index 1f4c19b..c09b270 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart
@@ -25,7 +25,7 @@
 void test_topLevelVariable() {
   topLevelVariable = /*@ typeArgs=B* */ f();
 
-  topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  topLevelVariable  ??= /*@ typeArgs=B* */ f();
 
   topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -40,7 +40,7 @@
   var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      topLevelVariable  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 =
       topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -60,7 +60,7 @@
 void test_staticVariable() {
   B.staticVariable = /*@ typeArgs=B* */ f();
 
-  B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  B.staticVariable  ??= /*@ typeArgs=B* */ f();
 
   B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -75,7 +75,7 @@
   var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      B.staticVariable  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 =
       B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
index 157f454..22ed9e5 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
@@ -16,7 +16,7 @@
 void test1() {
   var /*@ type=int* */ v1 = topLevelInt = getInt();
 
-  var /*@ type=int* */ v4 = topLevelInt /*@target=num.==*/ ??= getInt();
+  var /*@ type=int* */ v4 = topLevelInt  ??= getInt();
 
   var /*@ type=int* */ v7 = topLevelInt /*@target=num.+*/ += getInt();
 
@@ -33,11 +33,11 @@
 
   var /*@ type=double* */ v3 = topLevelNum = getDouble();
 
-  var /*@ type=num* */ v4 = topLevelNum /*@target=num.==*/ ??= getInt();
+  var /*@ type=num* */ v4 = topLevelNum  ??= getInt();
 
-  var /*@ type=num* */ v5 = topLevelNum /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = topLevelNum  ??= getNum();
 
-  var /*@ type=num* */ v6 = topLevelNum /*@target=num.==*/ ??= getDouble();
+  var /*@ type=num* */ v6 = topLevelNum  ??= getDouble();
 
   var /*@ type=num* */ v7 = topLevelNum /*@target=num.+*/ += getInt();
 
@@ -55,7 +55,7 @@
   var /*@ type=double* */ v3 = topLevelDouble = getDouble();
 
   var /*@ type=double* */ v6 =
-      topLevelDouble /*@target=num.==*/ ??= getDouble();
+      topLevelDouble  ??= getDouble();
 
   var /*@ type=double* */ v7 = topLevelDouble /*@target=double.+*/ += getInt();
 
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
index c1906ab..2d019d6 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
@@ -10,9 +10,8 @@
 }
 
 g(C c) {
-  var /*@ type=int* */ x = /*@ type=C* */ /*@target=C.==*/ c
-      ?. /*@target=C.f*/ f();
-  /*@ type=C* */ /*@target=C.==*/ c?. /*@target=C.f*/ f();
+  var /*@ type=int* */ x = /*@ type=C* */ c?. /*@target=C.f*/ f();
+  /*@ type=C* */ c?. /*@target=C.f*/ f();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart b/pkg/front_end/testcases/inference/null_aware_property_get.dart
index bc20ea3..3d2edef 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart
@@ -10,9 +10,8 @@
 }
 
 void f(C c) {
-  var /*@ type=int* */ x = /*@ type=C* */ /*@target=C.==*/ c
-      ?. /*@target=C.x*/ x;
-  /*@ type=C* */ /*@target=C.==*/ c?. /*@target=C.x*/ x;
+  var /*@ type=int* */ x = /*@ type=C* */ c?. /*@target=C.x*/ x;
+  /*@ type=C* */ c?. /*@target=C.x*/ x;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart b/pkg/front_end/testcases/inference/null_coalescing_operator.dart
index f68c07f..8ce2e52 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart
@@ -7,7 +7,6 @@
 
 main() {
   List<int> x;
-  var /*@ type=List<int*>* */ y =
-      x /*@target=List.==*/ ?? /*@ typeArgs=int* */ [];
+  var /*@ type=List<int*>* */ y = x ?? /*@ typeArgs=int* */ [];
   List<int> z = y;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
index a6dfbb3..f84a4e4 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
@@ -7,5 +7,5 @@
 
 main() {
   List<int> x;
-  List<num> y = x /*@target=List.==*/ ?? /*@ typeArgs=num* */ [];
+  List<num> y = x ?? /*@ typeArgs=num* */ [];
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
index 22d5c37..ff8a546 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
@@ -25,7 +25,7 @@
     /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
 
     /*@target=Test.member*/ /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -47,7 +47,7 @@
 
     var /*@ type=B* */ v2 = /*@target=Test.member*/ /*@target=Test.member*/
         member
-            /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+             ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 =
         /*@target=Test.member*/ /*@target=Test.member*/ member
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
index c4cdedf..422d372 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
@@ -18,10 +18,10 @@
     var /*@ type=num* */ v2 = /*@target=Test1.t*/ t = getNum();
 
     var /*@ type=int* */ v4 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=int* */ v7 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
         /*@target=num.+*/ += getInt();
@@ -49,13 +49,13 @@
     var /*@ type=double* */ v3 = /*@target=Test2.t*/ t = getDouble();
 
     var /*@ type=num* */ v4 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
         /*@target=num.+*/ += getInt();
@@ -84,10 +84,10 @@
     var /*@ type=double* */ v3 = /*@target=Test3.t*/ t = getDouble();
 
     var /*@ type=num* */ v5 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v6 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
         /*@target=double.+*/ += getInt();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
index cd0681b..39a70e4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
@@ -32,7 +32,7 @@
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -57,7 +57,7 @@
 
     var /*@ type=B* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
index 5cd412f..e4108f8 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
@@ -38,7 +38,7 @@
         /*@ typeArgs=Index* */ f()] = /*@ typeArgs=A* */ f();
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=A* */ f();
+         ??= /*@ typeArgs=A* */ f();
 
     t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
         /*@target=B.+*/ += /*@ typeArgs=E* */ f();
@@ -54,7 +54,7 @@
 
     var /*@ type=A* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=A* */ f();
+         ??= /*@ typeArgs=A* */ f();
 
     var /*@ type=D* */ v3 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
index 8817a4a..89b4f0a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
@@ -32,7 +32,7 @@
 
     super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
             /*@ typeArgs=Index* */ f()]
@@ -57,7 +57,7 @@
 
     var /*@ type=B* */ v2 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
             /*@ typeArgs=Index* */ f()]
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
index 2caca66..afa9f53 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
@@ -25,11 +25,11 @@
 
     var /*@ type=int* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=int* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -57,15 +57,15 @@
 
     var /*@ type=int* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=num* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=int* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -95,11 +95,11 @@
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=num* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=int* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -129,11 +129,11 @@
 
     var /*@ type=num* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=num* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -161,15 +161,15 @@
 
     var /*@ type=num* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=num* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=num* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -199,11 +199,11 @@
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=num* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=num* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -233,11 +233,11 @@
 
     var /*@ type=num* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=double* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -265,15 +265,15 @@
 
     var /*@ type=num* */ v4 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getInt();
+             ??= getInt();
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=double* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=double* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
@@ -303,11 +303,11 @@
 
     var /*@ type=num* */ v5 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getNum();
+             ??= getNum();
 
     var /*@ type=double* */ v6 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
     var /*@ type=double* */ v7 =
         super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
index 8684930..e0b9ec5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
@@ -30,7 +30,7 @@
 
     this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
@@ -55,7 +55,7 @@
 
     var /*@ type=B* */ v2 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
             /*@ typeArgs=Index* */ f()]
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
index f9e34c4..f6d9aab 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
@@ -20,11 +20,11 @@
 
     var /*@ type=int* */ v4 = this
             /*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=int* */ v7 = this
             /*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
@@ -56,15 +56,15 @@
 
     var /*@ type=int* */ v4 = this
             /*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = this
             /*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=int* */ v7 = this
             /*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
@@ -98,11 +98,11 @@
 
     var /*@ type=num* */ v5 = this
             /*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = this
             /*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=int* */ v7 = this
             /*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
@@ -136,11 +136,11 @@
 
     var /*@ type=num* */ v4 = this
             /*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v7 = this
             /*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
@@ -172,15 +172,15 @@
 
     var /*@ type=num* */ v4 = this
             /*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = this
             /*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = this
             /*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
@@ -214,11 +214,11 @@
 
     var /*@ type=num* */ v5 = this
             /*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = this
             /*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = this
             /*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
@@ -253,11 +253,11 @@
 
     var /*@ type=num* */ v4 = this
             /*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v7 = this
             /*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
@@ -291,15 +291,15 @@
 
     var /*@ type=num* */ v4 = this
             /*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = this
             /*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v6 = this
             /*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = this
             /*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
@@ -334,11 +334,11 @@
 
     var /*@ type=num* */ v5 = this
             /*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v6 = this
             /*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = this
             /*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
index caebb26..7980f3f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
@@ -20,10 +20,10 @@
   var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
 
   var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=int* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -48,13 +48,13 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=int* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -81,10 +81,10 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=int* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -111,10 +111,10 @@
   var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
 
   var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=num* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -139,13 +139,13 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=num* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -172,10 +172,10 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=num* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
@@ -202,10 +202,10 @@
   var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
 
   var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=double* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
@@ -231,13 +231,13 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getInt();
+       ??= getInt();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=double* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
@@ -265,10 +265,10 @@
   var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
 
   var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getNum();
+       ??= getNum();
 
   var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
-      /*@target=num.==*/ ??= getDouble();
+       ??= getDouble();
 
   var /*@ type=double* */ v7 =
       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
index 17b741e..d6b952a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
@@ -22,7 +22,7 @@
   B local;
   local = /*@ typeArgs=B* */ f();
 
-  local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  local  ??= /*@ typeArgs=B* */ f();
 
   local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -37,7 +37,7 @@
   var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      local  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 = local
       /*@target=B.+*/ += /*@ typeArgs=C* */ f();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
index 52101cc..6a3242d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
@@ -14,9 +14,9 @@
 
   var /*@ type=num* */ v2 = t = getNum();
 
-  var /*@ type=int* */ v4 = t /*@target=num.==*/ ??= getInt();
+  var /*@ type=int* */ v4 = t ??= getInt();
 
-  var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = t ??= getNum();
 
   var /*@ type=int* */ v7 = t /*@target=num.+*/ += getInt();
 
@@ -35,11 +35,11 @@
 
   var /*@ type=double* */ v3 = t = getDouble();
 
-  var /*@ type=num* */ v4 = t /*@target=num.==*/ ??= getInt();
+  var /*@ type=num* */ v4 = t ??= getInt();
 
-  var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = t ??= getNum();
 
-  var /*@ type=num* */ v6 = t /*@target=num.==*/ ??= getDouble();
+  var /*@ type=num* */ v6 = t ??= getDouble();
 
   var /*@ type=num* */ v7 = t /*@target=num.+*/ += getInt();
 
@@ -58,9 +58,9 @@
 
   var /*@ type=double* */ v3 = t = getDouble();
 
-  var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = t ??= getNum();
 
-  var /*@ type=double* */ v6 = t /*@target=num.==*/ ??= getDouble();
+  var /*@ type=double* */ v6 = t ??= getDouble();
 
   var /*@ type=double* */ v7 = t /*@target=double.+*/ += getInt();
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
index c112d9c..24d478e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
@@ -24,7 +24,7 @@
   static void test(Test t) {
     t. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
     /*@ type=Test* */ /*@target=Test.member*/ t. /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
     /*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
     /*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
@@ -40,7 +40,7 @@
     var /*@ type=B* */ v2 =
         /*@ type=Test* */ /*@target=Test.member*/ t
                 . /*@target=Test.member*/ member
-            /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+             ??= /*@ typeArgs=B* */ f();
     var /*@ type=A* */ v3 =
         /*@ type=Test* */ t
                 . /*@target=Test.member*/ /*@target=Test.member*/ member
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
index 5719c09..0905ef9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
@@ -22,60 +22,60 @@
   B member;
 
   static void test(Test t) {
-    /*@ type=Test* */ /*@target=Test.==*/ t
+    /*@ type=Test* */  t
         ?. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t?.
+     t?.
             /*@target=Test.member*/ /*@target=Test.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t?.
+     t?.
             /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
-    /*@target=Test.==*/ t?.
+     t?.
             /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.**/ *= /*@ typeArgs=B* */ f();
 
-    /*@target=Test.==*/ t?.
+     t?.
             /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.&*/ &= /*@ typeArgs=A* */ f();
 
-    /*@target=B.-*/ -- /*@target=Test.==*/ t?.
+    /*@target=B.-*/ --  t?.
         /*@target=Test.member*/ /*@target=Test.member*/ member;
 
-    /*@target=Test.==*/ t?.
+     t?.
             /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.-*/ --;
 
     var /*@ type=B* */ v1 =
-        /*@ type=Test* */ /*@target=Test.==*/ t
+        /*@ type=Test* */  t
             ?. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
-            /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+             ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
     var /*@ type=B* */ v4 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.**/ *= /*@ typeArgs=B* */ f();
 
     var /*@ type=C* */ v5 =
-        /*@target=Test.==*/ t
+         t
                 ?. /*@target=Test.member*/ /*@target=Test.member*/ member
             /*@target=B.&*/ &= /*@ typeArgs=A* */ f();
 
-    var /*@ type=B* */ v6 = /*@target=B.-*/ -- /*@target=Test.==*/ t
+    var /*@ type=B* */ v6 = /*@target=B.-*/ --  t
         ?. /*@target=Test.member*/ /*@target=Test.member*/ member;
 
-    var /*@ type=B* */ v7 = /*@target=Test.==*/ t
+    var /*@ type=B* */ v7 =  t
             ?. /*@target=Test.member*/ /*@target=Test.member*/ member
         /*@target=B.-*/ --;
   }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
index b72b887..692f54f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
@@ -13,33 +13,33 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Test1.==*/ t
+    var /*@ type=int* */ v1 = /*@ type=Test1* */  t
         ?. /*@target=Test1.prop*/ prop = getInt();
 
-    var /*@ type=num* */ v2 = /*@ type=Test1* */ /*@target=Test1.==*/ t
+    var /*@ type=num* */ v2 = /*@ type=Test1* */  t
         ?. /*@target=Test1.prop*/ prop = getNum();
 
-    var /*@ type=int* */ v4 = /*@target=Test1.==*/ t?.
+    var /*@ type=int* */ v4 =  t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
-    var /*@ type=num* */ v5 = /*@target=Test1.==*/ t?.
+    var /*@ type=num* */ v5 =  t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
-    var /*@ type=int* */ v7 = /*@target=Test1.==*/ t?.
+    var /*@ type=int* */ v7 =  t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
         /*@target=num.+*/ += getInt();
 
-    var /*@ type=num* */ v8 = /*@target=Test1.==*/ t?.
+    var /*@ type=num* */ v8 =  t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
         /*@target=num.+*/ += getNum();
 
     var /*@ type=int* */ v10 = /*@target=num.+*/ ++
-        /*@target=Test1.==*/ t?.
+         t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop;
 
-    var /*@ type=int* */ v11 = /*@target=Test1.==*/ t?.
+    var /*@ type=int* */ v11 =  t?.
             /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
         /*@target=num.+*/ ++;
   }
@@ -49,43 +49,43 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=int* */ v1 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getInt();
 
-    var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=num* */ v2 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getNum();
 
-    var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Test2.==*/ t
+    var /*@ type=double* */ v3 = /*@ type=Test2* */  t
         ?. /*@target=Test2.prop*/ prop = getDouble();
 
-    var /*@ type=num* */ v4 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v4 =  t?.
             /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
-    var /*@ type=num* */ v5 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v5 =  t?.
             /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
-    var /*@ type=num* */ v6 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v6 =  t?.
             /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
-    var /*@ type=num* */ v7 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v7 =  t?.
             /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
         /*@target=num.+*/ += getInt();
 
-    var /*@ type=num* */ v8 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v8 =  t?.
             /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
         /*@target=num.+*/ += getNum();
 
-    var /*@ type=num* */ v9 = /*@target=Test2.==*/ t?.
+    var /*@ type=num* */ v9 =  t?.
         /*@target=Test2.prop*/ /*@target=Test2.prop*/
         prop /*@target=num.+*/ += getDouble();
 
-    var /*@ type=num* */ v10 = /*@target=num.+*/ ++ /*@target=Test2.==*/
+    var /*@ type=num* */ v10 = /*@target=num.+*/ ++ 
         t?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop;
 
-    var /*@ type=num* */ v11 = /*@target=Test2.==*/
+    var /*@ type=num* */ v11 = 
         t?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
         /*@target=num.+*/ ++;
   }
@@ -95,39 +95,39 @@
   double prop;
 
   static void test3(Test3 t) {
-    var /*@ type=num* */ v2 = /*@ type=Test3* */ /*@target=Test3.==*/ t
+    var /*@ type=num* */ v2 = /*@ type=Test3* */  t
         ?. /*@target=Test3.prop*/ prop = getNum();
 
-    var /*@ type=double* */ v3 = /*@ type=Test3* */ /*@target=Test3.==*/ t
+    var /*@ type=double* */ v3 = /*@ type=Test3* */  t
         ?. /*@target=Test3.prop*/ prop = getDouble();
 
-    var /*@ type=num* */ v5 = /*@target=Test3.==*/ t?.
+    var /*@ type=num* */ v5 =  t?.
             /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v6 =
-        /*@target=Test3.==*/ t?.
+         t?.
                 /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
-            /*@target=num.==*/ ??= getDouble();
+             ??= getDouble();
 
-    var /*@ type=double* */ v7 = /*@target=Test3.==*/ t?.
+    var /*@ type=double* */ v7 =  t?.
             /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
         /*@target=double.+*/ += getInt();
 
-    var /*@ type=double* */ v8 = /*@target=Test3.==*/ t?.
+    var /*@ type=double* */ v8 =  t?.
             /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
         /*@target=double.+*/ += getNum();
 
     var /*@ type=double* */ v9 =
-        /*@target=Test3.==*/ t?.
+         t?.
                 /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
             /*@target=double.+*/ += getDouble();
 
     var /*@ type=double* */ v10 = /*@target=double.+*/ ++
-        /*@target=Test3.==*/ t?.
+         t?.
             /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop;
 
-    var /*@ type=double* */ v11 = /*@target=Test3.==*/
+    var /*@ type=double* */ v11 = 
         t?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
         /*@target=double.+*/ ++;
   }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
index 48ef55d..00881df 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
@@ -27,7 +27,7 @@
     super.member = /*@ typeArgs=B* */ f();
 
     super. /*@target=Base.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     super. /*@target=Base.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -46,7 +46,7 @@
     var /*@ type=B* */ v1 = super.member = /*@ typeArgs=B* */ f();
 
     var /*@ type=B* */ v2 = super. /*@target=Base.member*/ member
-        /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+         ??= /*@ typeArgs=B* */ f();
 
     var /*@ type=A* */ v3 = super. /*@target=Base.member*/ member
         /*@target=B.+*/ += /*@ typeArgs=C* */ f();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
index c04c80e..fb14b71 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
@@ -22,10 +22,10 @@
     var /*@ type=num* */ v2 = super.intProp = getNum();
 
     var /*@ type=int* */ v4 = super. /*@target=Base.intProp*/ intProp
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = super. /*@target=Base.intProp*/ intProp
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=int* */ v7 = super. /*@target=Base.intProp*/ intProp
         /*@target=num.+*/ += getInt();
@@ -51,13 +51,13 @@
     var /*@ type=double* */ v3 = super.numProp = getDouble();
 
     var /*@ type=num* */ v4 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
 
     var /*@ type=num* */ v5 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=num* */ v6 = super. /*@target=Base.numProp*/ numProp
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=num* */ v7 = super. /*@target=Base.numProp*/ numProp
         /*@target=num.+*/ += getInt();
@@ -84,10 +84,10 @@
     var /*@ type=double* */ v3 = super.doubleProp = getDouble();
 
     var /*@ type=num* */ v5 = super. /*@target=Base.doubleProp*/ doubleProp
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
 
     var /*@ type=double* */ v6 = super. /*@target=Base.doubleProp*/ doubleProp
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
 
     var /*@ type=double* */ v7 = super
         . /*@target=Base.doubleProp*/
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
index e7d6d4b..e3c79e3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
@@ -17,10 +17,10 @@
     var /*@ type=num* */ v2 = t. /*@target=Test1.prop*/ prop = getNum();
     var /*@ type=int* */ v4 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
             . /*@target=Test1.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
     var /*@ type=num* */ v5 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
             . /*@target=Test1.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
     var /*@ type=int* */ v7 = /*@ type=Test1* */ t
             . /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
         /*@target=num.+*/ += getInt();
@@ -45,13 +45,13 @@
     var /*@ type=double* */ v3 = t. /*@target=Test2.prop*/ prop = getDouble();
     var /*@ type=num* */ v4 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getInt();
+         ??= getInt();
     var /*@ type=num* */ v5 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
     var /*@ type=num* */ v6 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
             . /*@target=Test2.prop*/ prop
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
     var /*@ type=num* */ v7 = /*@ type=Test2* */ t
             . /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
         /*@target=num.+*/ += getInt();
@@ -78,10 +78,10 @@
     var /*@ type=double* */ v3 = t. /*@target=Test3.prop*/ prop = getDouble();
     var /*@ type=num* */ v5 = /*@ type=Test3* */ /*@target=Test3.prop*/ t
             . /*@target=Test3.prop*/ prop
-        /*@target=num.==*/ ??= getNum();
+         ??= getNum();
     var /*@ type=double* */ v6 = /*@ type=Test3* */ /*@target=Test3.prop*/ t
             . /*@target=Test3.prop*/ prop
-        /*@target=num.==*/ ??= getDouble();
+         ??= getDouble();
     var /*@ type=double* */ v7 = /*@ type=Test3* */ t
             . /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
         /*@target=double.+*/ += getInt();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
index 1f4c19b..c09b270 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
@@ -25,7 +25,7 @@
 void test_topLevelVariable() {
   topLevelVariable = /*@ typeArgs=B* */ f();
 
-  topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  topLevelVariable  ??= /*@ typeArgs=B* */ f();
 
   topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -40,7 +40,7 @@
   var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      topLevelVariable  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 =
       topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
@@ -60,7 +60,7 @@
 void test_staticVariable() {
   B.staticVariable = /*@ typeArgs=B* */ f();
 
-  B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+  B.staticVariable  ??= /*@ typeArgs=B* */ f();
 
   B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
 
@@ -75,7 +75,7 @@
   var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
 
   var /*@ type=B* */ v2 =
-      B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
+      B.staticVariable  ??= /*@ typeArgs=B* */ f();
 
   var /*@ type=A* */ v3 =
       B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
index 4b22632..237f648 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
@@ -18,9 +18,9 @@
 
   var /*@ type=num* */ v2 = topLevelInt = getNum();
 
-  var /*@ type=int* */ v4 = topLevelInt /*@target=num.==*/ ??= getInt();
+  var /*@ type=int* */ v4 = topLevelInt  ??= getInt();
 
-  var /*@ type=num* */ v5 = topLevelInt /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = topLevelInt  ??= getNum();
 
   var /*@ type=int* */ v7 = topLevelInt /*@target=num.+*/ += getInt();
 
@@ -39,11 +39,11 @@
 
   var /*@ type=double* */ v3 = topLevelNum = getDouble();
 
-  var /*@ type=num* */ v4 = topLevelNum /*@target=num.==*/ ??= getInt();
+  var /*@ type=num* */ v4 = topLevelNum  ??= getInt();
 
-  var /*@ type=num* */ v5 = topLevelNum /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = topLevelNum  ??= getNum();
 
-  var /*@ type=num* */ v6 = topLevelNum /*@target=num.==*/ ??= getDouble();
+  var /*@ type=num* */ v6 = topLevelNum  ??= getDouble();
 
   var /*@ type=num* */ v7 = topLevelNum /*@target=num.+*/ += getInt();
 
@@ -62,10 +62,10 @@
 
   var /*@ type=double* */ v3 = topLevelDouble = getDouble();
 
-  var /*@ type=num* */ v5 = topLevelDouble /*@target=num.==*/ ??= getNum();
+  var /*@ type=num* */ v5 = topLevelDouble  ??= getNum();
 
   var /*@ type=double* */ v6 =
-      topLevelDouble /*@target=num.==*/ ??= getDouble();
+      topLevelDouble  ??= getDouble();
 
   var /*@ type=double* */ v7 = topLevelDouble /*@target=double.+*/ += getInt();
 
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
index 7478374..22e5ba7 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
@@ -21,6 +21,6 @@
 var a = new A();
 var x = a. /*@target=A.b*/ b. /*@target=B.c*/ c;
 var y = a. /*@ type=B* */ /*@target=A.b*/ /*@target=B.c*/ b. /*@target=B.c*/ c
-    /*@target=C.==*/ ??= new D();
+     ??= new D();
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.expect
index 7934529..ea950c6 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.expect
@@ -40,12 +40,12 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.outline.expect
index 8899b99..da2cfcc 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.outline.expect
@@ -38,12 +38,12 @@
 class C extends core::Object {
   synthetic constructor •() → self::C*
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.transformed.expect
index 7934529..ea950c6 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.transformed.expect
@@ -40,12 +40,12 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart
index c7d7e2b..89d50fb 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart
@@ -20,6 +20,6 @@
 var a = new A();
 var x = a. /*@target=A.b*/ b. /*@target=B.c*/ c;
 var y = a. /*@ type=B* */ /*@target=A.b*/ /*@target=B.c*/ b
-    . /*@target=B.c*/ c /*@target=C.==*/ ??= new D();
+    . /*@target=B.c*/ c ??= new D();
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.expect
index 07d3dfd..b174194 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.expect
@@ -38,12 +38,12 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.outline.expect
index 1ad86f8..06be72a 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.outline.expect
@@ -35,12 +35,12 @@
 class C extends core::Object {
   synthetic constructor •() → self::C*
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.transformed.expect
index 07d3dfd..b174194 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.transformed.expect
@@ -38,12 +38,12 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
   abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
   abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
diff --git a/pkg/front_end/testcases/inference_new/null_aware_property_get.dart b/pkg/front_end/testcases/inference_new/null_aware_property_get.dart
index 9722b96..1aeaa68 100644
--- a/pkg/front_end/testcases/inference_new/null_aware_property_get.dart
+++ b/pkg/front_end/testcases/inference_new/null_aware_property_get.dart
@@ -11,6 +11,5 @@
 
 main() {
   Class c;
-  num Function() f = /*@target=Class.==*/ /*@type=Class**/ c
-      ?. /*@target=Class.method*/ method;
+  num Function() f = /*@type=Class**/ c?. /*@target=Class.method*/ method;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 77009c4..b5587e5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 114
+PRERELEASE 115
 PRERELEASE_PATCH 0
\ No newline at end of file