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 05b7503..1ee8d77 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
@@ -572,6 +572,7 @@
           }
           break;
         case ObjectAccessTargetKind.nullableInstanceMember:
+        case ObjectAccessTargetKind.superMember:
         case ObjectAccessTargetKind.objectMember:
         case ObjectAccessTargetKind.nullableCallFunction:
         case ObjectAccessTargetKind.nullableExtensionMember:
@@ -3602,9 +3603,10 @@
 
   ExpressionInferenceResult visitSuperIndexSet(
       SuperIndexSet node, DartType typeContext) {
-    ObjectAccessTarget indexSetTarget = new ObjectAccessTarget.interfaceMember(
-        thisType!, node.setter,
-        isPotentiallyNullable: false);
+    ObjectAccessTarget indexSetTarget = thisType!.classNode.isMixinDeclaration
+        ? new ObjectAccessTarget.interfaceMember(thisType!, node.setter,
+            isPotentiallyNullable: false)
+        : new ObjectAccessTarget.superMember(thisType!, node.setter);
 
     DartType indexType = indexSetTarget.getIndexKeyType(this);
     DartType valueType = indexSetTarget.getIndexSetValueType(this);
@@ -3640,7 +3642,7 @@
     // the type of the value parameter.
     DartType inferredType = valueResult.inferredType;
 
-    assert(indexSetTarget.isInstanceMember || indexSetTarget.isObjectMember,
+    assert(indexSetTarget.isInstanceMember || indexSetTarget.isSuperMember,
         'Unexpected index set target $indexSetTarget.');
     instrumentation?.record(uriForInstrumentation, node.fileOffset, 'target',
         new InstrumentationValueForMember(node.setter));
@@ -3925,8 +3927,10 @@
   ExpressionInferenceResult visitIfNullSuperIndexSet(
       IfNullSuperIndexSet node, DartType typeContext) {
     ObjectAccessTarget readTarget = node.getter != null
-        ? new ObjectAccessTarget.interfaceMember(thisType!, node.getter!,
-            isPotentiallyNullable: false)
+        ? (thisType!.classNode.isMixinDeclaration
+            ? new ObjectAccessTarget.interfaceMember(thisType!, node.getter!,
+                isPotentiallyNullable: false)
+            : new ObjectAccessTarget.superMember(thisType!, node.getter!))
         : const ObjectAccessTarget.missing();
 
     DartType readType = readTarget.getReturnType(this);
@@ -3935,8 +3939,10 @@
     DartType readIndexType = readTarget.getIndexKeyType(this);
 
     ObjectAccessTarget writeTarget = node.setter != null
-        ? new ObjectAccessTarget.interfaceMember(thisType!, node.setter!,
-            isPotentiallyNullable: false)
+        ? (thisType!.classNode.isMixinDeclaration
+            ? new ObjectAccessTarget.interfaceMember(thisType!, node.setter!,
+                isPotentiallyNullable: false)
+            : new ObjectAccessTarget.superMember(thisType!, node.setter!))
         : const ObjectAccessTarget.missing();
 
     DartType writeIndexType = writeTarget.getIndexKeyType(this);
@@ -3962,7 +3968,7 @@
     writeIndex =
         ensureAssignable(writeIndexType, indexResult.inferredType, writeIndex);
 
-    assert(readTarget.isInstanceMember || readTarget.isObjectMember);
+    assert(readTarget.isInstanceMember || readTarget.isSuperMember);
     instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
         new InstrumentationValueForMember(node.getter!));
     Expression read = new SuperMethodInvocation(
@@ -3997,7 +4003,7 @@
       returnedValue = createVariableGet(valueVariable);
     }
 
-    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
+    assert(writeTarget.isInstanceMember || writeTarget.isSuperMember);
     instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
         new InstrumentationValueForMember(node.setter!));
     Expression write = new SuperMethodInvocation(
@@ -4455,6 +4461,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         if ((binaryTarget.isInstanceMember || binaryTarget.isObjectMember) &&
             instrumentation != null &&
             leftType == const DynamicType()) {
@@ -4572,6 +4579,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         if ((unaryTarget.isInstanceMember || unaryTarget.isObjectMember) &&
             instrumentation != null &&
             expressionType == const DynamicType()) {
@@ -4697,6 +4705,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         InstanceAccessKind kind;
         switch (readTarget.kind) {
           case ObjectAccessTargetKind.instanceMember:
@@ -4820,6 +4829,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         InstanceAccessKind kind;
         switch (writeTarget.kind) {
           case ObjectAccessTargetKind.instanceMember:
@@ -4937,6 +4947,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         Member member = readTarget.member!;
         if ((readTarget.isInstanceMember || readTarget.isObjectMember) &&
             instrumentation != null &&
@@ -5111,6 +5122,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         InstanceAccessKind kind;
         switch (writeTarget.kind) {
           case ObjectAccessTargetKind.instanceMember:
@@ -5464,9 +5476,10 @@
 
   ExpressionInferenceResult visitCompoundSuperIndexSet(
       CompoundSuperIndexSet node, DartType typeContext) {
-    ObjectAccessTarget readTarget = new ObjectAccessTarget.interfaceMember(
-        thisType!, node.getter,
-        isPotentiallyNullable: false);
+    ObjectAccessTarget readTarget = thisType!.classNode.isMixinDeclaration
+        ? new ObjectAccessTarget.interfaceMember(thisType!, node.getter,
+            isPotentiallyNullable: false)
+        : new ObjectAccessTarget.superMember(thisType!, node.getter);
 
     DartType readType = readTarget.getReturnType(this);
     DartType readIndexType = readTarget.getIndexKeyType(this);
@@ -5488,7 +5501,7 @@
     readIndex =
         ensureAssignable(readIndexType, indexResult.inferredType, readIndex);
 
-    assert(readTarget.isInstanceMember || readTarget.isObjectMember);
+    assert(readTarget.isInstanceMember || readTarget.isSuperMember);
     instrumentation?.record(uriForInstrumentation, node.readOffset, 'target',
         new InstrumentationValueForMember(node.getter));
     Expression read = new SuperMethodInvocation(
@@ -5510,9 +5523,10 @@
     } else {
       left = read;
     }
-    ObjectAccessTarget writeTarget = new ObjectAccessTarget.interfaceMember(
-        thisType!, node.setter,
-        isPotentiallyNullable: false);
+    ObjectAccessTarget writeTarget = thisType!.classNode.isMixinDeclaration
+        ? new ObjectAccessTarget.interfaceMember(thisType!, node.setter,
+            isPotentiallyNullable: false)
+        : new ObjectAccessTarget.superMember(thisType!, node.setter);
 
     DartType writeIndexType = writeTarget.getIndexKeyType(this);
 
@@ -5544,7 +5558,7 @@
       valueExpression = createVariableGet(valueVariable);
     }
 
-    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
+    assert(writeTarget.isInstanceMember || writeTarget.isSuperMember);
     instrumentation?.record(uriForInstrumentation, node.writeOffset, 'target',
         new InstrumentationValueForMember(node.setter));
     Expression write = new SuperMethodInvocation(
@@ -6353,9 +6367,11 @@
   @override
   ExpressionInferenceResult visitSuperPropertySet(
       SuperPropertySet node, DartType typeContext) {
-    ObjectAccessTarget writeTarget = new ObjectAccessTarget.interfaceMember(
-        thisType!, node.interfaceTarget,
-        isPotentiallyNullable: false);
+    ObjectAccessTarget writeTarget = thisType!.classNode.isMixinDeclaration
+        ? new ObjectAccessTarget.interfaceMember(
+            thisType!, node.interfaceTarget,
+            isPotentiallyNullable: false)
+        : new ObjectAccessTarget.superMember(thisType!, node.interfaceTarget);
     DartType writeContext = writeTarget.getSetterType(this);
     writeContext = computeTypeFromSuperClass(
         node.interfaceTarget.enclosingClass!, writeContext);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart
index d9de536..0295930a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart
@@ -696,7 +696,7 @@
           ..fileOffset = fileOffset;
 
     DartType tearoffType =
-        getGetterTypeForMemberTarget(callMember, expressionType)
+        getGetterTypeForMemberTarget(callMember, expressionType, isSuper: false)
             .withDeclaredNullability(expressionType.nullability);
     Expression tearOff = new InstanceTearOff(
         InstanceAccessKind.Instance, new VariableGet(t), callName,
@@ -740,9 +740,10 @@
                 AssignabilityKind.unassignableCantTearoff,
                 needsTearOff: false);
           }
-          expressionType =
-              getGetterTypeForMemberTarget(callMember, expressionType)
-                  .withDeclaredNullability(expressionType.nullability);
+          expressionType = getGetterTypeForMemberTarget(
+                  callMember, expressionType,
+                  isSuper: false)
+              .withDeclaredNullability(expressionType.nullability);
         }
       }
     }
@@ -1315,11 +1316,13 @@
   ///    c.getter; // The getter type is `int`.
   ///
   DartType getGetterTypeForMemberTarget(
-      Member interfaceMember, DartType receiverType) {
+      Member interfaceMember, DartType receiverType,
+      {required bool isSuper}) {
     Class memberClass = interfaceMember.enclosingClass!;
     assert(interfaceMember is Field || interfaceMember is Procedure,
         "Unexpected interface member $interfaceMember.");
-    DartType calleeType = interfaceMember.getterType;
+    DartType calleeType =
+        isSuper ? interfaceMember.superGetterType : interfaceMember.getterType;
     if (memberClass.typeParameters.isNotEmpty) {
       receiverType = resolveTypeParameter(receiverType);
       if (receiverType is InterfaceType) {
@@ -1360,7 +1363,8 @@
       Member? member =
           _getInterfaceMember(calleeType.classNode, callName, false, -1);
       if (member != null) {
-        DartType callType = getGetterTypeForMemberTarget(member, calleeType);
+        DartType callType =
+            getGetterTypeForMemberTarget(member, calleeType, isSuper: false);
         if (callType is FunctionType) {
           if (!isNonNullableByDefault) {
             callType = legacyErasure(callType);
@@ -3194,6 +3198,7 @@
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.objectMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
+      case ObjectAccessTargetKind.superMember:
         Member member = target.member!;
         if (member is Procedure) {
           if (member.kind == ProcedureKind.Getter) {
@@ -3382,24 +3387,20 @@
       Name methodName,
       ArgumentsImpl arguments,
       DartType typeContext,
-      Procedure? procedure) {
+      Procedure procedure) {
     int fileOffset = expression.fileOffset;
-    ObjectAccessTarget target = procedure != null
+    ObjectAccessTarget target = thisType!.classNode.isMixinDeclaration
         ? new ObjectAccessTarget.interfaceMember(thisType!, procedure,
             isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
+        : new ObjectAccessTarget.superMember(thisType!, procedure);
     DartType receiverType = thisType!;
     bool isSpecialCasedBinaryOperator =
         target.isSpecialCasedBinaryOperator(this);
-    DartType calleeType = target.getGetterType(this);
-    FunctionType functionType = target.getFunctionType(this);
-    if (procedure != null) {
-      calleeType =
-          computeTypeFromSuperClass(procedure.enclosingClass!, calleeType);
-      functionType =
-          computeTypeFromSuperClass(procedure.enclosingClass!, functionType)
-              as FunctionType;
-    }
+    DartType calleeType = computeTypeFromSuperClass(
+        procedure.enclosingClass!, target.getGetterType(this));
+    FunctionType functionType = computeTypeFromSuperClass(
+            procedure.enclosingClass!, target.getFunctionType(this))
+        as FunctionType;
     if (isNonNullableByDefault &&
         methodName == equalsName &&
         functionType.positionalParameters.length == 1) {
@@ -3427,16 +3428,13 @@
 
   /// Performs the core type inference algorithm for super property get.
   ExpressionInferenceResult inferSuperPropertyGet(
-      Expression expression, Name name, DartType typeContext, Member? member) {
-    ObjectAccessTarget readTarget = member != null
+      Expression expression, Name name, DartType typeContext, Member member) {
+    ObjectAccessTarget readTarget = thisType!.classNode.isMixinDeclaration
         ? new ObjectAccessTarget.interfaceMember(thisType!, member,
             isPotentiallyNullable: false)
-        : const ObjectAccessTarget.missing();
-    DartType inferredType = readTarget.getGetterType(this);
-    if (member != null) {
-      inferredType =
-          computeTypeFromSuperClass(member.enclosingClass!, inferredType);
-    }
+        : new ObjectAccessTarget.superMember(thisType!, member);
+    DartType inferredType = computeTypeFromSuperClass(
+        member.enclosingClass!, readTarget.getGetterType(this));
     if (member is Procedure && member.kind == ProcedureKind.Method) {
       return instantiateTearOff(inferredType, typeContext, expression);
     }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/object_access_target.dart b/pkg/front_end/lib/src/fasta/type_inference/object_access_target.dart
index bc48f05..2d921c8 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/object_access_target.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/object_access_target.dart
@@ -25,6 +25,9 @@
   /// potentially nullable receiver.
   objectMember,
 
+  /// A valid access to a statically known super member.
+  superMember,
+
   /// A (non-nullable) access to the `.call` method of a function. This is used
   /// for access on `Function` and on function types.
   callFunction,
@@ -80,6 +83,10 @@
         : new InstanceAccessTarget.nonNullable(receiverType, member);
   }
 
+  /// Creates an access to the super [member].
+  factory ObjectAccessTarget.superMember(DartType receiverType, Member member) =
+      InstanceAccessTarget.superMember;
+
   /// Creates an access to the Object [member].
   factory ObjectAccessTarget.objectMember(
       DartType receiverType, Member member) = InstanceAccessTarget.object;
@@ -126,6 +133,9 @@
   /// Returns `true` if this is an access to an instance member.
   bool get isInstanceMember => kind == ObjectAccessTargetKind.instanceMember;
 
+  /// Returns `true` if this is an access to a super member.
+  bool get isSuperMember => kind == ObjectAccessTargetKind.superMember;
+
   /// Returns `true` if this is an access to an Object member.
   bool get isObjectMember => kind == ObjectAccessTargetKind.objectMember;
 
@@ -371,6 +381,10 @@
   InstanceAccessTarget.nullable(this.receiverType, this.member)
       : super.internal(ObjectAccessTargetKind.nullableInstanceMember);
 
+  /// Creates an access to the super [member].
+  InstanceAccessTarget.superMember(this.receiverType, this.member)
+      : super.internal(ObjectAccessTargetKind.superMember);
+
   /// Creates an access to the Object [member].
   InstanceAccessTarget.object(this.receiverType, this.member)
       : super.internal(ObjectAccessTargetKind.objectMember);
@@ -378,32 +392,28 @@
   @override
   FunctionType getFunctionType(InferenceVisitorBase base) {
     return _getFunctionType(
-        base, base.getGetterTypeForMemberTarget(member, receiverType));
+        base,
+        base.getGetterTypeForMemberTarget(member, receiverType,
+            isSuper: isSuperMember));
   }
 
   @override
   DartType getGetterType(InferenceVisitorBase base) {
-    return base.getGetterTypeForMemberTarget(member, receiverType);
+    return base.getGetterTypeForMemberTarget(member, receiverType,
+        isSuper: isSuperMember);
   }
 
   @override
   DartType getSetterType(InferenceVisitorBase base) {
     Member interfaceMember = member;
     Class memberClass = interfaceMember.enclosingClass!;
-    DartType setterType;
-    if (interfaceMember is Procedure) {
-      assert(interfaceMember.kind == ProcedureKind.Setter);
-      List<VariableDeclaration> setterParameters =
-          interfaceMember.function.positionalParameters;
-      setterType = setterParameters.length > 0
-          ? setterParameters[0].type
-          : const DynamicType();
-    } else if (interfaceMember is Field) {
-      setterType = interfaceMember.type;
-    } else {
-      throw unexpected(
-          interfaceMember.runtimeType.toString(), 'getSetterType', -1, null);
-    }
+    assert(
+        interfaceMember is Field && interfaceMember.hasSetter ||
+            interfaceMember is Procedure && interfaceMember.isSetter,
+        "Unexpected setter target $interfaceMember");
+    DartType setterType = isSuperMember
+        ? interfaceMember.superSetterType
+        : interfaceMember.setterType;
     if (memberClass.typeParameters.isNotEmpty) {
       DartType resolvedReceiverType = base.resolveTypeParameter(receiverType);
       if (resolvedReceiverType is InterfaceType) {
@@ -439,7 +449,9 @@
   @override
   DartType getIndexKeyType(InferenceVisitorBase base) {
     FunctionType functionType = _getFunctionType(
-        base, base.getGetterTypeForMemberTarget(member, receiverType));
+        base,
+        base.getGetterTypeForMemberTarget(member, receiverType,
+            isSuper: isSuperMember));
     if (functionType.positionalParameters.length >= 1) {
       return functionType.positionalParameters[0];
     }
@@ -449,7 +461,9 @@
   @override
   DartType getIndexSetValueType(InferenceVisitorBase base) {
     FunctionType functionType = _getFunctionType(
-        base, base.getGetterTypeForMemberTarget(member, receiverType));
+        base,
+        base.getGetterTypeForMemberTarget(member, receiverType,
+            isSuper: isSuperMember));
     if (functionType.positionalParameters.length >= 2) {
       return functionType.positionalParameters[1];
     }
@@ -459,14 +473,18 @@
   @override
   DartType getReturnType(InferenceVisitorBase base) {
     FunctionType functionType = _getFunctionType(
-        base, base.getGetterTypeForMemberTarget(member, receiverType));
+        base,
+        base.getGetterTypeForMemberTarget(member, receiverType,
+            isSuper: isSuperMember));
     return functionType.returnType;
   }
 
   @override
   DartType getBinaryOperandType(InferenceVisitorBase base) {
     FunctionType functionType = _getFunctionType(
-        base, base.getGetterTypeForMemberTarget(member, receiverType));
+        base,
+        base.getGetterTypeForMemberTarget(member, receiverType,
+            isSuper: isSuperMember));
     if (functionType.positionalParameters.isNotEmpty) {
       return functionType.positionalParameters.first;
     }
diff --git a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.expect b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.expect
index 31c108e..dc1a538 100644
--- a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.expect
+++ b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
-//     void Function(num) sup1 = super.method; // ok
-//                                     ^
-//
 // pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
 //     void Function(num) cls1 = Class().method; // error
 //                                       ^
 //
+// pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//     Class().setter = 0.5; // error
+//                      ^
+//
 // pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 //   sub.method(0.5); // error
 //              ^
@@ -42,10 +42,8 @@
     : super self::Class::•()
     ;
   method method(covariant-by-declaration core::int a) → void {
-    (core::num) → void sup1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
-    void Function(num) sup1 = super.method; // ok
-                                    ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
-    (core::int) → void sup2 = super.{self::Class::method};
+    (core::num) → void sup1 = super.{self::Class::method};
+    (core::num) → void sup2 = super.{self::Class::method};
     (core::num) → void cls1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
     void Function(num) cls1 = Class().method; // error
                                       ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
@@ -56,7 +54,9 @@
     super.{self::Class::setter} = 0;
     super.{self::Class::setter} = 0.5;
     new self::Class::•().{self::Class::setter} = 0;
-    new self::Class::•().{self::Class::setter} = 0.5;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    Class().setter = 0.5; // error
+                     ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int;
   }
 }
 static method test(self::Subclass sub) → dynamic {
diff --git a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect
index 31c108e..dc1a538 100644
--- a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
-//     void Function(num) sup1 = super.method; // ok
-//                                     ^
-//
 // pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
 //     void Function(num) cls1 = Class().method; // error
 //                                       ^
 //
+// pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//     Class().setter = 0.5; // error
+//                      ^
+//
 // pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 //   sub.method(0.5); // error
 //              ^
@@ -42,10 +42,8 @@
     : super self::Class::•()
     ;
   method method(covariant-by-declaration core::int a) → void {
-    (core::num) → void sup1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
-    void Function(num) sup1 = super.method; // ok
-                                    ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
-    (core::int) → void sup2 = super.{self::Class::method};
+    (core::num) → void sup1 = super.{self::Class::method};
+    (core::num) → void sup2 = super.{self::Class::method};
     (core::num) → void cls1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
     void Function(num) cls1 = Class().method; // error
                                       ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
@@ -56,7 +54,9 @@
     super.{self::Class::setter} = 0;
     super.{self::Class::setter} = 0.5;
     new self::Class::•().{self::Class::setter} = 0;
-    new self::Class::•().{self::Class::setter} = 0.5;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    Class().setter = 0.5; // error
+                     ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int;
   }
 }
 static method test(self::Subclass sub) → dynamic {
diff --git a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.transformed.expect b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.transformed.expect
new file mode 100644
index 0000000..dc1a538
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.transformed.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) cls1 = Class().method; // error
+//                                       ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//     Class().setter = 0.5; // error
+//                      ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   sub.method(0.5); // error
+//              ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:38:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   cls.method(0.5); // error
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method(core::num a) → void {}
+  set setter(core::num a) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method method(covariant-by-declaration core::int a) → void {
+    (core::num) → void sup1 = super.{self::Class::method};
+    (core::num) → void sup2 = super.{self::Class::method};
+    (core::num) → void cls1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) cls1 = Class().method; // error
+                                      ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::int) → void cls2 = new self::Class::•().{self::Class::method}{(core::int) → void};
+    (core::int) → void cls3 = new self::Class::•().{self::Class::method}{(core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    super.{self::Class::setter} = 0;
+    super.{self::Class::setter} = 0.5;
+    new self::Class::•().{self::Class::setter} = 0;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:28:22: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    Class().setter = 0.5; // error
+                     ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+static method test(self::Subclass sub) → dynamic {
+  sub.{self::Subclass::method}(0){(core::int) → void};
+  sub.{self::Subclass::method}(invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  sub.method(0.5); // error
+             ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  self::Class cls = sub;
+  cls.{self::Class::method}(0){(core::int) → void};
+  cls.{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:38:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  cls.method(0.5); // error
+             ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  self::Super sup = sub;
+  sup.{self::Super::method}(0){(core::num) → void};
+  sup.{self::Super::method}(0.5){(core::num) → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart b/pkg/front_end/testcases/general/super_signature_access.dart
new file mode 100644
index 0000000..237739a
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart
@@ -0,0 +1,114 @@
+// 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(num a) {}
+  num operator [](num a) => 0;
+  void operator []=(num a, num b) {}
+  void set setter(num a) {}
+}
+
+class Super1 {
+  num? operator [](num a) => null;
+  void operator []=(num a, num b) {}
+}
+
+class Class extends Super {
+  void method(covariant int a);
+  num operator [](covariant int a);
+  void operator []=(covariant int a, covariant int b);
+  void set setter(covariant int a);
+}
+
+class Class1 extends Super1 {
+  num? operator [](covariant int a);
+
+  void operator []=(covariant int a, covariant int b);
+}
+
+class Subclass extends Class {
+  void method(int a) {
+    num b = a;
+    void Function(num) f = super.method; // Ok: type `void Function(num)`.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+    super.method(b); // Ok.
+    Class().method(b); // Error.
+  }
+
+  num operator [](covariant int a) {
+    num b = a;
+    super[b]; // Ok.
+    Class()[b]; // Error.
+    return 0;
+  }
+
+  void operator []=(covariant int a, covariant int b) {
+    num c = a;
+    super[a] = c; // Ok.
+    Class()[a] = c; // Error.
+    super[c] = b; // Ok.
+    Class()[c] = b; // Error.
+    super[a] += c; // Ok.
+    Class()[a] += c; // Error.
+  }
+
+  void set setter(int a) {
+    num b = a;
+    super.setter = b; // Ok.
+    Class().setter = b; // Error.
+  }
+}
+
+class Subclass1 extends Class1 {
+  num? operator [](covariant int a) {
+    return null;
+  }
+
+  void operator []=(covariant int a, covariant int b) {
+    num c = a;
+    super[a] ??= c; // Ok.
+    Class1()[b] ??= c; // Error.
+  }
+}
+
+mixin Mixin on Class {
+  void method(int a) {
+    num b = a;
+    void Function(num) f = super.method; // Error: type `void Function(int)`.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+    super.method(b); // Error.
+    Class().method(b); // Error.
+  }
+
+  num operator [](covariant int a) {
+    num b = a;
+    super[b]; // Error.
+    Class()[b]; // Error.
+    return 0;
+  }
+
+  void operator []=(covariant int a, covariant int b) {
+    num c = a;
+    super[a] = c; // Error.
+    Class()[a] = c; // Error.
+    super[c] = b; // Error.
+    Class()[c] = b; // Error.
+    super[a] += c; // Error.
+    Class()[a] += c; // Error.
+  }
+
+  void set setter(int a) {
+    num b = a;
+    super.setter = b; // Error.
+    Class().setter = b; // Error.
+  }
+}
+
+mixin Mixin1 on Class1 {
+  void operator []=(covariant int a, covariant int b) {
+    num c = a;
+    super[a] ??= c; // Error.
+    Class1()[b] ??= c; // Error.
+  }
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline.expect b/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline.expect
new file mode 100644
index 0000000..0516609
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline.expect
@@ -0,0 +1,45 @@
+class Super {
+  void method(num a) {}
+  num operator [](num a) => 0;
+  void operator []=(num a, num b) {}
+  void set setter(num a) {}
+}
+
+class Super1 {
+  num? operator [](num a) => null;
+  void operator []=(num a, num b) {}
+}
+
+class Class extends Super {
+  void method(covariant int a);
+  num operator [](covariant int a);
+  void operator []=(covariant int a, covariant int b);
+  void set setter(covariant int a);
+}
+
+class Class1 extends Super1 {
+  num? operator [](covariant int a);
+  void operator []=(covariant int a, covariant int b);
+}
+
+class Subclass extends Class {
+  void method(int a) {}
+  num operator [](covariant int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+  void set setter(int a) {}
+}
+
+class Subclass1 extends Class1 {
+  num? operator [](covariant int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+}
+
+mixin Mixin on Class {
+  void method(int a) {}
+  num operator [](covariant int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+  void set setter(int a) {}
+}
+mixin Mixin1 on Class1 {
+  void operator []=(covariant int a, covariant int b) {}
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..91408c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.textual_outline_modelled.expect
@@ -0,0 +1,45 @@
+class Class extends Super {
+  num operator [](covariant int a);
+  void method(covariant int a);
+  void operator []=(covariant int a, covariant int b);
+  void set setter(covariant int a);
+}
+
+class Class1 extends Super1 {
+  num? operator [](covariant int a);
+  void operator []=(covariant int a, covariant int b);
+}
+
+class Subclass extends Class {
+  num operator [](covariant int a) {}
+  void method(int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+  void set setter(int a) {}
+}
+
+class Subclass1 extends Class1 {
+  num? operator [](covariant int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+}
+
+class Super {
+  num operator [](num a) => 0;
+  void method(num a) {}
+  void operator []=(num a, num b) {}
+  void set setter(num a) {}
+}
+
+class Super1 {
+  num? operator [](num a) => null;
+  void operator []=(num a, num b) {}
+}
+
+mixin Mixin on Class {
+  num operator [](covariant int a) {}
+  void method(int a) {}
+  void operator []=(covariant int a, covariant int b) {}
+  void set setter(int a) {}
+}
+mixin Mixin1 on Class1 {
+  void operator []=(covariant int a, covariant int b) {}
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.weak.expect b/pkg/front_end/testcases/general/super_signature_access.dart.weak.expect
new file mode 100644
index 0000000..5360628
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.weak.expect
@@ -0,0 +1,272 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) f = super.method; // Error: type `void Function(int)`.
+//                                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super.method(b); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[b]; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[a] = c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[c] = b; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] += c; // Error.
+//              ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super.setter = b; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] ??= c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method(core::num a) → void {}
+  operator [](core::num a) → core::num
+    return 0;
+  operator []=(core::num a, core::num b) → void {}
+  set setter(core::num a) → void {}
+}
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  operator [](core::num a) → core::num?
+    return null;
+  operator []=(core::num a, core::num b) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num */ [](covariant-by-declaration core::num a) → core::num
+    return super.{self::Super::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super::[]=}(a, b);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num? */ [](covariant-by-declaration core::num a) → core::num?
+    return super.{self::Super1::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super1::[]=}(a, b);
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = super.{self::Class::method};
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(b);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(b);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, c);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(c, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t1 = a in super.{self::Class::[]=}(#t1, super.{self::Class::[]}(#t1).{core::num::+}(c){(core::num) → core::num});
+    let final self::Class #t2 = new self::Class::•() in let final core::int #t3 = a in #t2.{self::Class::[]=}(#t3, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t2.{self::Class::[]}(#t3){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = b;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+class Subclass1 extends self::Class1 {
+  synthetic constructor •() → self::Subclass1
+    : super self::Class1::•()
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num? {
+    return null;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t4 = a in super.{self::Class1::[]}(#t4) == null ?{core::num} super.{self::Class1::[]=}(#t4, c) : null;
+    let final self::Class1 #t5 = new self::Class1::•() in let final core::int #t6 = b in #t5.{self::Class1::[]}(#t6){(core::int) → core::num?} == null ?{core::num} #t5.{self::Class1::[]=}(#t6, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
+abstract class Mixin extends self::Class /*isMixinDeclaration*/  {
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) f = super.method; // Error: type `void Function(int)`.
+                                 ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super.method(b); // Error.
+                 ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[b]; // Error.
+          ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[a] = c; // Error.
+               ^" in c as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[c] = b; // Error.
+          ^" in c as{TypeError,ForNonNullableByDefault} core::int, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t7 = a in super.{self::Class::[]=}(#t7, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] += c; // Error.
+             ^" in super.{self::Class::[]}(#t7).{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int);
+    let final self::Class #t8 = new self::Class::•() in let final core::int #t9 = a in #t8.{self::Class::[]=}(#t9, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t8.{self::Class::[]}(#t9){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super.setter = b; // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+abstract class Mixin1 extends self::Class1 /*isMixinDeclaration*/  {
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t10 = a in super.{self::Class1::[]}(#t10) == null ?{core::num} super.{self::Class1::[]=}(#t10, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] ??= c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int) : null;
+    let final self::Class1 #t11 = new self::Class1::•() in let final core::int #t12 = b in #t11.{self::Class1::[]}(#t12){(core::int) → core::num?} == null ?{core::num} #t11.{self::Class1::[]=}(#t12, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_signature_access.dart.weak.modular.expect
new file mode 100644
index 0000000..5360628
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.weak.modular.expect
@@ -0,0 +1,272 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) f = super.method; // Error: type `void Function(int)`.
+//                                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super.method(b); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[b]; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[a] = c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[c] = b; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] += c; // Error.
+//              ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super.setter = b; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] ??= c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method(core::num a) → void {}
+  operator [](core::num a) → core::num
+    return 0;
+  operator []=(core::num a, core::num b) → void {}
+  set setter(core::num a) → void {}
+}
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  operator [](core::num a) → core::num?
+    return null;
+  operator []=(core::num a, core::num b) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num */ [](covariant-by-declaration core::num a) → core::num
+    return super.{self::Super::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super::[]=}(a, b);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num? */ [](covariant-by-declaration core::num a) → core::num?
+    return super.{self::Super1::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super1::[]=}(a, b);
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = super.{self::Class::method};
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(b);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(b);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, c);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(c, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t1 = a in super.{self::Class::[]=}(#t1, super.{self::Class::[]}(#t1).{core::num::+}(c){(core::num) → core::num});
+    let final self::Class #t2 = new self::Class::•() in let final core::int #t3 = a in #t2.{self::Class::[]=}(#t3, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t2.{self::Class::[]}(#t3){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = b;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+class Subclass1 extends self::Class1 {
+  synthetic constructor •() → self::Subclass1
+    : super self::Class1::•()
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num? {
+    return null;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t4 = a in super.{self::Class1::[]}(#t4) == null ?{core::num} super.{self::Class1::[]=}(#t4, c) : null;
+    let final self::Class1 #t5 = new self::Class1::•() in let final core::int #t6 = b in #t5.{self::Class1::[]}(#t6){(core::int) → core::num?} == null ?{core::num} #t5.{self::Class1::[]=}(#t6, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
+abstract class Mixin extends self::Class /*isMixinDeclaration*/  {
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) f = super.method; // Error: type `void Function(int)`.
+                                 ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super.method(b); // Error.
+                 ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[b]; // Error.
+          ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[a] = c; // Error.
+               ^" in c as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[c] = b; // Error.
+          ^" in c as{TypeError,ForNonNullableByDefault} core::int, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t7 = a in super.{self::Class::[]=}(#t7, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] += c; // Error.
+             ^" in super.{self::Class::[]}(#t7).{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int);
+    let final self::Class #t8 = new self::Class::•() in let final core::int #t9 = a in #t8.{self::Class::[]=}(#t9, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t8.{self::Class::[]}(#t9){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super.setter = b; // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+abstract class Mixin1 extends self::Class1 /*isMixinDeclaration*/  {
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t10 = a in super.{self::Class1::[]}(#t10) == null ?{core::num} super.{self::Class1::[]=}(#t10, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] ??= c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int) : null;
+    let final self::Class1 #t11 = new self::Class1::•() in let final core::int #t12 = b in #t11.{self::Class1::[]}(#t12){(core::int) → core::num?} == null ?{core::num} #t11.{self::Class1::[]=}(#t12, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.weak.outline.expect b/pkg/front_end/testcases/general/super_signature_access.dart.weak.outline.expect
new file mode 100644
index 0000000..021eedc
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.weak.outline.expect
@@ -0,0 +1,78 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    ;
+  method method(core::num a) → void
+    ;
+  operator [](core::num a) → core::num
+    ;
+  operator []=(core::num a, core::num b) → void
+    ;
+  set setter(core::num a) → void
+    ;
+}
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    ;
+  operator [](core::num a) → core::num?
+    ;
+  operator []=(core::num a, core::num b) → void
+    ;
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num */ [](covariant-by-declaration core::num a) → core::num
+    return super.{self::Super::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super::[]=}(a, b);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    ;
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num? */ [](covariant-by-declaration core::num a) → core::num?
+    return super.{self::Super1::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super1::[]=}(a, b);
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    ;
+  method method(covariant-by-declaration core::int a) → void
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num
+    ;
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
+    ;
+  set setter(covariant-by-declaration core::int a) → void
+    ;
+}
+class Subclass1 extends self::Class1 {
+  synthetic constructor •() → self::Subclass1
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num?
+    ;
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
+    ;
+}
+abstract class Mixin extends self::Class /*isMixinDeclaration*/  {
+  method method(covariant-by-declaration core::int a) → void
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num
+    ;
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
+    ;
+  set setter(covariant-by-declaration core::int a) → void
+    ;
+}
+abstract class Mixin1 extends self::Class1 /*isMixinDeclaration*/  {
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
+    ;
+}
diff --git a/pkg/front_end/testcases/general/super_signature_access.dart.weak.transformed.expect b/pkg/front_end/testcases/general/super_signature_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..5360628
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_signature_access.dart.weak.transformed.expect
@@ -0,0 +1,272 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) f = super.method; // Error: type `void Function(int)`.
+//                                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) g = Class().method; // Error: type `void Function(int)`.
+//                                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super.method(b); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     Class().method(b); // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[b]; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[b]; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[a] = c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] = c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+//     super[c] = b; // Error.
+//           ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[c] = b; // Error.
+//             ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] += c; // Error.
+//              ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class()[a] += c; // Error.
+//                ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super.setter = b; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class().setter = b; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     super[a] ??= c; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//     Class1()[b] ??= c; // Error.
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method(core::num a) → void {}
+  operator [](core::num a) → core::num
+    return 0;
+  operator []=(core::num a, core::num b) → void {}
+  set setter(core::num a) → void {}
+}
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  operator [](core::num a) → core::num?
+    return null;
+  operator []=(core::num a, core::num b) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num */ [](covariant-by-declaration core::num a) → core::num
+    return super.{self::Super::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super::[]=}(a, b);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num? */ [](covariant-by-declaration core::num a) → core::num?
+    return super.{self::Super1::[]}(a);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
+    return super.{self::Super1::[]=}(a, b);
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = super.{self::Class::method};
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:34:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(b);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:36:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(b);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, c);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:49:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(c, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:51:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t1 = a in super.{self::Class::[]=}(#t1, super.{self::Class::[]}(#t1).{core::num::+}(c){(core::num) → core::num});
+    let final self::Class #t2 = new self::Class::•() in let final core::int #t3 = a in #t2.{self::Class::[]=}(#t3, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:53:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t2.{self::Class::[]}(#t3){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = b;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:59:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+class Subclass1 extends self::Class1 {
+  synthetic constructor •() → self::Subclass1
+    : super self::Class1::•()
+    ;
+  operator [](covariant-by-declaration core::int a) → core::num? {
+    return null;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t4 = a in super.{self::Class1::[]}(#t4) == null ?{core::num} super.{self::Class1::[]=}(#t4, c) : null;
+    let final self::Class1 #t5 = new self::Class1::•() in let final core::int #t6 = b in #t5.{self::Class1::[]}(#t6){(core::int) → core::num?} == null ?{core::num} #t5.{self::Class1::[]=}(#t6, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:71:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
+abstract class Mixin extends self::Class /*isMixinDeclaration*/  {
+  method method(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    (core::num) → void f = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:78:34: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) f = super.method; // Error: type `void Function(int)`.
+                                 ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::num) → void g = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:79:36: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) g = Class().method; // Error: type `void Function(int)`.
+                                   ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    super.{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:80:18: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super.method(b); // Error.
+                 ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:81:20: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    Class().method(b); // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  }
+  operator [](covariant-by-declaration core::int a) → core::num {
+    core::num b = a;
+    super.{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:86:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[b]; // Error.
+          ^" in b as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[b]; // Error.
+            ^" in b as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::num};
+    return 0;
+  }
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    super.{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:93:16: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[a] = c; // Error.
+               ^" in c as{TypeError,ForNonNullableByDefault} core::int);
+    new self::Class::•().{self::Class::[]=}(a, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:94:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] = c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+    super.{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:95:11: Error: The argument type 'num' can't be assigned to the parameter type 'int'.
+    super[c] = b; // Error.
+          ^" in c as{TypeError,ForNonNullableByDefault} core::int, b);
+    new self::Class::•().{self::Class::[]=}(invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:96:13: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[c] = b; // Error.
+            ^" in c as{TypeError,ForNonNullableByDefault} core::int, b){(core::int, core::int) → void};
+    let final core::int #t7 = a in super.{self::Class::[]=}(#t7, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:97:14: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] += c; // Error.
+             ^" in super.{self::Class::[]}(#t7).{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int);
+    let final self::Class #t8 = new self::Class::•() in let final core::int #t9 = a in #t8.{self::Class::[]=}(#t9, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:98:16: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class()[a] += c; // Error.
+               ^" in #t8.{self::Class::[]}(#t9){(core::int) → core::num}.{core::num::+}(c){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    core::num b = a;
+    super.{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:103:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super.setter = b; // Error.
+                   ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+    new self::Class::•().{self::Class::setter} = invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:104:22: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class().setter = b; // Error.
+                     ^" in b as{TypeError,ForNonNullableByDefault} core::int;
+  }
+}
+abstract class Mixin1 extends self::Class1 /*isMixinDeclaration*/  {
+  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void {
+    core::num c = a;
+    let final core::int #t10 = a in super.{self::Class1::[]}(#t10) == null ?{core::num} super.{self::Class1::[]=}(#t10, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:111:18: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    super[a] ??= c; // Error.
+                 ^" in c as{TypeError,ForNonNullableByDefault} core::int) : null;
+    let final self::Class1 #t11 = new self::Class1::•() in let final core::int #t12 = b in #t11.{self::Class1::[]}(#t12){(core::int) → core::num?} == null ?{core::num} #t11.{self::Class1::[]=}(#t12, invalid-expression "pkg/front_end/testcases/general/super_signature_access.dart:112:21: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+    Class1()[b] ??= c; // Error.
+                    ^" in c as{TypeError,ForNonNullableByDefault} core::int){(core::int, core::int) → void} : null;
+  }
+}
diff --git a/pkg/front_end/testcases/modular.status b/pkg/front_end/testcases/modular.status
index a1b7a94..639c2dc 100644
--- a/pkg/front_end/testcases/modular.status
+++ b/pkg/front_end/testcases/modular.status
@@ -47,7 +47,6 @@
 general/override_check_basic: TypeCheckError # Issue #31620
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
-general/super_semi_stub: TypeCheckError
 general/unsound_promotion: TypeCheckError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index b71c27e..d2d575d 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -170,7 +170,6 @@
 general/override_setter_with_field: TypeCheckError
 general/redirecting_factory: RuntimeError
 general/spread_collection: RuntimeError
-general/super_semi_stub: TypeCheckError
 general/type_variable_as_super: RuntimeError
 general/unsound_promotion: TypeCheckError
 general/void_methods: RuntimeError
