[cfe] Use signature type for super access in inference
This uses the `Procedure.signatureType` for checking super access
instead of the types derived from `Procedure.function`. This fixes
the checking of super access in face semi-stubs where the parameter
types have a more restrictive but covariant type.
Change-Id: I8b21238687bcec8e5e42a999c5a94d0e65cac28c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255660
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
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