[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);