diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index d2719fc..eb3c52a 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1085,22 +1085,14 @@
   ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) {
     ir.DartType resultType;
     final interfaceTarget = node.interfaceTarget;
-    if (interfaceTarget == null) {
-      // TODO(johnniwinther): Resolve and set the target here.
-      resultType = const ir.DynamicType();
+    ir.Class declaringClass = interfaceTarget.enclosingClass!;
+    if (declaringClass.typeParameters.isEmpty) {
+      resultType = interfaceTarget.superGetterType;
     } else {
-      ir.Class declaringClass = interfaceTarget.enclosingClass!;
-      if (declaringClass.typeParameters.isEmpty) {
-        resultType = interfaceTarget.superGetterType;
-      } else {
-        ir.InterfaceType receiver = typeEnvironment.getTypeAsInstanceOf(
-            thisType,
-            declaringClass,
-            currentLibrary,
-            typeEnvironment.coreTypes)!;
-        resultType = ir.Substitution.fromInterfaceType(receiver)
-            .substituteType(interfaceTarget.superGetterType);
-      }
+      ir.InterfaceType receiver = typeEnvironment.getTypeAsInstanceOf(
+          thisType, declaringClass, currentLibrary, typeEnvironment.coreTypes)!;
+      resultType = ir.Substitution.fromInterfaceType(receiver)
+          .substituteType(interfaceTarget.superGetterType);
     }
     _staticTypeCache._expressionTypes[node] = resultType;
     handleSuperPropertyGet(node, resultType);
@@ -1125,19 +1117,14 @@
     ArgumentTypes argumentTypes = _visitArguments(node.arguments);
     ir.DartType returnType;
     final interfaceTarget = node.interfaceTarget;
-    if (interfaceTarget == null) {
-      // TODO(johnniwinther): Resolve and set the target here.
-      returnType = const ir.DynamicType();
-    } else {
-      ir.Class superclass = interfaceTarget.enclosingClass!;
-      ir.InterfaceType receiverType = typeEnvironment.getTypeAsInstanceOf(
-          thisType, superclass, currentLibrary, typeEnvironment.coreTypes)!;
-      returnType = ir.Substitution.fromInterfaceType(receiverType)
-          .substituteType(interfaceTarget.function.returnType);
-      returnType = ir.Substitution.fromPairs(
-              interfaceTarget.function.typeParameters, node.arguments.types)
-          .substituteType(returnType);
-    }
+    ir.Class superclass = interfaceTarget.enclosingClass!;
+    ir.InterfaceType receiverType = typeEnvironment.getTypeAsInstanceOf(
+        thisType, superclass, currentLibrary, typeEnvironment.coreTypes)!;
+    returnType = ir.Substitution.fromInterfaceType(receiverType)
+        .substituteType(interfaceTarget.function.returnType);
+    returnType = ir.Substitution.fromPairs(
+            interfaceTarget.function.typeParameters, node.arguments.types)
+        .substituteType(returnType);
     _staticTypeCache._expressionTypes[node] = returnType;
     handleSuperMethodInvocation(node, argumentTypes, returnType);
     return returnType;
diff --git a/pkg/compiler/lib/src/ir/util.dart b/pkg/compiler/lib/src/ir/util.dart
index 1dcc687..c9fa392 100644
--- a/pkg/compiler/lib/src/ir/util.dart
+++ b/pkg/compiler/lib/src/ir/util.dart
@@ -287,6 +287,11 @@
     if (target.stubKind == ir.ProcedureStubKind.ConcreteMixinStub) {
       return getEffectiveSuperTarget(target.stubTarget);
     }
+    // TODO(johnniwinther): Remove this when the CFE reports an error on
+    // missing concrete super targets.
+    if (target.isAbstract) {
+      return null;
+    }
   }
   return target;
 }
diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart
index de13bd0..8671f20 100644
--- a/pkg/dart2wasm/lib/code_generator.dart
+++ b/pkg/dart2wasm/lib/code_generator.dart
@@ -1137,7 +1137,7 @@
   w.ValueType visitSuperMethodInvocation(
       SuperMethodInvocation node, w.ValueType expectedType) {
     Reference target =
-        _lookupSuperTarget(node.interfaceTarget!, setter: false).reference;
+        _lookupSuperTarget(node.interfaceTarget, setter: false).reference;
     w.BaseFunction targetFunction = translator.functions.getFunction(target);
     w.ValueType receiverType = targetFunction.type.inputs.first;
     w.ValueType thisType = visitThis(receiverType);
@@ -1515,7 +1515,7 @@
   @override
   w.ValueType visitSuperPropertyGet(
       SuperPropertyGet node, w.ValueType expectedType) {
-    Member target = _lookupSuperTarget(node.interfaceTarget!, setter: false);
+    Member target = _lookupSuperTarget(node.interfaceTarget, setter: false);
     if (target is Procedure && !target.isGetter) {
       throw "Not supported: Super tear-off at ${node.location}";
     }
@@ -1525,7 +1525,7 @@
   @override
   w.ValueType visitSuperPropertySet(
       SuperPropertySet node, w.ValueType expectedType) {
-    Member target = _lookupSuperTarget(node.interfaceTarget!, setter: true);
+    Member target = _lookupSuperTarget(node.interfaceTarget, setter: true);
     return _directSet(target, ThisExpression(), node.value,
         preserved: expectedType != voidMarker);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index f8e15fd..a90af23 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4790,12 +4790,12 @@
   @override
   js_ast.Expression visitAbstractSuperPropertyGet(
       AbstractSuperPropertyGet node) {
-    return _emitSuperPropertyGet(node.interfaceTarget!);
+    return _emitSuperPropertyGet(node.interfaceTarget);
   }
 
   @override
   js_ast.Expression visitSuperPropertyGet(SuperPropertyGet node) {
-    return _emitSuperPropertyGet(node.interfaceTarget!);
+    return _emitSuperPropertyGet(node.interfaceTarget);
   }
 
   js_ast.Expression _emitSuperPropertyGet(Member target) {
@@ -4813,12 +4813,12 @@
   @override
   js_ast.Expression visitAbstractSuperPropertySet(
       AbstractSuperPropertySet node) {
-    return _emitSuperPropertySet(node.interfaceTarget!, node.value);
+    return _emitSuperPropertySet(node.interfaceTarget, node.value);
   }
 
   @override
   js_ast.Expression visitSuperPropertySet(SuperPropertySet node) {
-    return _emitSuperPropertySet(node.interfaceTarget!, node.value);
+    return _emitSuperPropertySet(node.interfaceTarget, node.value);
   }
 
   js_ast.Expression _emitSuperPropertySet(Member target, Expression value) {
@@ -5432,12 +5432,12 @@
   @override
   js_ast.Expression visitAbstractSuperMethodInvocation(
       AbstractSuperMethodInvocation node) {
-    return _emitSuperMethodInvocation(node.interfaceTarget!, node.arguments);
+    return _emitSuperMethodInvocation(node.interfaceTarget, node.arguments);
   }
 
   @override
   js_ast.Expression visitSuperMethodInvocation(SuperMethodInvocation node) {
-    return _emitSuperMethodInvocation(node.interfaceTarget!, node.arguments);
+    return _emitSuperMethodInvocation(node.interfaceTarget, node.arguments);
   }
 
   js_ast.Expression _emitSuperMethodInvocation(
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 0c6c50e..39ecc43 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -836,11 +836,13 @@
   }
 
   Expression _createRead() {
+    Member? getter = this.getter;
     if (getter == null) {
       return _helper.buildUnresolvedError(name.text, fileOffset,
           isSuper: true, kind: UnresolvedKind.Getter);
+    } else {
+      return new SuperPropertyGet(name, getter)..fileOffset = fileOffset;
     }
-    return new SuperPropertyGet(name, getter)..fileOffset = fileOffset;
   }
 
   @override
@@ -849,13 +851,13 @@
   }
 
   Expression _createWrite(int offset, Expression value) {
+    Member? setter = this.setter;
     if (setter == null) {
       return _helper.buildUnresolvedError(name.text, fileOffset,
           rhs: value, isSuper: true, kind: UnresolvedKind.Setter);
+    } else {
+      return new SuperPropertySet(name, value, setter)..fileOffset = offset;
     }
-    SuperPropertySet write = new SuperPropertySet(name, value, setter)
-      ..fileOffset = offset;
-    return write;
   }
 
   @override
@@ -1227,6 +1229,7 @@
 
   @override
   Expression buildSimpleRead() {
+    Procedure? getter = this.getter;
     if (getter == null) {
       return _helper.buildUnresolvedError(indexGetName.text, fileOffset,
           isSuper: true,
@@ -1234,33 +1237,36 @@
               _helper.forest.createArguments(fileOffset, <Expression>[index]),
           kind: UnresolvedKind.Method,
           length: noLength);
+    } else {
+      return _helper.forest.createSuperMethodInvocation(
+          fileOffset,
+          indexGetName,
+          getter,
+          _helper.forest.createArguments(fileOffset, <Expression>[index]));
     }
-    return _helper.forest.createSuperMethodInvocation(
-        fileOffset,
-        indexGetName,
-        getter,
-        _helper.forest.createArguments(fileOffset, <Expression>[index]));
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    if (voidContext) {
-      if (setter == null) {
-        return _helper.buildUnresolvedError(indexSetName.text, fileOffset,
-            isSuper: true,
-            arguments: _helper.forest
-                .createArguments(fileOffset, <Expression>[index, value]),
-            kind: UnresolvedKind.Method,
-            length: noLength);
-      }
-      return _helper.forest.createSuperMethodInvocation(
-          fileOffset,
-          indexSetName,
-          setter,
-          _helper.forest
-              .createArguments(fileOffset, <Expression>[index, value]));
+    Procedure? setter = this.setter;
+    if (setter == null) {
+      return _helper.buildUnresolvedError(indexSetName.text, fileOffset,
+          isSuper: true,
+          arguments: _helper.forest
+              .createArguments(fileOffset, <Expression>[index, value]),
+          kind: UnresolvedKind.Method,
+          length: noLength);
     } else {
-      return new SuperIndexSet(setter, index, value)..fileOffset = fileOffset;
+      if (voidContext) {
+        return _helper.forest.createSuperMethodInvocation(
+            fileOffset,
+            indexSetName,
+            setter,
+            _helper.forest
+                .createArguments(fileOffset, <Expression>[index, value]));
+      } else {
+        return new SuperIndexSet(setter, index, value)..fileOffset = fileOffset;
+      }
     }
   }
 
@@ -1281,13 +1287,20 @@
       bool voidContext: false,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    return new CompoundSuperIndexSet(
-        getter, setter, index, binaryOperator, value,
-        readOffset: fileOffset,
-        binaryOffset: offset,
-        writeOffset: fileOffset,
-        forEffect: voidContext,
-        forPostIncDec: isPostIncDec);
+    Procedure? getter = this.getter;
+    Procedure? setter = this.setter;
+    if (getter == null || setter == null) {
+      return buildAssignment(
+          buildBinaryOperation(token, binaryOperator, value));
+    } else {
+      return new CompoundSuperIndexSet(
+          getter, setter, index, binaryOperator, value,
+          readOffset: fileOffset,
+          binaryOffset: offset,
+          writeOffset: fileOffset,
+          forEffect: voidContext,
+          forPostIncDec: isPostIncDec);
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 16a32f9..54be130 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -752,7 +752,7 @@
   }
 
   SuperMethodInvocation createSuperMethodInvocation(
-      int fileOffset, Name name, Procedure? procedure, Arguments arguments) {
+      int fileOffset, Name name, Procedure procedure, Arguments arguments) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
     return new SuperMethodInvocation(name, arguments, procedure)
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 73e8b41..bc654d8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -2682,7 +2682,7 @@
 ///
 class SuperIndexSet extends InternalExpression {
   /// The []= member.
-  Member? setter;
+  Member setter;
 
   /// The index expression of the operation.
   Expression index;
@@ -3707,10 +3707,10 @@
 ///
 class CompoundSuperIndexSet extends InternalExpression {
   /// The [] member.
-  Member? getter;
+  Member getter;
 
   /// The []= member.
-  Member? setter;
+  Member setter;
 
   /// The index expression of the operation.
   Expression index;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
index 292f63b..1ff55fd 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
@@ -3521,10 +3521,9 @@
 
   ExpressionInferenceResult visitSuperIndexSet(
       SuperIndexSet node, DartType typeContext) {
-    ObjectAccessTarget indexSetTarget = node.setter != null
-        ? new ObjectAccessTarget.interfaceMember(node.setter!,
-            isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget indexSetTarget = new ObjectAccessTarget.interfaceMember(
+        node.setter,
+        isPotentiallyNullable: false);
 
     DartType indexType = getIndexKeyType(indexSetTarget, thisType!);
     DartType valueType = getIndexSetValueType(indexSetTarget, thisType!);
@@ -3560,20 +3559,16 @@
     // the type of the value parameter.
     DartType inferredType = valueResult.inferredType;
 
-    Expression assignment;
-    if (indexSetTarget.isMissing) {
-      assignment = createMissingSuperIndexSet(node.fileOffset, index, value);
-    } else {
-      assert(indexSetTarget.isInstanceMember || indexSetTarget.isObjectMember);
-      instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
-          new InstrumentationValueForMember(node.setter!));
-      assignment = new SuperMethodInvocation(
-          indexSetName,
-          new Arguments(<Expression>[index, value])
-            ..fileOffset = node.fileOffset,
-          indexSetTarget.member as Procedure)
-        ..fileOffset = node.fileOffset;
-    }
+    assert(indexSetTarget.isInstanceMember || indexSetTarget.isObjectMember,
+        'Unexpected index set target $indexSetTarget.');
+    instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
+        new InstrumentationValueForMember(node.setter));
+    Expression assignment = new SuperMethodInvocation(
+        indexSetName,
+        new Arguments(<Expression>[index, value])..fileOffset = node.fileOffset,
+        indexSetTarget.member as Procedure)
+      ..fileOffset = node.fileOffset;
+
     VariableDeclaration assignmentVariable =
         createVariable(assignment, const VoidType());
     Expression replacement = createLet(assignmentVariable, returnedValue);
@@ -3886,23 +3881,17 @@
     writeIndex =
         ensureAssignable(writeIndexType, indexResult.inferredType, writeIndex);
 
-    Expression read;
-
-    if (readTarget.isMissing) {
-      read = createMissingSuperIndexGet(node.readOffset, readIndex);
-    } else {
-      assert(readTarget.isInstanceMember || readTarget.isObjectMember);
-      instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
-          new InstrumentationValueForMember(node.getter!));
-      read = new SuperMethodInvocation(
-          indexGetName,
-          new Arguments(<Expression>[
-            readIndex,
-          ])
-            ..fileOffset = node.readOffset,
-          readTarget.member as Procedure)
-        ..fileOffset = node.readOffset;
-    }
+    assert(readTarget.isInstanceMember || readTarget.isObjectMember);
+    instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
+        new InstrumentationValueForMember(node.getter!));
+    Expression read = new SuperMethodInvocation(
+        indexGetName,
+        new Arguments(<Expression>[
+          readIndex,
+        ])
+          ..fileOffset = node.readOffset,
+        readTarget.member as Procedure)
+      ..fileOffset = node.readOffset;
 
     flowAnalysis.ifNullExpression_rightBegin(read, readType);
     ExpressionInferenceResult valueResult =
@@ -3927,21 +3916,15 @@
       returnedValue = createVariableGet(valueVariable);
     }
 
-    Expression write;
-
-    if (writeTarget.isMissing) {
-      write = createMissingSuperIndexSet(node.writeOffset, writeIndex, value);
-    } else {
-      assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
-      instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
-          new InstrumentationValueForMember(node.setter!));
-      write = new SuperMethodInvocation(
-          indexSetName,
-          new Arguments(<Expression>[writeIndex, value])
-            ..fileOffset = node.writeOffset,
-          writeTarget.member as Procedure)
-        ..fileOffset = node.writeOffset;
-    }
+    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
+    instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
+        new InstrumentationValueForMember(node.setter!));
+    Expression write = new SuperMethodInvocation(
+        indexSetName,
+        new Arguments(<Expression>[writeIndex, value])
+          ..fileOffset = node.writeOffset,
+        writeTarget.member as Procedure)
+      ..fileOffset = node.writeOffset;
 
     Expression replacement;
     if (node.forEffect) {
@@ -5387,10 +5370,9 @@
 
   ExpressionInferenceResult visitCompoundSuperIndexSet(
       CompoundSuperIndexSet node, DartType typeContext) {
-    ObjectAccessTarget readTarget = node.getter != null
-        ? new ObjectAccessTarget.interfaceMember(node.getter!,
-            isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget readTarget = new ObjectAccessTarget.interfaceMember(
+        node.getter,
+        isPotentiallyNullable: false);
 
     DartType readType = getReturnType(readTarget, thisType!);
     DartType readIndexType = getIndexKeyType(readTarget, thisType!);
@@ -5412,22 +5394,17 @@
     readIndex =
         ensureAssignable(readIndexType, indexResult.inferredType, readIndex);
 
-    Expression read;
-    if (readTarget.isMissing) {
-      read = createMissingSuperIndexGet(node.readOffset, readIndex);
-    } else {
-      assert(readTarget.isInstanceMember || readTarget.isObjectMember);
-      instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
-          new InstrumentationValueForMember(node.getter!));
-      read = new SuperMethodInvocation(
-          indexGetName,
-          new Arguments(<Expression>[
-            readIndex,
-          ])
-            ..fileOffset = node.readOffset,
-          readTarget.member as Procedure)
-        ..fileOffset = node.readOffset;
-    }
+    assert(readTarget.isInstanceMember || readTarget.isObjectMember);
+    instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
+        new InstrumentationValueForMember(node.getter));
+    Expression read = new SuperMethodInvocation(
+        indexGetName,
+        new Arguments(<Expression>[
+          readIndex,
+        ])
+          ..fileOffset = node.readOffset,
+        readTarget.member as Procedure)
+      ..fileOffset = node.readOffset;
 
     VariableDeclaration? leftVariable;
     Expression left;
@@ -5439,10 +5416,9 @@
     } else {
       left = read;
     }
-    ObjectAccessTarget writeTarget = node.setter != null
-        ? new ObjectAccessTarget.interfaceMember(node.setter!,
-            isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget writeTarget = new ObjectAccessTarget.interfaceMember(
+        node.setter,
+        isPotentiallyNullable: false);
 
     DartType writeIndexType = getIndexKeyType(writeTarget, thisType!);
 
@@ -5474,21 +5450,15 @@
       valueExpression = createVariableGet(valueVariable);
     }
 
-    Expression write;
-    if (writeTarget.isMissing) {
-      write = createMissingSuperIndexSet(
-          node.writeOffset, writeIndex, valueExpression);
-    } else {
-      assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
-      instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
-          new InstrumentationValueForMember(node.setter!));
-      write = new SuperMethodInvocation(
-          indexSetName,
-          new Arguments(<Expression>[writeIndex, valueExpression])
-            ..fileOffset = node.writeOffset,
-          writeTarget.member as Procedure)
-        ..fileOffset = node.writeOffset;
-    }
+    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
+    instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
+        new InstrumentationValueForMember(node.setter));
+    Expression write = new SuperMethodInvocation(
+        indexSetName,
+        new Arguments(<Expression>[writeIndex, valueExpression])
+          ..fileOffset = node.writeOffset,
+        writeTarget.member as Procedure)
+      ..fileOffset = node.writeOffset;
 
     Expression replacement;
     if (node.forEffect) {
@@ -6145,11 +6115,8 @@
   @override
   ExpressionInferenceResult visitAbstractSuperMethodInvocation(
       AbstractSuperMethodInvocation node, DartType typeContext) {
-    if (node.interfaceTarget != null) {
-      instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
-          new InstrumentationValueForMember(node.interfaceTarget!));
-    }
-    assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
+    instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
+        new InstrumentationValueForMember(node.interfaceTarget));
     return inferSuperMethodInvocation(this, node, node.name,
         node.arguments as ArgumentsImpl, typeContext, node.interfaceTarget);
   }
