[cfe] Report contravariant type variable use in extension types
Closes https://github.com/dart-lang/sdk/issues/53803
Part of https://github.com/dart-lang/sdk/issues/49731
Change-Id: I348f6c84aa61eddae306faa96a560b4960724462
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331242
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 2c2e492..38b166f 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -6120,3 +6120,44 @@
"""Try correcting the name to the name of an existing setter, or defining a setter or field named '${name}'.""",
arguments: {'name': name, 'type': _type});
}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ templateWrongTypeParameterVarianceInSuperinterface =
+ const Template<
+ Message Function(String name, DartType _type,
+ bool isNonNullableByDefault)>(
+ "WrongTypeParameterVarianceInSuperinterface",
+ problemMessageTemplate:
+ r"""'#name' can't be used contravariantly or invariantly in '#type'.""",
+ withArguments:
+ _withArgumentsWrongTypeParameterVarianceInSuperinterface);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>
+ codeWrongTypeParameterVarianceInSuperinterface = const Code<
+ Message Function(
+ String name, DartType _type, bool isNonNullableByDefault)>(
+ "WrongTypeParameterVarianceInSuperinterface",
+ analyzerCodes: <String>[
+ "WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsWrongTypeParameterVarianceInSuperinterface(
+ String name, DartType _type, bool isNonNullableByDefault) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeWrongTypeParameterVarianceInSuperinterface,
+ problemMessage:
+ """'${name}' can't be used contravariantly or invariantly in '${type}'.""" +
+ labeler.originMessages,
+ arguments: {'name': name, 'type': _type});
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 8bd02ff..f08b35b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -58,84 +58,91 @@
typeArguments: List<TypeBuilder>? arguments
):
assert(declaration != null);
- if (declaration is NominalVariableBuilder) {
- if (declaration == variable) {
- return Variance.covariant;
- } else {
- return Variance.unrelated;
- }
- } else {
- switch (declaration) {
- case ClassBuilder():
- int result = Variance.unrelated;
- if (arguments != null) {
- for (int i = 0; i < arguments.length; ++i) {
- result = Variance.meet(
- result,
- Variance.combine(
- declaration.cls.typeParameters[i].variance,
- computeTypeVariableBuilderVariance(
- variable, arguments[i], libraryBuilder)));
- }
+ switch (declaration) {
+ case ClassBuilder():
+ int result = Variance.unrelated;
+ if (arguments != null) {
+ for (int i = 0; i < arguments.length; ++i) {
+ result = Variance.meet(
+ result,
+ Variance.combine(
+ declaration.cls.typeParameters[i].variance,
+ computeTypeVariableBuilderVariance(
+ variable, arguments[i], libraryBuilder)));
}
- return result;
- case TypeAliasBuilder():
- int result = Variance.unrelated;
+ }
+ return result;
+ case TypeAliasBuilder():
+ int result = Variance.unrelated;
- if (type.typeArguments != null) {
- for (int i = 0; i < type.typeArguments!.length; ++i) {
- const int visitMarker = -2;
+ if (type.typeArguments != null) {
+ for (int i = 0; i < type.typeArguments!.length; ++i) {
+ const int visitMarker = -2;
- int declarationTypeVariableVariance = declaration.varianceAt(i);
- if (declarationTypeVariableVariance == pendingVariance) {
- assert(!declaration.fromDill);
- NominalVariableBuilder declarationTypeVariable =
- declaration.typeVariables![i];
- declarationTypeVariable.variance = visitMarker;
- int computedVariance = computeTypeVariableBuilderVariance(
- declarationTypeVariable,
- declaration.type,
- libraryBuilder);
- declarationTypeVariableVariance =
- declarationTypeVariable.variance = computedVariance;
- } else if (declarationTypeVariableVariance == visitMarker) {
- assert(!declaration.fromDill);
- NominalVariableBuilder declarationTypeVariable =
- declaration.typeVariables![i];
- libraryBuilder.addProblem(
- templateCyclicTypedef.withArguments(declaration.name),
- declaration.charOffset,
- declaration.name.length,
- declaration.fileUri);
- // Use [Variance.unrelated] for recovery. The type with the
- // cyclic dependency will be replaced with an [InvalidType]
- // elsewhere.
- declarationTypeVariableVariance =
- declarationTypeVariable.variance = Variance.unrelated;
- }
-
- result = Variance.meet(
- result,
- Variance.combine(
- computeTypeVariableBuilderVariance(
- variable, type.typeArguments![i], libraryBuilder),
- declarationTypeVariableVariance));
+ int declarationTypeVariableVariance = declaration.varianceAt(i);
+ if (declarationTypeVariableVariance == pendingVariance) {
+ assert(!declaration.fromDill);
+ NominalVariableBuilder declarationTypeVariable =
+ declaration.typeVariables![i];
+ declarationTypeVariable.variance = visitMarker;
+ int computedVariance = computeTypeVariableBuilderVariance(
+ declarationTypeVariable, declaration.type, libraryBuilder);
+ declarationTypeVariableVariance =
+ declarationTypeVariable.variance = computedVariance;
+ } else if (declarationTypeVariableVariance == visitMarker) {
+ assert(!declaration.fromDill);
+ NominalVariableBuilder declarationTypeVariable =
+ declaration.typeVariables![i];
+ libraryBuilder.addProblem(
+ templateCyclicTypedef.withArguments(declaration.name),
+ declaration.charOffset,
+ declaration.name.length,
+ declaration.fileUri);
+ // Use [Variance.unrelated] for recovery. The type with the
+ // cyclic dependency will be replaced with an [InvalidType]
+ // elsewhere.
+ declarationTypeVariableVariance =
+ declarationTypeVariable.variance = Variance.unrelated;
}
+
+ result = Variance.meet(
+ result,
+ Variance.combine(
+ computeTypeVariableBuilderVariance(
+ variable, type.typeArguments![i], libraryBuilder),
+ declarationTypeVariableVariance));
}
- return result;
- case ExtensionTypeDeclarationBuilder():
- // TODO(johnniwinther): Handle this case.
- case NominalVariableBuilder():
- case StructuralVariableBuilder():
- case ExtensionBuilder():
- case InvalidTypeDeclarationBuilder():
- case BuiltinTypeDeclarationBuilder():
- // TODO(johnniwinther): How should we handle this case?
- case OmittedTypeDeclarationBuilder():
- case null:
- }
- return Variance.unrelated;
+ }
+ return result;
+ case ExtensionTypeDeclarationBuilder():
+ int result = Variance.unrelated;
+ if (arguments != null) {
+ for (int i = 0; i < arguments.length; ++i) {
+ result = Variance.meet(
+ result,
+ Variance.combine(
+ declaration
+ .extensionTypeDeclaration.typeParameters[i].variance,
+ computeTypeVariableBuilderVariance(
+ variable, arguments[i], libraryBuilder)));
+ }
+ }
+ return result;
+ case NominalVariableBuilder():
+ if (declaration == variable) {
+ return Variance.covariant;
+ } else {
+ return Variance.unrelated;
+ }
+ case StructuralVariableBuilder():
+ case ExtensionBuilder():
+ case InvalidTypeDeclarationBuilder():
+ case BuiltinTypeDeclarationBuilder():
+ // TODO(johnniwinther): How should we handle this case?
+ case OmittedTypeDeclarationBuilder():
+ case null:
}
+ return Variance.unrelated;
case FunctionTypeBuilder(
:List<StructuralVariableBuilder>? typeVariables,
:List<ParameterBuilder>? formals,
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
index 9c8d2bc..376548d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
@@ -22,6 +22,7 @@
import '../builder/type_builder.dart';
import '../kernel/hierarchy/hierarchy_builder.dart';
import '../kernel/kernel_helper.dart';
+import '../kernel/type_algorithms.dart';
import '../messages.dart';
import '../problems.dart';
import '../scope.dart';
@@ -136,6 +137,36 @@
typeBuilder.build(libraryBuilder, TypeUse.superType);
Message? errorMessage;
List<LocatedMessage>? errorContext;
+
+ if (typeParameters?.isNotEmpty ?? false) {
+ for (NominalVariableBuilder variable in typeParameters!) {
+ int variance = computeTypeVariableBuilderVariance(
+ variable, typeBuilder, libraryBuilder);
+ if (!Variance.greaterThanOrEqual(variance, variable.variance)) {
+ if (variable.parameter.isLegacyCovariant) {
+ errorMessage =
+ templateWrongTypeParameterVarianceInSuperinterface
+ .withArguments(variable.name, interface,
+ libraryBuilder.isNonNullableByDefault);
+ } else {
+ errorMessage =
+ templateInvalidTypeVariableInSupertypeWithVariance
+ .withArguments(
+ Variance.keywordString(variable.variance),
+ variable.name,
+ Variance.keywordString(variance),
+ typeBuilder.typeName!.name);
+ }
+ }
+ }
+ if (errorMessage != null) {
+ libraryBuilder.addProblem(errorMessage, typeBuilder.charOffset!,
+ noLength, typeBuilder.fileUri,
+ context: errorContext);
+ errorMessage = null;
+ }
+ }
+
if (interface is ExtensionType) {
if (interface.nullability == Nullability.nullable) {
errorMessage =
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 092ebfd..fdb5155 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -7454,3 +7454,10 @@
script: |
extension type E(int foo,) {}
analyzerCode: REPRESENTATION_FIELD_TRAILING_COMMA
+
+WrongTypeParameterVarianceInSuperinterface:
+ problemMessage: "'#name' can't be used contravariantly or invariantly in '#type'."
+ experiments: inline-class
+ script: |
+ extension type E<X>(List<Function(Object?)> foo) implements List<Function(X)> {}
+ analyzerCode: WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
index fc262da..234b7bd8 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
index fc262da..234b7bd8 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.expect
index fc262da..234b7bd8 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.modular.expect
index fc262da..234b7bd8 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.modular.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.outline.expect
index 4b5037c..5eae7a7 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.outline.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.transformed.expect
index fc262da..234b7bd8 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.weak.transformed.expect
@@ -195,7 +195,7 @@
import "dart:core" as core;
typedef Alias9 = self::E9 /* = invalid-type */;
-typedef Alias10<unrelated T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
+typedef Alias10<T extends core::Object? = dynamic> = self::E10<T%> /* = invalid-type */;
typedef Alias11 = () → self::E11 /* = invalid-type */;
typedef Alias12 = (self::E12 /* = invalid-type */) → void;
typedef Alias13 = <T extends self::E13 /* = invalid-type */ = dynamic>() → void;
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart b/pkg/front_end/testcases/extension_types/issue53803.dart
new file mode 100644
index 0000000..ea1da56
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by b
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<X> {}
+extension type ExtensionType<X>(Object? foo) {}
+
+extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+extension type E2<X>(Class<Never> foo) implements Class<Function(Function(X))> {} // Ok.
+extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+extension type E5<X>(Class<Never> foo) implements Class<X Function(Function(X))> {} // Ok.
+extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+
+extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+extension type E8<X>(Object? foo) implements ExtensionType<Function(Function(X))> {} // Ok.
+extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+extension type E11<X>(Object? foo) implements ExtensionType<X Function(Function(X))> {} // Ok.
+extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.strong.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.strong.expect
new file mode 100644
index 0000000..26689b4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.strong.expect
@@ -0,0 +1,191 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ : super core::Object::•()
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ {
+ lowered final self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E7<self::E7|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E8<self::E8|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E9<self::E9|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E10<self::E10|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E11<self::E11|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E12<self::E12|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.strong.transformed.expect
new file mode 100644
index 0000000..26689b4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.strong.transformed.expect
@@ -0,0 +1,191 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ : super core::Object::•()
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ {
+ lowered final self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E7<self::E7|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E8<self::E8|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E9<self::E9|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E10<self::E10|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E11<self::E11|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E12<self::E12|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect
new file mode 100644
index 0000000..c6ae557
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+class Class<X> {}
+extension type ExtensionType<X>(Object? foo) {}
+extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {}
+extension type E2<X>(Class<Never> foo) implements Class<Function(Function(X))> {}
+extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {}
+extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {}
+extension type E5<X>(Class<Never> foo) implements Class<X Function(Function(X))> {}
+extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {}
+extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {}
+extension type E8<X>(Object? foo) implements ExtensionType<Function(Function(X))> {}
+extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {}
+extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {}
+extension type E11<X>(Object? foo) implements ExtensionType<X Function(Function(X))> {}
+extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {}
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e2fa479
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+class Class<X> {}
+extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {}
+extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {}
+extension type E11<X>(Object? foo) implements ExtensionType<X Function(Function(X))> {}
+extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {}
+extension type E2<X>(Class<Never> foo) implements Class<Function(Function(X))> {}
+extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {}
+extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {}
+extension type E5<X>(Class<Never> foo) implements Class<X Function(Function(X))> {}
+extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {}
+extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {}
+extension type E8<X>(Object? foo) implements ExtensionType<Function(Function(X))> {}
+extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {}
+extension type ExtensionType<X>(Object? foo) {}
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.weak.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.expect
new file mode 100644
index 0000000..26689b4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.expect
@@ -0,0 +1,191 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ : super core::Object::•()
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ {
+ lowered final self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E7<self::E7|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E8<self::E8|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E9<self::E9|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E10<self::E10|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E11<self::E11|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E12<self::E12|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.modular.expect
new file mode 100644
index 0000000..26689b4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.modular.expect
@@ -0,0 +1,191 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ : super core::Object::•()
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ {
+ lowered final self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E7<self::E7|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E8<self::E8|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E9<self::E9|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E10<self::E10|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E11<self::E11|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E12<self::E12|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.outline.expect
new file mode 100644
index 0000000..1b64560
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.outline.expect
@@ -0,0 +1,164 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */
+ ;
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */
+ ;
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);
diff --git a/pkg/front_end/testcases/extension_types/issue53803.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.transformed.expect
new file mode 100644
index 0000000..26689b4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue53803.dart.weak.transformed.expect
@@ -0,0 +1,191 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:8:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E1<X>(Class<Never> foo) implements Class<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:10:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E3<X>(Class<Never> foo) implements Class<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:11:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(X)>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E4<X>(Class<Never> foo) implements Class<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:13:51: Error: 'X' can't be used contravariantly or invariantly in 'Class<X Function(dynamic Function(dynamic Function(X)))>'.
+// - 'Class' is from 'pkg/front_end/testcases/extension_types/issue53803.dart'.
+// extension type E6<X>(Class<Never> foo) implements Class<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:15:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(X)>'.
+// extension type E7<X>(Object? foo) implements ExtensionType<Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:17:46: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<dynamic Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E9<X>(Object? foo) implements ExtensionType<Function(Function(Function(X)))> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:18:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(X)>'.
+// extension type E10<X>(Object? foo) implements ExtensionType<X Function(X)> {} // Error.
+// ^
+//
+// pkg/front_end/testcases/extension_types/issue53803.dart:20:47: Error: 'X' can't be used contravariantly or invariantly in 'ExtensionType<X Function(dynamic Function(dynamic Function(X)))>'.
+// extension type E12<X>(Object? foo) implements ExtensionType<X Function(Function(Function(X)))> {} // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::X%>
+ : super core::Object::•()
+ ;
+}
+extension type ExtensionType<X extends core::Object? = dynamic>(core::Object? foo) {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::ExtensionType|constructor#;
+ constructor tearoff • = self::ExtensionType|constructor#_#new#tearOff;
+}
+extension type E1<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E1|constructor#;
+ constructor tearoff • = self::E1|constructor#_#new#tearOff;
+}
+extension type E2<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E2|constructor#;
+ constructor tearoff • = self::E2|constructor#_#new#tearOff;
+}
+extension type E3<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → dynamic> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E3|constructor#;
+ constructor tearoff • = self::E3|constructor#_#new#tearOff;
+}
+extension type E4<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(X%) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E4|constructor#;
+ constructor tearoff • = self::E4|constructor#_#new#tearOff;
+}
+extension type E5<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<((X%) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E5|constructor#;
+ constructor tearoff • = self::E5|constructor#_#new#tearOff;
+}
+extension type E6<X extends core::Object? = dynamic>(self::Class<Never> foo) implements self::Class<(((X%) → dynamic) → dynamic) → X%> {
+ abstract inline-class-member representation-field get foo() → self::Class<Never>;
+ constructor • = self::E6|constructor#;
+ constructor tearoff • = self::E6|constructor#_#new#tearOff;
+}
+extension type E7<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E7|constructor#;
+ constructor tearoff • = self::E7|constructor#_#new#tearOff;
+}
+extension type E8<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E8|constructor#;
+ constructor tearoff • = self::E8|constructor#_#new#tearOff;
+}
+extension type E9<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → dynamic> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E9|constructor#;
+ constructor tearoff • = self::E9|constructor#_#new#tearOff;
+}
+extension type E10<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(X%) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E10|constructor#;
+ constructor tearoff • = self::E10|constructor#_#new#tearOff;
+}
+extension type E11<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<((X%) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E11|constructor#;
+ constructor tearoff • = self::E11|constructor#_#new#tearOff;
+}
+extension type E12<X extends core::Object? = dynamic>(core::Object? foo) implements self::ExtensionType<(((X%) → dynamic) → dynamic) → X%> /* = core::Object? */ {
+ abstract inline-class-member representation-field get foo() → core::Object?;
+ constructor • = self::E12|constructor#;
+ constructor tearoff • = self::E12|constructor#_#new#tearOff;
+}
+static inline-class-member method ExtensionType|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ {
+ lowered final self::ExtensionType<self::ExtensionType|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method ExtensionType|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::ExtensionType<self::ExtensionType|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::ExtensionType|constructor#<self::ExtensionType|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E1|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E1<self::E1|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E1|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E1<self::E1|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E1|constructor#<self::E1|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E2|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E2<self::E2|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E2|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E2<self::E2|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E2|constructor#<self::E2|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E3|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E3<self::E3|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E3|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E3<self::E3|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E3|constructor#<self::E3|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E4|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E4<self::E4|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E4|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E4<self::E4|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E4|constructor#<self::E4|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E5|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E5<self::E5|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E5|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E5<self::E5|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E5|constructor#<self::E5|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E6|constructor#<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ {
+ lowered final self::E6<self::E6|constructor#::X%> /* = self::Class<Never> */ #this = foo;
+ return #this;
+}
+static inline-class-member method E6|constructor#_#new#tearOff<X extends core::Object? = dynamic>(self::Class<Never> foo) → self::E6<self::E6|constructor#_#new#tearOff::X%> /* = self::Class<Never> */
+ return self::E6|constructor#<self::E6|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E7|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E7<self::E7|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E7|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E7<self::E7|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E7|constructor#<self::E7|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E8|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E8<self::E8|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E8|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E8<self::E8|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E8|constructor#<self::E8|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E9|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E9<self::E9|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E9|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E9<self::E9|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E9|constructor#<self::E9|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E10|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E10<self::E10|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E10|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E10<self::E10|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E10|constructor#<self::E10|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E11|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E11<self::E11|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E11|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E11<self::E11|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E11|constructor#<self::E11|constructor#_#new#tearOff::X%>(foo);
+static inline-class-member method E12|constructor#<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#::X%> /* = core::Object? */ {
+ lowered final self::E12<self::E12|constructor#::X%> /* = core::Object? */ #this = foo;
+ return #this;
+}
+static inline-class-member method E12|constructor#_#new#tearOff<X extends core::Object? = dynamic>(core::Object? foo) → self::E12<self::E12|constructor#_#new#tearOff::X%>% /* = core::Object? */
+ return self::E12|constructor#<self::E12|constructor#_#new#tearOff::X%>(foo);