@@ -6157,11 +6124,8 @@
   @override
   ExpressionInferenceResult visitSuperMethodInvocation(
       SuperMethodInvocation node, DartType typeContext) {
-    if (node.interfaceTarget != null) {
-      instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
-          new InstrumentationValueForMember(node.interfaceTarget!));
-    }
-    assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
+    instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
+        new InstrumentationValueForMember(node.interfaceTarget));
     return inferSuperMethodInvocation(this, node, node.name,
         node.arguments as ArgumentsImpl, typeContext, node.interfaceTarget);
   }
@@ -6169,10 +6133,8 @@
   @override
   ExpressionInferenceResult visitAbstractSuperPropertyGet(
       AbstractSuperPropertyGet node, DartType typeContext) {
-    if (node.interfaceTarget != null) {
-      instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
-          new InstrumentationValueForMember(node.interfaceTarget!));
-    }
+    instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
+        new InstrumentationValueForMember(node.interfaceTarget));
     return inferSuperPropertyGet(
         node, node.name, typeContext, node.interfaceTarget);
   }
@@ -6180,10 +6142,8 @@
   @override
   ExpressionInferenceResult visitSuperPropertyGet(
       SuperPropertyGet node, DartType typeContext) {
-    if (node.interfaceTarget != null) {
-      instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
-          new InstrumentationValueForMember(node.interfaceTarget!));
-    }
+    instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
+        new InstrumentationValueForMember(node.interfaceTarget));
     return inferSuperPropertyGet(
         node, node.name, typeContext, node.interfaceTarget);
   }
@@ -6194,15 +6154,12 @@
     DartType receiverType = classHierarchy.getTypeAsInstanceOf(thisType!,
         thisType!.classNode.supertype!.classNode, libraryBuilder.library)!;
 
-    ObjectAccessTarget writeTarget = node.interfaceTarget != null
-        ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget!,
-            isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget writeTarget = new ObjectAccessTarget.interfaceMember(
+        node.interfaceTarget,
+        isPotentiallyNullable: false);
     DartType writeContext = getSetterType(writeTarget, receiverType);
-    if (node.interfaceTarget != null) {
-      writeContext = computeTypeFromSuperClass(
-          node.interfaceTarget!.enclosingClass!, writeContext);
-    }
+    writeContext = computeTypeFromSuperClass(
+        node.interfaceTarget.enclosingClass!, writeContext);
     ExpressionInferenceResult rhsResult =
         inferExpression(node.value, writeContext, true, isVoidAllowed: true);
     rhsResult = ensureAssignableResult(writeContext, rhsResult,
@@ -6218,15 +6175,12 @@
     DartType receiverType = classHierarchy.getTypeAsInstanceOf(thisType!,
         thisType!.classNode.supertype!.classNode, libraryBuilder.library)!;
 
-    ObjectAccessTarget writeTarget = node.interfaceTarget != null
-        ? new ObjectAccessTarget.interfaceMember(node.interfaceTarget!,
-            isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+    ObjectAccessTarget writeTarget = new ObjectAccessTarget.interfaceMember(
+        node.interfaceTarget,
+        isPotentiallyNullable: false);
     DartType writeContext = getSetterType(writeTarget, receiverType);
-    if (node.interfaceTarget != null) {
-      writeContext = computeTypeFromSuperClass(
-          node.interfaceTarget!.enclosingClass!, writeContext);
-    }
+    writeContext = computeTypeFromSuperClass(
+        node.interfaceTarget.enclosingClass!, writeContext);
     ExpressionInferenceResult rhsResult =
         inferExpression(node.value, writeContext, true, isVoidAllowed: true);
     rhsResult = ensureAssignableResult(writeContext, rhsResult,
@@ -7167,9 +7121,7 @@
         receiverType, superPropertySet.name, superPropertySet.fileOffset,
         callSiteAccessKind: CallSiteAccessKind.setterInvocation,
         instrumented: true);
-    if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
-      superPropertySet.interfaceTarget = writeTarget.member;
-    }
+    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
     return _writeType = visitor.getSetterType(writeTarget, receiverType);
   }
 
@@ -7207,9 +7159,7 @@
         receiverType, superPropertySet.name, superPropertySet.fileOffset,
         callSiteAccessKind: CallSiteAccessKind.setterInvocation,
         instrumented: true);
-    if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
-      superPropertySet.interfaceTarget = writeTarget.member;
-    }
+    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
     return _writeType = visitor.getSetterType(writeTarget, receiverType);
   }
 
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 dc4fdbe..fb520a1 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
@@ -4500,35 +4500,6 @@
     return false;
   }
 
-  Expression createMissingSuperIndexGet(int fileOffset, Expression index) {
-    if (isTopLevel) {
-      return engine.forest.createSuperMethodInvocation(fileOffset, indexGetName,
-          null, engine.forest.createArguments(fileOffset, <Expression>[index]));
-    } else {
-      return helper.buildProblem(
-          templateSuperclassHasNoMethod.withArguments(indexGetName.text),
-          fileOffset,
-          noLength);
-    }
-  }
-
-  Expression createMissingSuperIndexSet(
-      int fileOffset, Expression index, Expression value) {
-    if (isTopLevel) {
-      return engine.forest.createSuperMethodInvocation(
-          fileOffset,
-          indexSetName,
-          null,
-          engine.forest
-              .createArguments(fileOffset, <Expression>[index, value]));
-    } else {
-      return helper.buildProblem(
-          templateSuperclassHasNoMethod.withArguments(indexSetName.text),
-          fileOffset,
-          noLength);
-    }
-  }
-
   /// Creates an expression the represents the invalid invocation of [name] on
   /// [receiver] with [arguments].
   ///
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index c588afc..b8fd17e 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
@@ -197,7 +197,7 @@
   @override
   void visitSuperMethodInvocation(SuperMethodInvocation node) {
     super.visitSuperMethodInvocation(node);
-    note(node.interfaceTargetReference!.node!, node.arguments, node);
+    note(node.interfaceTargetReference.node!, node.arguments, node);
   }
 
   @override
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart b/pkg/front_end/testcases/general/abstract_super_application.dart
new file mode 100644
index 0000000..f714955
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2022, 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 Super {
+  void method() {}
+  int property = 42;
+}
+
+mixin Mixin on Super {
+  void method() {
+    super.method();
+  }
+
+  int get property {
+    return super.property;
+  }
+
+  void set property(int value) {
+    super.property = value;
+  }
+}
+
+class Class1 extends Super with Mixin {}
+
+class Class2 with Mixin implements Super {}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline.expect
new file mode 100644
index 0000000..b04a16b
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+class Super {
+  void method() {}
+  int property = 42;
+}
+
+mixin Mixin on Super {
+  void method() {}
+  int get property {}
+  void set property(int value) {}
+}
+
+class Class1 extends Super with Mixin {}
+
+class Class2 with Mixin implements Super {}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..778e062
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+class Class1 extends Super with Mixin {}
+
+class Class2 with Mixin implements Super {}
+
+class Super {
+  int property = 42;
+  void method() {}
+}
+
+mixin Mixin on Super {
+  int get property {}
+  void method() {}
+  void set property(int value) {}
+}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect
new file mode 100644
index 0000000..c9780cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+// class Class2 with Mixin implements Super {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int property = 42;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method() → void {}
+}
+abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
+  method method() → void {
+    super.{self::Super::method}();
+  }
+  get property() → core::int {
+    return super.{self::Super::property};
+  }
+  set property(core::int value) → void {
+    super.{self::Super::property} = value;
+  }
+}
+abstract class _Class1&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class1 extends self::_Class1&Super&Mixin {
+  synthetic constructor •() → self::Class1
+    : super self::_Class1&Super&Mixin::•()
+    ;
+}
+abstract class _Class2&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&Mixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class2 extends self::_Class2&Object&Mixin implements self::Super {
+  synthetic constructor •() → self::Class2
+    : super self::_Class2&Object&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect
new file mode 100644
index 0000000..c9780cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+// class Class2 with Mixin implements Super {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int property = 42;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method() → void {}
+}
+abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
+  method method() → void {
+    super.{self::Super::method}();
+  }
+  get property() → core::int {
+    return super.{self::Super::property};
+  }
+  set property(core::int value) → void {
+    super.{self::Super::property} = value;
+  }
+}
+abstract class _Class1&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class1 extends self::_Class1&Super&Mixin {
+  synthetic constructor •() → self::Class1
+    : super self::_Class1&Super&Mixin::•()
+    ;
+}
+abstract class _Class2&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&Mixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class2 extends self::_Class2&Object&Mixin implements self::Super {
+  synthetic constructor •() → self::Class2
+    : super self::_Class2&Object&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.outline.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.outline.expect
new file mode 100644
index 0000000..6caa0cc
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.outline.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+// class Class2 with Mixin implements Super {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int property;
+  synthetic constructor •() → self::Super
+    ;
+  method method() → void
+    ;
+}
+abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
+  method method() → void
+    ;
+  get property() → core::int
+    ;
+  set property(core::int value) → void
+    ;
+}
+abstract class _Class1&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class1 extends self::_Class1&Super&Mixin {
+  synthetic constructor •() → self::Class1
+    ;
+}
+abstract class _Class2&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&Mixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub get property() → core::int
+    return super.{self::Mixin::property};
+  mixin-super-stub set property(core::int value) → void
+    return super.{self::Mixin::property} = value;
+  mixin-super-stub method method() → void
+    return super.{self::Mixin::method}();
+}
+class Class2 extends self::_Class2&Object&Mixin implements self::Super {
+  synthetic constructor •() → self::Class2
+    ;
+}
diff --git a/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect
new file mode 100644
index 0000000..5418053
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_super_application.dart.weak.transformed.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
+// class Class2 with Mixin implements Super {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int property = 42;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method() → void {}
+}
+abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
+  method method() → void {
+    super.{self::Super::method}();
+  }
+  get property() → core::int {
+    return super.{self::Super::property};
+  }
+  set property(core::int value) → void {
+    super.{self::Super::property} = value;
+  }
+}
+abstract class _Class1&Super&Mixin extends self::Super implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin
+    : super self::Super::•()
+    ;
+  get property() → core::int {
+    return super.{self::Super::property};
+  }
+  set property(core::int value) → void {
+    super.{self::Super::property} = value;
+  }
+  method method() → void {
+    super.{self::Super::method}();
+  }
+}
+class Class1 extends self::_Class1&Super&Mixin {
+  synthetic constructor •() → self::Class1
+    : super self::_Class1&Super&Mixin::•()
+    ;
+}
+abstract class _Class2&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&Mixin
+    : super core::Object::•()
+    ;
+  get property() → core::int {
+    return super.{self::Super::property};
+  }
+  set property(core::int value) → void {
+    super.{self::Super::property} = value;
+  }
+  method method() → void {
+    super.{self::Super::method}();
+  }
+}
+class Class2 extends self::_Class2&Object&Mixin implements self::Super {
+  synthetic constructor •() → self::Class2
+    : super self::_Class2&Object&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart b/pkg/front_end/testcases/inference/unresolved_super.dart
index ef5108d..c8bbcea 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart
@@ -13,7 +13,7 @@
     var /*@type=dynamic*/ v2 = super.bar;
     var /*@type=dynamic*/ v3 = super[0];
     var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();*/
-    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+    var /*@type=invalid-type*/ v5 = super[0] = f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.expect
index e3758d3..cd24891 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-//                                     ^
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+//     var /*@type=invalid-type*/ v5 = super[0] = f();
+//                                          ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,9 +14,9 @@
     : super core::Object::•()
     ;
   method test() → void {
-    dynamic v5 = let final core::int* #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-                                    ^" in #t2;
+    invalid-type v5 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+    var /*@type=invalid-type*/ v5 = super[0] = f();
+                                         ^";
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect
index e3758d3..cd24891 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-//                                     ^
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+//     var /*@type=invalid-type*/ v5 = super[0] = f();
+//                                          ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,9 +14,9 @@
     : super core::Object::•()
     ;
   method test() → void {
-    dynamic v5 = let final core::int* #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-                                    ^" in #t2;
+    invalid-type v5 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+    var /*@type=invalid-type*/ v5 = super[0] = f();
+                                         ^";
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.transformed.expect
index e3758d3..cd24891 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-//                                     ^
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+//     var /*@type=invalid-type*/ v5 = super[0] = f();
+//                                          ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,9 +14,9 @@
     : super core::Object::•()
     ;
   method test() → void {
-    dynamic v5 = let final core::int* #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-                                    ^" in #t2;
+    invalid-type v5 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:42: Error: Superclass has no method named '[]='.
+    var /*@type=invalid-type*/ v5 = super[0] = f();
+                                         ^";
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
index e218902..ec6a7f6 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.outline.expect
@@ -28,19 +28,19 @@
 
 
 Extra constant evaluation status:
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#catchError)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:821:13 -> SymbolConstant(#test)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> SymbolConstant(#whenComplete)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> ListConstant(const <Type*>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:872:13 -> MapConstant(const <Symbol*, dynamic>{})
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#timeout)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> ListConstant(const <Type*>[])
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:916:13 -> SymbolConstant(#onTimeout)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#then)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:770:13 -> SymbolConstant(#onError)
-Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> SymbolConstant(#asStream)
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <Type*>[])
-Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> ListConstant(const <dynamic>[])
-Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:881:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:814:13 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:865:13 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:909:13 -> SymbolConstant(#onTimeout)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#then)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:763:13 -> SymbolConstant(#onError)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:874:13 -> MapConstant(const <Symbol*, dynamic>{})
 Extra constant evaluation: evaluated: 61, effectively constant: 15
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.expect
index 69f78c4..254123f 100644
--- a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.expect
@@ -6,10 +6,6 @@
 //     super[4] = 42;
 //          ^
 //
-// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
-//     return super[2];
-//                 ^
-//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
 //     super[4] += 5;
 //          ^
@@ -18,6 +14,10 @@
 //     super[4] += 5;
 //          ^
 //
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
 //   on Exception catch (e) { }
 //   ^^
@@ -54,7 +54,7 @@
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
     super[4] = 42;
          ^";
-    let final core::int #t1 = 4 in invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
     super[4] += 5;
          ^";
     return invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect
index 69f78c4..254123f 100644
--- a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect
@@ -6,10 +6,6 @@
 //     super[4] = 42;
 //          ^
 //
-// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
-//     return super[2];
-//                 ^
-//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
 //     super[4] += 5;
 //          ^
@@ -18,6 +14,10 @@
 //     super[4] += 5;
 //          ^
 //
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
 //   on Exception catch (e) { }
 //   ^^
@@ -54,7 +54,7 @@
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
     super[4] = 42;
          ^";
-    let final core::int #t1 = 4 in invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
     super[4] += 5;
          ^";
     return invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.transformed.expect
index 69f78c4..254123f 100644
--- a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.transformed.expect
@@ -6,10 +6,6 @@
 //     super[4] = 42;
 //          ^
 //
-// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
-//     return super[2];
-//                 ^
-//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
 //     super[4] += 5;
 //          ^
@@ -18,6 +14,10 @@
 //     super[4] += 5;
 //          ^
 //
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
 // pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
 //   on Exception catch (e) { }
 //   ^^
@@ -54,7 +54,7 @@
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
     super[4] = 42;
          ^";
-    let final core::int #t1 = 4 in invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
     super[4] += 5;
          ^";
     return invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 8d76bd1..db38412 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -602,8 +602,8 @@
   Byte tag = 22;
   FileOffset fileOffset;
   Name name;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 type AbstractSuperPropertySet extends Expression {
@@ -611,16 +611,16 @@
   FileOffset fileOffset;
   Name name;
   Expression value;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 type SuperPropertyGet extends Expression {
   Byte tag = 24;
   FileOffset fileOffset;
   Name name;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 type SuperPropertySet extends Expression {
@@ -628,8 +628,8 @@
   FileOffset fileOffset;
   Name name;
   Expression value;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 /*
@@ -842,8 +842,8 @@
   FileOffset fileOffset;
   Name name;
   Arguments arguments;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 type SuperMethodInvocation extends Expression {
@@ -851,8 +851,8 @@
   FileOffset fileOffset;
   Name name;
   Arguments arguments;
-  MemberReference interfaceTarget; // May be NullReference.
-  MemberReference interfaceTargetOrigin; // May be NullReference.
+  MemberReference interfaceTarget;
+  MemberReference interfaceTargetOrigin;
 }
 
 type StaticInvocation extends Expression {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 0e63341..37c8e79 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4827,28 +4827,23 @@
 class AbstractSuperPropertyGet extends Expression {
   Name name;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  AbstractSuperPropertyGet(Name name, [Member? interfaceTarget])
-      : this.byReference(name, getMemberReferenceGetter(interfaceTarget));
+  AbstractSuperPropertyGet(Name name, Member interfaceTarget)
+      : this.byReference(
+            name, getNonNullableMemberReferenceGetter(interfaceTarget));
 
   AbstractSuperPropertyGet.byReference(
       this.name, this.interfaceTargetReference);
 
-  Member? get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
-  void set interfaceTarget(Member? member) {
-    interfaceTargetReference = getMemberReferenceGetter(member);
+  void set interfaceTarget(Member member) {
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(member);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Member? interfaceTarget = this.interfaceTarget;
-    if (interfaceTarget == null) {
-      // TODO(johnniwinther): SuperPropertyGet without a target should be
-      // replaced by invalid expressions.
-      return const DynamicType();
-    }
     Class declaringClass = interfaceTarget.enclosingClass!;
     if (declaringClass.typeParameters.isEmpty) {
       return interfaceTarget.getterType;
@@ -4869,7 +4864,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
   }
 
@@ -4897,27 +4892,22 @@
 class SuperPropertyGet extends Expression {
   Name name;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  SuperPropertyGet(Name name, [Member? interfaceTarget])
-      : this.byReference(name, getMemberReferenceGetter(interfaceTarget));
+  SuperPropertyGet(Name name, Member interfaceTarget)
+      : this.byReference(
+            name, getNonNullableMemberReferenceGetter(interfaceTarget));
 
   SuperPropertyGet.byReference(this.name, this.interfaceTargetReference);
 
-  Member? get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
-  void set interfaceTarget(Member? member) {
-    interfaceTargetReference = getMemberReferenceGetter(member);
+  void set interfaceTarget(Member member) {
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(member);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Member? interfaceTarget = this.interfaceTarget;
-    if (interfaceTarget == null) {
-      // TODO(johnniwinther): SuperPropertyGet without a target should be
-      // replaced by invalid expressions.
-      return const DynamicType();
-    }
     Class declaringClass = interfaceTarget.enclosingClass!;
     if (declaringClass.typeParameters.isEmpty) {
       return interfaceTarget.getterType;
@@ -4938,7 +4928,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
   }
 
@@ -4990,21 +4980,21 @@
   Name name;
   Expression value;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  AbstractSuperPropertySet(Name name, Expression value, Member? interfaceTarget)
+  AbstractSuperPropertySet(Name name, Expression value, Member interfaceTarget)
       : this.byReference(
-            name, value, getMemberReferenceSetter(interfaceTarget));
+            name, value, getNonNullableMemberReferenceSetter(interfaceTarget));
 
   AbstractSuperPropertySet.byReference(
       this.name, this.value, this.interfaceTargetReference) {
     value.parent = this;
   }
 
-  Member? get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
-  void set interfaceTarget(Member? member) {
-    interfaceTargetReference = getMemberReferenceSetter(member);
+  void set interfaceTarget(Member member) {
+    interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
   }
 
   @override
@@ -5020,7 +5010,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
     value.accept(v);
   }
@@ -5066,21 +5056,21 @@
   Name name;
   Expression value;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  SuperPropertySet(Name name, Expression value, Member? interfaceTarget)
+  SuperPropertySet(Name name, Expression value, Member interfaceTarget)
       : this.byReference(
-            name, value, getMemberReferenceSetter(interfaceTarget));
+            name, value, getNonNullableMemberReferenceSetter(interfaceTarget));
 
   SuperPropertySet.byReference(
       this.name, this.value, this.interfaceTargetReference) {
     value.parent = this;
   }
 
-  Member? get interfaceTarget => interfaceTargetReference?.asMember;
+  Member get interfaceTarget => interfaceTargetReference.asMember;
 
-  void set interfaceTarget(Member? member) {
-    interfaceTargetReference = getMemberReferenceSetter(member);
+  void set interfaceTarget(Member member) {
+    interfaceTargetReference = getNonNullableMemberReferenceSetter(member);
   }
 
   @override
@@ -5096,7 +5086,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
     value.accept(v);
   }
@@ -6406,32 +6396,30 @@
   @override
   Arguments arguments;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  AbstractSuperMethodInvocation(Name name, Arguments arguments,
-      [Procedure? interfaceTarget])
+  AbstractSuperMethodInvocation(
+      Name name, Arguments arguments, Procedure interfaceTarget)
       : this.byReference(
             name,
             arguments,
             // An invocation doesn't refer to the setter.
-            getMemberReferenceGetter(interfaceTarget));
+            getNonNullableMemberReferenceGetter(interfaceTarget));
 
   AbstractSuperMethodInvocation.byReference(
       this.name, this.arguments, this.interfaceTargetReference) {
     arguments.parent = this;
   }
 
-  Procedure? get interfaceTarget => interfaceTargetReference?.asProcedure;
+  Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
 
-  void set interfaceTarget(Procedure? target) {
+  void set interfaceTarget(Procedure target) {
     // An invocation doesn't refer to the setter.
-    interfaceTargetReference = getMemberReferenceGetter(target);
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Procedure? interfaceTarget = this.interfaceTarget;
-    if (interfaceTarget == null) return const DynamicType();
     Class superclass = interfaceTarget.enclosingClass!;
     List<DartType>? receiverTypeArguments = context.typeEnvironment
         .getTypeArgumentsAsInstanceOf(context.thisType!, superclass);
@@ -6453,7 +6441,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
     arguments.accept(v);
   }
@@ -6499,32 +6487,30 @@
   @override
   Arguments arguments;
 
-  Reference? interfaceTargetReference;
+  Reference interfaceTargetReference;
 
-  SuperMethodInvocation(Name name, Arguments arguments,
-      [Procedure? interfaceTarget])
+  SuperMethodInvocation(
+      Name name, Arguments arguments, Procedure interfaceTarget)
       : this.byReference(
             name,
             arguments,
             // An invocation doesn't refer to the setter.
-            getMemberReferenceGetter(interfaceTarget));
+            getNonNullableMemberReferenceGetter(interfaceTarget));
 
   SuperMethodInvocation.byReference(
       this.name, this.arguments, this.interfaceTargetReference) {
     arguments.parent = this;
   }
 
-  Procedure? get interfaceTarget => interfaceTargetReference?.asProcedure;
+  Procedure get interfaceTarget => interfaceTargetReference.asProcedure;
 
-  void set interfaceTarget(Procedure? target) {
+  void set interfaceTarget(Procedure target) {
     // An invocation doesn't refer to the setter.
-    interfaceTargetReference = getMemberReferenceGetter(target);
+    interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
   }
 
   @override
   DartType getStaticTypeInternal(StaticTypeContext context) {
-    Procedure? interfaceTarget = this.interfaceTarget;
-    if (interfaceTarget == null) return const DynamicType();
     Class superclass = interfaceTarget.enclosingClass!;
     List<DartType>? receiverTypeArguments = context.typeEnvironment
         .getTypeArgumentsAsInstanceOf(context.thisType!, superclass);
@@ -6545,7 +6531,7 @@
 
   @override
   void visitChildren(Visitor v) {
-    interfaceTarget?.acceptReference(v);
+    interfaceTarget.acceptReference(v);
     name.accept(v);
     arguments.accept(v);
   }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 756b1b9..cc22844 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -2219,7 +2219,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new AbstractSuperPropertyGet.byReference(
-        readName(), readNullableInstanceMemberReference())
+        readName(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2227,7 +2227,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new AbstractSuperPropertySet.byReference(
-        readName(), readExpression(), readNullableInstanceMemberReference())
+        readName(), readExpression(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2235,7 +2235,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new SuperPropertyGet.byReference(
-        readName(), readNullableInstanceMemberReference())
+        readName(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2243,7 +2243,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new SuperPropertySet.byReference(
-        readName(), readExpression(), readNullableInstanceMemberReference())
+        readName(), readExpression(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2373,7 +2373,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new AbstractSuperMethodInvocation.byReference(
-        readName(), readArguments(), readNullableInstanceMemberReference())
+        readName(), readArguments(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2381,7 +2381,7 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new SuperMethodInvocation.byReference(
-        readName(), readArguments(), readNullableInstanceMemberReference())
+        readName(), readArguments(), readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 4d8d015..781c8ba 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1634,7 +1634,7 @@
     writeByte(Tag.AbstractSuperPropertyGet);
     writeOffset(node.fileOffset);
     writeName(node.name);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1643,7 +1643,7 @@
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeNode(node.value);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1651,7 +1651,7 @@
     writeByte(Tag.SuperPropertyGet);
     writeOffset(node.fileOffset);
     writeName(node.name);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1660,7 +1660,7 @@
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeNode(node.value);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1791,7 +1791,7 @@
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeArgumentsNode(node.arguments);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1800,7 +1800,7 @@
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeArgumentsNode(node.arguments);
-    writeNullAllowedInstanceMemberReference(node.interfaceTargetReference);
+    writeNonNullInstanceMemberReference(node.interfaceTargetReference);
   }
 
   @override
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 22e011b..d8f5c67b 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -1060,8 +1060,10 @@
   SuperMethodInvocation visitSuperMethodInvocation(SuperMethodInvocation node) {
     SuperMethodInvocation cloned =
         super.visitSuperMethodInvocation(node) as SuperMethodInvocation;
-    cloned.interfaceTarget =
-        _findSuperMember(node.name, isSetter: false) as Procedure?;
+    cloned.interfaceTarget = _findSuperMember(node.name, isSetter: false)
+            as Procedure? ??
+        // TODO(johnniwinther): Remove this when an error is reported instead.
+        cloned.interfaceTarget;
     return cloned;
   }
 
@@ -1069,7 +1071,9 @@
   SuperPropertyGet visitSuperPropertyGet(SuperPropertyGet node) {
     SuperPropertyGet cloned =
         super.visitSuperPropertyGet(node) as SuperPropertyGet;
-    cloned.interfaceTarget = _findSuperMember(node.name, isSetter: false);
+    cloned.interfaceTarget = _findSuperMember(node.name, isSetter: false) ??
+        // TODO(johnniwinther): Remove this when an error is reported instead.
+        cloned.interfaceTarget;
     return cloned;
   }
 
@@ -1077,7 +1081,9 @@
   SuperPropertySet visitSuperPropertySet(SuperPropertySet node) {
     SuperPropertySet cloned =
         super.visitSuperPropertySet(node) as SuperPropertySet;
-    cloned.interfaceTarget = _findSuperMember(node.name, isSetter: true);
+    cloned.interfaceTarget = _findSuperMember(node.name, isSetter: true) ??
+        // TODO(johnniwinther): Remove this when an error is reported instead.
+        cloned.interfaceTarget;
     return cloned;
   }
 }
diff --git a/pkg/kernel/lib/src/node_creator.dart b/pkg/kernel/lib/src/node_creator.dart
index d51a1bb..51fc5d4 100644
--- a/pkg/kernel/lib/src/node_creator.dart
+++ b/pkg/kernel/lib/src/node_creator.dart
@@ -861,7 +861,8 @@
         return StringLiteral('foo');
       case ExpressionKind.AbstractSuperMethodInvocation:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () => AbstractSuperMethodInvocation(_createName(), _createArguments())
+          () => AbstractSuperMethodInvocation(
+              _createName(), _createArguments(), _needProcedure())
             ..fileOffset = _needFileOffset(),
           () => AbstractSuperMethodInvocation(
               _createName(), _createArguments(), _needProcedure())
@@ -869,7 +870,8 @@
         ]);
       case ExpressionKind.SuperMethodInvocation:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () => SuperMethodInvocation(_createName(), _createArguments())
+          () => SuperMethodInvocation(
+              _createName(), _createArguments(), _needProcedure())
             ..fileOffset = _needFileOffset(),
           () => SuperMethodInvocation(
               _createName(), _createArguments(), _needProcedure())
@@ -877,29 +879,31 @@
         ]);
       case ExpressionKind.AbstractSuperPropertyGet:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () => AbstractSuperPropertyGet(_createName())
+          () => AbstractSuperPropertyGet(_createName(), _needProcedure())
             ..fileOffset = _needFileOffset(),
           () => AbstractSuperPropertyGet(_createName(), _needField())
             ..fileOffset = _needFileOffset(),
         ]);
       case ExpressionKind.AbstractSuperPropertySet:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () =>
-              AbstractSuperPropertySet(_createName(), _createExpression(), null)
-                ..fileOffset = _needFileOffset(),
+          () => AbstractSuperPropertySet(
+              _createName(), _createExpression(), _needProcedure())
+            ..fileOffset = _needFileOffset(),
           () => AbstractSuperPropertySet(
               _createName(), _createExpression(), _needField())
             ..fileOffset = _needFileOffset(),
         ]);
       case ExpressionKind.SuperPropertyGet:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () => SuperPropertyGet(_createName())..fileOffset = _needFileOffset(),
+          () => SuperPropertyGet(_createName(), _needProcedure())
+            ..fileOffset = _needFileOffset(),
           () => SuperPropertyGet(_createName(), _needField())
             ..fileOffset = _needFileOffset(),
         ]);
       case ExpressionKind.SuperPropertySet:
         return _createOneOf(_pendingExpressions, kind, index, [
-          () => SuperPropertySet(_createName(), _createExpression(), null)
+          () => SuperPropertySet(
+              _createName(), _createExpression(), _needProcedure())
             ..fileOffset = _needFileOffset(),
           () =>
               SuperPropertySet(_createName(), _createExpression(), _needField())
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 6e44499..38dec89 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -755,77 +755,49 @@
   @override
   DartType visitAbstractSuperMethodInvocation(
       AbstractSuperMethodInvocation node) {
-    Member? target = node.interfaceTarget;
-    if (target == null) {
-      checkUnresolvedInvocation(currentThisType!, node);
-      return handleDynamicCall(currentThisType!, node.arguments);
-    } else {
-      return handleCall(node.arguments, target.superGetterType,
-          receiver: getSuperReceiverType(target));
-    }
+    Member target = node.interfaceTarget;
+    return handleCall(node.arguments, target.superGetterType,
+        receiver: getSuperReceiverType(target));
   }
 
   @override
   DartType visitSuperMethodInvocation(SuperMethodInvocation node) {
-    Member? target = node.interfaceTarget;
-    if (target == null) {
-      checkUnresolvedInvocation(currentThisType!, node);
-      return handleDynamicCall(currentThisType!, node.arguments);
-    } else {
-      return handleCall(node.arguments, target.superGetterType,
-          receiver: getSuperReceiverType(target));
-    }
+    Member target = node.interfaceTarget;
+    return handleCall(node.arguments, target.superGetterType,
+        receiver: getSuperReceiverType(target));
   }
 
   @override
   DartType visitAbstractSuperPropertyGet(AbstractSuperPropertyGet node) {
-    Member? target = node.interfaceTarget;
-    if (target == null) {
-      checkUnresolvedInvocation(currentThisType!, node);
-      return const DynamicType();
-    } else {
-      Substitution receiver = getSuperReceiverType(target);
-      return receiver.substituteType(target.superGetterType);
-    }
+    Member target = node.interfaceTarget;
+    Substitution receiver = getSuperReceiverType(target);
+    return receiver.substituteType(target.superGetterType);
   }
 
   @override
   DartType visitAbstractSuperPropertySet(AbstractSuperPropertySet node) {
-    Member? target = node.interfaceTarget;
+    Member target = node.interfaceTarget;
     DartType value = visitExpression(node.value);
-    if (target != null) {
-      Substitution receiver = getSuperReceiverType(target);
-      checkAssignable(node.value, value,
-          receiver.substituteType(target.superSetterType, contravariant: true));
-    } else {
-      checkUnresolvedInvocation(currentThisType!, node);
-    }
+    Substitution receiver = getSuperReceiverType(target);
+    checkAssignable(node.value, value,
+        receiver.substituteType(target.superSetterType, contravariant: true));
     return value;
   }
 
   @override
   DartType visitSuperPropertyGet(SuperPropertyGet node) {
-    Member? target = node.interfaceTarget;
-    if (target == null) {
-      checkUnresolvedInvocation(currentThisType!, node);
-      return const DynamicType();
-    } else {
-      Substitution receiver = getSuperReceiverType(target);
-      return receiver.substituteType(target.superGetterType);
-    }
+    Member target = node.interfaceTarget;
+    Substitution receiver = getSuperReceiverType(target);
+    return receiver.substituteType(target.superGetterType);
   }
 
   @override
   DartType visitSuperPropertySet(SuperPropertySet node) {
-    Member? target = node.interfaceTarget;
+    Member target = node.interfaceTarget;
     DartType value = visitExpression(node.value);
-    if (target != null) {
-      Substitution receiver = getSuperReceiverType(target);
-      checkAssignable(node.value, value,
-          receiver.substituteType(target.superSetterType, contravariant: true));
-    } else {
-      checkUnresolvedInvocation(currentThisType!, node);
-    }
+    Substitution receiver = getSuperReceiverType(target);
+    checkAssignable(node.value, value,
+        receiver.substituteType(target.superSetterType, contravariant: true));
     return value;
   }
 
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 61f008b..6ea5178 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -196,20 +196,20 @@
 
   @override
   visitSuperPropertyGet(SuperPropertyGet node) {
-    node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget);
+    node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget)!;
     super.visitSuperPropertyGet(node);
   }
 
   @override
   visitSuperPropertySet(SuperPropertySet node) {
-    node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget);
+    node.interfaceTarget = _resolveNewInterfaceTarget(node.interfaceTarget)!;
     super.visitSuperPropertySet(node);
   }
 
   @override
   visitSuperMethodInvocation(SuperMethodInvocation node) {
     node.interfaceTarget =
-        _resolveNewInterfaceTarget(node.interfaceTarget) as Procedure?;
+        _resolveNewInterfaceTarget(node.interfaceTarget) as Procedure;
     super.visitSuperMethodInvocation(node);
   }
 
diff --git a/pkg/vm/lib/transformations/to_string_transformer.dart b/pkg/vm/lib/transformations/to_string_transformer.dart
index 824282d..bf16900 100644
--- a/pkg/vm/lib/transformations/to_string_transformer.dart
+++ b/pkg/vm/lib/transformations/to_string_transformer.dart
@@ -75,11 +75,21 @@
         _isInTargetPackage(node) &&
         !_hasKeepAnnotation(node) &&
         !_hasInheritedKeepAnnotation(node.enclosingClass!)) {
+      Procedure findSuperMethod(Class cls) {
+        for (Procedure procedure in cls.procedures) {
+          if (procedure.name.text == 'toString' && !procedure.isAbstract) {
+            return procedure;
+          }
+        }
+        return findSuperMethod(cls.superclass!);
+      }
+
       node.function.body!.replaceWith(
         ReturnStatement(
           SuperMethodInvocation(
             node.name,
             Arguments(<Expression>[]),
+            findSuperMethod(node.enclosingClass!.superclass!),
           ),
         ),
       );
diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
index b4d7687..a23bf58 100644
--- a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
+++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
@@ -309,10 +309,7 @@
 
   @override
   void visitSuperMethodInvocation(SuperMethodInvocation node) {
-    final interfaceTarget = node.interfaceTarget;
-    if (interfaceTarget != null) {
-      collectCall(interfaceTarget, node.arguments);
-    }
+    collectCall(node.interfaceTarget, node.arguments);
     super.visitSuperMethodInvocation(node);
   }
 
@@ -649,10 +646,7 @@
   @override
   void visitSuperMethodInvocation(SuperMethodInvocation node) {
     super.visitSuperMethodInvocation(node);
-    final interfaceTarget = node.interfaceTarget;
-    if (interfaceTarget != null) {
-      transformCall(interfaceTarget, node, null, node.arguments);
-    }
+    transformCall(node.interfaceTarget, node, null, node.arguments);
   }
 
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 0b3a78c..bae97d9 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -1348,10 +1348,8 @@
       return _makeUnreachableCall(_flattenArguments(node.arguments));
     } else {
       node.interfaceTarget = fieldMorpher
-          .adjustInstanceCallTarget(node.interfaceTarget) as Procedure?;
-      if (node.interfaceTarget != null) {
-        shaker.addUsedMember(node.interfaceTarget!);
-      }
+          .adjustInstanceCallTarget(node.interfaceTarget) as Procedure;
+      shaker.addUsedMember(node.interfaceTarget);
       return node;
     }
   }
@@ -1364,10 +1362,8 @@
       return _makeUnreachableCall([]);
     } else {
       node.interfaceTarget =
-          fieldMorpher.adjustInstanceCallTarget(node.interfaceTarget);
-      if (node.interfaceTarget != null) {
-        shaker.addUsedMember(node.interfaceTarget!);
-      }
+          fieldMorpher.adjustInstanceCallTarget(node.interfaceTarget)!;
+      shaker.addUsedMember(node.interfaceTarget);
       return node;
     }
   }
@@ -1380,10 +1376,8 @@
       return _makeUnreachableCall([node.value]);
     } else {
       node.interfaceTarget = fieldMorpher
-          .adjustInstanceCallTarget(node.interfaceTarget, isSetter: true);
-      if (node.interfaceTarget != null) {
-        shaker.addUsedMember(node.interfaceTarget!);
-      }
+          .adjustInstanceCallTarget(node.interfaceTarget, isSetter: true)!;
+      shaker.addUsedMember(node.interfaceTarget);
       return node;
     }
   }
diff --git a/pkg/vm/testcases/transformations/to_string_transformer/transformed.expect b/pkg/vm/testcases/transformations/to_string_transformer/transformed.expect
index d48dc28..010e2fe 100644
--- a/pkg/vm/testcases/transformations/to_string_transformer/transformed.expect
+++ b/pkg/vm/testcases/transformations/to_string_transformer/transformed.expect
@@ -17,7 +17,7 @@
     ;
   @#C1
   method toString() → core::String
-    return super.toString();
+    return super.{core::Object::toString}();
 }
 class FooEnum extends core::_Enum /*isEnum*/  {
   static const field core::List<self::FooEnum> values = #C11;
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 4356953..2269e31 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -205,26 +205,21 @@
 
   // Use the DWARF stack decoder if we're running in --dwarf-stack-traces mode
   // and in precompiled mode (otherwise --dwarf-stack-traces has no effect).
-  bool usingDwarf = false;
-  if (debugInfoFilename != null) {
-    try {
-      final dwarf = Dwarf.fromFile(debugInfoFilename)!;
-      usingDwarf = true;
-      frames = await Stream.fromIterable(original)
-          .transform(DwarfStackTraceDecoder(dwarf))
-          .where(_lineRE.hasMatch)
-          .toList();
-    } on FileSystemException {
-      // We're not running in precompiled mode, so the file doesn't exist and
-      // we can continue normally.
-    }
+  final decodeTrace = frames.first.startsWith('Warning:');
+  if (decodeTrace) {
+    Expect.isNotNull(debugInfoFilename);
+    final dwarf = Dwarf.fromFile(debugInfoFilename!)!;
+    frames = await Stream.fromIterable(original)
+        .transform(DwarfStackTraceDecoder(dwarf))
+        .where(_lineRE.hasMatch)
+        .toList();
   }
 
   void printFrameInformation() {
     print('RegExps for expected stack:');
     expects.forEach((s) => print('"${s}"'));
     print('');
-    if (usingDwarf) {
+    if (decodeTrace) {
       print('Non-symbolic actual stack:');
       original.forEach(print);
       print('');
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index ec673b5..d7c80d1 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -207,26 +207,21 @@
 
   // Use the DWARF stack decoder if we're running in --dwarf-stack-traces mode
   // and in precompiled mode (otherwise --dwarf-stack-traces has no effect).
-  bool usingDwarf = false;
-  if (debugInfoFilename != null) {
-    try {
-      final dwarf = Dwarf.fromFile(debugInfoFilename);
-      usingDwarf = true;
-      frames = await Stream.fromIterable(original)
-          .transform(DwarfStackTraceDecoder(dwarf))
-          .where(_lineRE.hasMatch)
-          .toList();
-    } on FileSystemException {
-      // We're not running in precompiled mode, so the file doesn't exist and
-      // we can continue normally.
-    }
+  final decodeTrace = frames.first.startsWith('Warning:');
+  if (decodeTrace) {
+    Expect.isNotNull(debugInfoFilename);
+    final dwarf = Dwarf.fromFile(debugInfoFilename);
+    frames = await Stream.fromIterable(original)
+        .transform(DwarfStackTraceDecoder(dwarf))
+        .where(_lineRE.hasMatch)
+        .toList();
   }
 
   void printFrameInformation() {
     print('RegExps for expected stack:');
     expects.forEach((s) => print('"${s}"'));
     print('');
-    if (usingDwarf) {
+    if (decodeTrace) {
       print('Non-symbolic actual stack:');
       original.forEach(print);
       print('');
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 84694a6..d20cf54 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1739,6 +1739,13 @@
   // how the vm_tag (kEmbedderTagId) can be set, these tags need to
   // move to the OSThread structure.
   set_user_tag(UserTags::kDefaultUserTag);
+
+  if (group()->obfuscate()) {
+    OS::PrintErr(
+        "Warning: This VM has been configured to obfuscate symbol information "
+        "which violates the Dart standard.\n"
+        "         See dartbug.com/30524 for more information.\n");
+  }
 }
 
 #undef REUSABLE_HANDLE_SCOPE_INIT
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 8814320..47633fe 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -25878,6 +25878,12 @@
         isolate_instructions_image.instructions_relocated_address();
     auto const vm_relocated_address =
         vm_instructions_image.instructions_relocated_address();
+    // The Dart standard requires the output of StackTrace.toString to include
+    // all pending activations with precise source locations (i.e., to expand
+    // inlined frames and provide line and column numbers).
+    buffer.Printf(
+        "Warning: This VM has been configured to produce stack traces "
+        "that violate the Dart standard.\n");
     // This prologue imitates Android's debuggerd to make it possible to paste
     // the stack trace into ndk-stack.
     buffer.Printf(
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index ca05fc6..bd41381 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -110,7 +110,6 @@
         checkNotNullable,
         EmptyIterator,
         IterableElementError,
-        nullFuture,
         printToZone,
         printToConsole,
         Since,
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index f83386d..908e5e1 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -223,13 +223,6 @@
 /// it's very clearly documented.
 @pragma("wasm:entry-point")
 abstract class Future<T> {
-  /// A `Future<Null>` completed with `null`.
-  ///
-  /// Currently shared with `dart:internal`.
-  /// If that future can be removed, then change this back to
-  /// `_Future<Null>.zoneValue(null, _rootZone);`
-  static final _Future<Null> _nullFuture = nullFuture as _Future<Null>;
-
   /// A `Future<bool>` completed with `false`.
   static final _Future<bool> _falseFuture =
       new _Future<bool>.zoneValue(false, _rootZone);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 038c3bb..117465c 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -515,7 +515,7 @@
       controller
         ..onCancel = () {
           timer.cancel();
-          return Future._nullFuture;
+          return Zone._current._nullFuture;
         }
         ..onPause = () {
           watch.stop();
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 2baf008..1f34d76 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -588,7 +588,10 @@
   Future<void> get done => _ensureDoneFuture();
 
   Future<void> _ensureDoneFuture() =>
-      _doneFuture ??= _isCanceled ? Future._nullFuture : _Future<void>();
+      _doneFuture ??
+      (_isCanceled
+          ? Zone._current._nullFuture as Future<void>
+          : _doneFuture = _Future<void>());
 
   /// Send or enqueue a data event.
   void add(T value) {
@@ -919,7 +922,7 @@
     var cancel = addSubscription.cancel();
     if (cancel == null) {
       addStreamFuture._asyncComplete(null);
-      return Future._nullFuture;
+      return Zone._current._nullFuture;
     }
     return cancel.whenComplete(() {
       addStreamFuture._asyncComplete(null);
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index b4fb5d8..b5a40cb 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -197,7 +197,7 @@
     if (!_isCanceled) {
       _cancel();
     }
-    return _cancelFuture ?? Future._nullFuture;
+    return _cancelFuture ?? Zone._current._nullFuture;
   }
 
   Future<E> asFuture<E>([E? futureValue]) {
@@ -217,7 +217,7 @@
     };
     _onError = (Object error, StackTrace stackTrace) {
       Future cancelFuture = cancel();
-      if (!identical(cancelFuture, Future._nullFuture)) {
+      if (!identical(Zone._current._nullFuture, cancelFuture)) {
         cancelFuture.whenComplete(() {
           result._completeError(error, stackTrace);
         });
@@ -297,7 +297,7 @@
   // Hooks called when the input is paused, unpaused or canceled.
   // These must not throw. If overwritten to call user code, include suitable
   // try/catch wrapping and send any errors to
-  // [_Zone.current.handleUncaughtError].
+  // [Zone._current.handleUncaughtError].
   void _onPause() {
     assert(_isInputPaused);
   }
@@ -352,7 +352,6 @@
       // future to finish we must not report the error.
       if (_isCanceled && !_waitsForCancel) return;
       _state |= _STATE_IN_CALLBACK;
-      // TODO(floitsch): this dynamic should be 'void'.
       var onError = _onError;
       if (onError is void Function(Object, StackTrace)) {
         _zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
@@ -367,7 +366,7 @@
       _cancel();
       var cancelFuture = _cancelFuture;
       if (cancelFuture != null &&
-          !identical(cancelFuture, Future._nullFuture)) {
+          !identical(Zone._current._nullFuture, cancelFuture)) {
         cancelFuture.whenComplete(sendError);
       } else {
         sendError();
@@ -396,7 +395,8 @@
     _cancel();
     _state |= _STATE_WAIT_FOR_CANCEL;
     var cancelFuture = _cancelFuture;
-    if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
+    if (cancelFuture != null &&
+        !identical(Zone._current._nullFuture, cancelFuture)) {
       cancelFuture.whenComplete(sendDone);
     } else {
       sendDone();
@@ -672,7 +672,7 @@
     }
   }
 
-  Future cancel() => Future._nullFuture;
+  Future cancel() => Zone._current._nullFuture;
 
   Future<E> asFuture<E>([E? futureValue]) {
     E resultValue;
@@ -819,7 +819,7 @@
 
   Future cancel() {
     _stream._cancelSubscription();
-    return Future._nullFuture;
+    return Zone._current._nullFuture;
   }
 
   bool get isPaused {
@@ -963,7 +963,7 @@
       }
       return subscription.cancel();
     }
-    return Future._nullFuture;
+    return Zone._current._nullFuture;
   }
 
   void _onData(T data) {
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index cd707be..2caa84b 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -26,7 +26,8 @@
 void _cancelAndError(StreamSubscription subscription, _Future future,
     Object error, StackTrace stackTrace) {
   var cancelFuture = subscription.cancel();
-  if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
+  if (cancelFuture != null &&
+      !identical(Zone._current._nullFuture, cancelFuture)) {
     cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
   } else {
     future._completeError(error, stackTrace);
@@ -55,7 +56,8 @@
   before completing with a value. */
 void _cancelAndValue(StreamSubscription subscription, _Future future, value) {
   var cancelFuture = subscription.cancel();
-  if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
+  if (cancelFuture != null &&
+      !identical(Zone._current._nullFuture, cancelFuture)) {
     cancelFuture.whenComplete(() => future._complete(value));
   } else {
     future._complete(value);
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index b9bcd19..42e0c76 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -1078,6 +1078,28 @@
           implZone, e, identical(error, e) ? stackTrace : s);
     }
   }
+
+  /// A reusable `null`-valued future per zone used by `dart:async`.
+  ///
+  /// **DO NOT USE.**
+  ///
+  /// This future is used in situations where a future is expected,
+  /// but no asynchronous computation actually happens,
+  /// like cancelling a stream from a controller with no `onCancel` callback.
+  /// *Some code depends on recognizing this future in order to react
+  /// synchronously.*
+  /// It does so to avoid changing event interleaving during the null safety
+  /// migration where, for example, the [StreamSubscription.cancel] method
+  /// stopped being able to return `null`.
+  /// The code that would be broken by such a timing change is fragile,
+  /// but we are not able to simply change it.
+  /// For better or worse, code depends on the precise timing
+  /// that our libraries have so far exhibited.
+  ///
+  /// This future will be removed again if we can ever do so.
+  /// Do not use it for anything other than preserving timing
+  /// during the null safety migration.
+  _Future<Null> get _nullFuture;
 }
 
 class _CustomZone extends _Zone {
@@ -1105,6 +1127,9 @@
   /// The parent zone.
   final _Zone parent;
 
+  /// Cached value for [_nullFuture];
+  _Future<Null>? _nullFutureCache;
+
   /// The zone's scoped value declaration map.
   ///
   /// This is always a [HashMap].
@@ -1196,6 +1221,18 @@
   /// parent's error-zone.
   Zone get errorZone => _handleUncaughtError.zone;
 
+  _Future<Null> get _nullFuture {
+    _Future<Null>? result = _nullFutureCache;
+    if (result != null) return result;
+    // We only care about the zone of the null future
+    // because of the zone it schedules microtasks in.
+    var microtaskZone = _scheduleMicrotask.zone;
+    if (!identical(microtaskZone, this)) {
+      return _nullFutureCache = microtaskZone._nullFuture;
+    }
+    return _nullFutureCache = _Future<Null>.value(null);
+  }
+
   void runGuarded(void f()) {
     try {
       run(f);
@@ -1509,6 +1546,8 @@
 }
 
 class _RootZone extends _Zone {
+  static final _nullFutureCache = _Future<Null>.zoneValue(null, _rootZone);
+
   const _RootZone();
 
   _ZoneFunction<RunHandler> get _run =>
@@ -1547,6 +1586,8 @@
   // The parent zone.
   _Zone? get parent => null;
 
+  _Future<Null> get _nullFuture => _nullFutureCache;
+
   /// The zone's scoped value declaration map.
   ///
   /// This is always a [HashMap].
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 671f68a..91224f6 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -37302,13 +37302,13 @@
   }
 
   Future cancel() {
-    if (_canceled) return nullFuture;
-
-    _unlisten();
-    // Clear out the target to indicate this is complete.
-    _target = null;
-    _onData = null;
-    return nullFuture;
+    if (!_canceled) {
+      _unlisten();
+      // Clear out the target to indicate this is complete.
+      _target = null;
+      _onData = null;
+    }
+    return Future<void>.value(null);
   }
 
   bool get _canceled => _target == null;
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index ff3d890..0353c71 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -136,27 +136,7 @@
   return digit1 * 16 + digit2 - (digit2 & 256);
 }
 
-/// A reusable `null`-valued future used by `dart:async`.
-///
-/// **DO NOT USE.**
-///
-/// This future is used in situations where a future is expected,
-/// but no asynchronous computation actually happens,
-/// like cancelling a stream from a controller with no `onCancel` callback.
-/// *Some code depends on recognizing this future in order to react
-/// synchronously.*
-/// It does so to avoid changing event interleaving during the null safety
-/// migration where, for example, the [StreamSubscription.cancel] method
-/// stopped being able to return `null`.
-/// The code that would be broken by such a timing change is fragile,
-/// but we are not able to simply change it.
-/// For better or worse, code depends on the precise timing that our libraries
-/// have so far exhibited.
-///
-/// This future will be removed again if we can ever do so.
-/// Do not use it for anything other than preserving timing
-/// during the null safety migration.
-final Future<Null> nullFuture = Zone.root.run(() => Future<Null>.value(null));
+final Expando<Future<Null>> _nullFutures = Expando<Future<Null>>();
 
 /// A default hash function used by the platform in various places.
 ///
diff --git a/tests/lib/async/null_future_zone_test.dart b/tests/lib/async/null_future_zone_test.dart
index 9a266be..34201e7 100644
--- a/tests/lib/async/null_future_zone_test.dart
+++ b/tests/lib/async/null_future_zone_test.dart
@@ -13,21 +13,32 @@
     Expect.isFalse(await it.moveNext());
 
     late Future nullFuture;
+
+    bool nullFutureZoneUsed = false;
+    runZoned(() {
+      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
+    }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
+        (Zone self, ZoneDelegate parent, Zone zone, void f()) {
+      Expect.identical(zone, self);
+      nullFutureZoneUsed = true;
+      parent.scheduleMicrotask(zone, f);
+    }));
+
+    nullFuture.then((value) {
+      Expect.isNull(value);
+      Expect.isTrue(nullFutureZoneUsed);
+      asyncEnd();
+    });
+
     late Future falseFuture;
 
     runZoned(() {
-      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
       falseFuture = it.moveNext();
     }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
         (Zone self, ZoneDelegate parent, Zone zone, void f()) {
       Expect.fail("Should not be called");
     }));
 
-    nullFuture.then((value) {
-      Expect.isNull(value);
-      asyncEnd();
-    });
-
     falseFuture.then((value) {
       Expect.isFalse(value);
       asyncEnd();
diff --git a/tests/lib_2/async/null_future_zone_test.dart b/tests/lib_2/async/null_future_zone_test.dart
index 3322916..77cb1b7 100644
--- a/tests/lib_2/async/null_future_zone_test.dart
+++ b/tests/lib_2/async/null_future_zone_test.dart
@@ -15,21 +15,32 @@
     Expect.isFalse(await it.moveNext());
 
     Future nullFuture;
+
+    bool nullFutureZoneUsed = false;
+    runZoned(() {
+      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
+    }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
+        (Zone self, ZoneDelegate parent, Zone zone, void f()) {
+      Expect.identical(zone, self);
+      nullFutureZoneUsed = true;
+      parent.scheduleMicrotask(zone, f);
+    }));
+
+    nullFuture.then((value) {
+      Expect.isNull(value);
+      Expect.isTrue(nullFutureZoneUsed);
+      asyncEnd();
+    });
+
     Future falseFuture;
 
     runZoned(() {
-      nullFuture = (new StreamController()..stream.listen(null).cancel()).done;
       falseFuture = it.moveNext();
     }, zoneSpecification: new ZoneSpecification(scheduleMicrotask:
         (Zone self, ZoneDelegate parent, Zone zone, void f()) {
       Expect.fail("Should not be called");
     }));
 
-    nullFuture.then((value) {
-      Expect.isNull(value);
-      asyncEnd();
-    });
-
     falseFuture.then((value) {
       Expect.isFalse(value);
       asyncEnd();
diff --git a/tools/VERSION b/tools/VERSION
index 45f4e4d..157fc8a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 222
+PRERELEASE 223
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 90b19aa..1ae6268 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -248,13 +248,13 @@
   }
 
   Future cancel() {
-    if (_canceled) return nullFuture;
-
-    _unlisten();
-    // Clear out the target to indicate this is complete.
-    _target = null;
-    _onData = null;
-    return nullFuture;
+    if (!_canceled) {
+      _unlisten();
+      // Clear out the target to indicate this is complete.
+      _target = null;
+      _onData = null;
+    }
+    return Future<void>.value(null);
   }
 
   bool get _canceled => _target == null;
