[cfe] Check for non-covariant type parameters in representation type
Change-Id: I548831780e039d2f885c0ccef1b48a1675e3be21
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/317900
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index d5b8ef6..fdab0d0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -10083,6 +10083,18 @@
r"""Try using a constructor or factory that is 'const'.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonCovariantTypeParameterInRepresentationType =
+ messageNonCovariantTypeParameterInRepresentationType;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonCovariantTypeParameterInRepresentationType =
+ const MessageCode("NonCovariantTypeParameterInRepresentationType",
+ problemMessage:
+ r"""An extension type parameter can't be used non-covariantly in its representation type.""",
+ correctionMessage:
+ r"""Try removing the type parameters from function parameter types and type parameter bounds.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String
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 3e140ce..f112424 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
@@ -23,6 +23,7 @@
import '../messages.dart';
import '../problems.dart';
import '../scope.dart';
+import '../type_inference/type_inference_engine.dart';
import '../util/helpers.dart';
import 'class_declaration.dart';
import 'source_builder_mixins.dart';
@@ -220,6 +221,21 @@
if (typeBuilder.isExplicit) {
representationType =
typeBuilder.build(libraryBuilder, TypeUse.fieldType);
+ if (typeParameters != null) {
+ IncludesTypeParametersNonCovariantly checker =
+ new IncludesTypeParametersNonCovariantly(
+ extensionTypeDeclaration.typeParameters,
+ // We are checking the returned type (field/getter type or return
+ // type of a method) and this is a covariant position.
+ initialVariance: Variance.covariant);
+ if (representationType.accept(checker)) {
+ libraryBuilder.addProblem(
+ messageNonCovariantTypeParameterInRepresentationType,
+ typeBuilder.charOffset!,
+ noLength,
+ typeBuilder.fileUri);
+ }
+ }
} else {
representationType = const DynamicType();
}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index a3b27ab..1a5347b 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -755,6 +755,7 @@
NonAugmentationLibraryMemberConflict/part_wrapped_script: Fail # Uses imports
NonConstConstructor/example: Fail
NonConstFactory/example: Fail
+NonCovariantTypeParameterInRepresentationType/analyzerCode: Fail
NonInstanceTypeVariableUse/example: Fail
NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
NonNullableInNullAware/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index a67a6c2..c171b07 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -7058,3 +7058,10 @@
ScriptTagInPartFile:
problemMessage: "A part file cannot have script tag."
correctionMessage: "Try removing the script tag or the 'part of' directive."
+
+NonCovariantTypeParameterInRepresentationType:
+ problemMessage: "An extension type parameter can't be used non-covariantly in its representation type."
+ correctionMessage: "Try removing the type parameters from function parameter types and type parameter bounds."
+ experiments: inline-class
+ script: |
+ extension type E<T>(void Function(T) f) {}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 64852c1..393b913 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -82,6 +82,7 @@
beta
bigger
bitmask
+bivariant
bkonyi
bla
blah
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart
new file mode 100644
index 0000000..48c5c0c
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart
@@ -0,0 +1,36 @@
+// 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 a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef Contravariant<T> = void Function(T);
+typedef Invariant<T> = void Function<S extends T>();
+typedef Covariant<T> = T Function();
+typedef Bivariant<T> = T Function(T);
+
+extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+
+extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+
+extension type ET_Covariant<T>(T Function() f) /* Ok */ {}
+
+extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+
+extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+
+extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+
+extension type ET_CovariantAlias<T>(Covariant<T> f) /* Ok */ {}
+
+extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+
+extension type ET_ContravariantAlias1<T>
+ (Contravariant<T> Function() f) /* Error */ {}
+
+extension type ET_ContravariantAlias2<T>
+ (void Function(Covariant<T>) f) /* Error */ {}
+
+extension type ET_CovariantAlias1<T>
+ (Covariant<T> Function() f) /* Ok */ {}
+
+extension type ET_CovariantAlias2<T>
+ (void Function(Contravariant<T>) f) /* Ok */ {}
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.expect
new file mode 100644
index 0000000..ec480a8
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.expect
@@ -0,0 +1,171 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%> {
+ lowered final self::ET_Contravariant<self::ET_Contravariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%> {
+ lowered final self::ET_Invariant<self::ET_Invariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%> {
+ lowered final self::ET_Covariant<self::ET_Covariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%> {
+ lowered final self::ET_Bivariant<self::ET_Bivariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> {
+ lowered final self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> {
+ lowered final self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> {
+ lowered final self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> {
+ lowered final self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> {
+ lowered final self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> {
+ lowered final self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> {
+ lowered final self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> {
+ lowered final self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..ec480a8
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.strong.transformed.expect
@@ -0,0 +1,171 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%> {
+ lowered final self::ET_Contravariant<self::ET_Contravariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%> {
+ lowered final self::ET_Invariant<self::ET_Invariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%> {
+ lowered final self::ET_Covariant<self::ET_Covariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%> {
+ lowered final self::ET_Bivariant<self::ET_Bivariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> {
+ lowered final self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> {
+ lowered final self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> {
+ lowered final self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> {
+ lowered final self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> {
+ lowered final self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> {
+ lowered final self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> {
+ lowered final self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> {
+ lowered final self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..cc45be9
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+typedef Contravariant<T> = void Function(T);
+typedef Invariant<T> = void Function<S extends T>();
+typedef Covariant<T> = T Function();
+typedef Bivariant<T> = T Function(T);
+extension type ET_Contravariant<T>(void Function(T) f) {} extension type ET_Invariant<T>(void Function<S extends T>() f) {} extension type ET_Covariant<T>(T Function() f) {} extension type ET_Bivariant<T>(T Function(T) f) {} extension type ET_ContravariantAlias<T>(Contravariant<T> f) {} extension type ET_InvariantAlias<T>(Invariant<T> f) {} extension type ET_CovariantAlias<T>(Covariant<T> f) {} extension type ET_BivariantAlias<T>(Bivariant<T> f) {} extension type ET_ContravariantAlias1<T> (Contravariant<T> Function() f) {} extension type ET_ContravariantAlias2<T> (void Function(Covariant<T>) f) {} extension type ET_CovariantAlias1<T> (Covariant<T> Function() f) {} extension type ET_CovariantAlias2<T> (void Function(Contravariant<T>) f) {}
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.expect
new file mode 100644
index 0000000..ec480a8
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.expect
@@ -0,0 +1,171 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%> {
+ lowered final self::ET_Contravariant<self::ET_Contravariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%> {
+ lowered final self::ET_Invariant<self::ET_Invariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%> {
+ lowered final self::ET_Covariant<self::ET_Covariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%> {
+ lowered final self::ET_Bivariant<self::ET_Bivariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> {
+ lowered final self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> {
+ lowered final self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> {
+ lowered final self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> {
+ lowered final self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> {
+ lowered final self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> {
+ lowered final self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> {
+ lowered final self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> {
+ lowered final self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..ec480a8
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,171 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%> {
+ lowered final self::ET_Contravariant<self::ET_Contravariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%> {
+ lowered final self::ET_Invariant<self::ET_Invariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%> {
+ lowered final self::ET_Covariant<self::ET_Covariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%> {
+ lowered final self::ET_Bivariant<self::ET_Bivariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> {
+ lowered final self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> {
+ lowered final self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> {
+ lowered final self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> {
+ lowered final self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> {
+ lowered final self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> {
+ lowered final self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> {
+ lowered final self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> {
+ lowered final self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.outline.expect
new file mode 100644
index 0000000..b4e9e79
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.outline.expect
@@ -0,0 +1,147 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%>
+ ;
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%>
+ ;
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%>
+ ;
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%>
+ ;
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%>
+ ;
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%>
+ ;
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%>
+ ;
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%>
+ ;
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%>
+ ;
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%>
+ ;
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%>
+ ;
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%>
+ ;
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.transformed.expect
new file mode 100644
index 0000000..ec480a8
--- /dev/null
+++ b/pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart.weak.transformed.expect
@@ -0,0 +1,171 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:10:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Contravariant<T>(void Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:12:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Invariant<T>(void Function<S extends T>() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:16:34: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_Bivariant<T>(T Function(T) f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:18:41: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_ContravariantAlias<T>(Contravariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:20:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_InvariantAlias<T>(Invariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:24:37: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// extension type ET_BivariantAlias<T>(Bivariant<T> f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:27:23: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (Contravariant<T> Function() f) /* Error */ {}
+// ^
+//
+// pkg/front_end/testcases/inline_class/extension_types/non_covariant_type_parameter.dart:30:11: Error: An extension type parameter can't be used non-covariantly in its representation type.
+// Try removing the type parameters from function parameter types and type parameter bounds.
+// (void Function(Covariant<T>) f) /* Error */ {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Contravariant<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef Invariant<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>() → void;
+typedef Covariant<T extends core::Object? = dynamic> = () → T%;
+typedef Bivariant<invariant T extends core::Object? = dynamic> = (T%) → T%;
+inline class ET_Contravariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_Contravariant|;
+ tearoff • = self::ET_Contravariant|_#new#tearOff;
+}
+inline class ET_Invariant<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_Invariant|;
+ tearoff • = self::ET_Invariant|_#new#tearOff;
+}
+inline class ET_Covariant<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_Covariant|;
+ tearoff • = self::ET_Covariant|_#new#tearOff;
+}
+inline class ET_Bivariant<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_Bivariant|;
+ tearoff • = self::ET_Bivariant|_#new#tearOff;
+}
+inline class ET_ContravariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias|;
+ tearoff • = self::ET_ContravariantAlias|_#new#tearOff;
+}
+inline class ET_InvariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = <S extends T% = dynamic>() → void */ {
+ constructor • = self::ET_InvariantAlias|;
+ tearoff • = self::ET_InvariantAlias|_#new#tearOff;
+}
+inline class ET_CovariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = () → T% */ {
+ constructor • = self::ET_CovariantAlias|;
+ tearoff • = self::ET_CovariantAlias|_#new#tearOff;
+}
+inline class ET_BivariantAlias<T extends core::Object? = dynamic> /* declaredRepresentationType = (T%) → T% */ {
+ constructor • = self::ET_BivariantAlias|;
+ tearoff • = self::ET_BivariantAlias|_#new#tearOff;
+}
+inline class ET_ContravariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → (T%) → void */ {
+ constructor • = self::ET_ContravariantAlias1|;
+ tearoff • = self::ET_ContravariantAlias1|_#new#tearOff;
+}
+inline class ET_ContravariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = (() → T%) → void */ {
+ constructor • = self::ET_ContravariantAlias2|;
+ tearoff • = self::ET_ContravariantAlias2|_#new#tearOff;
+}
+inline class ET_CovariantAlias1<T extends core::Object? = dynamic> /* declaredRepresentationType = () → () → T% */ {
+ constructor • = self::ET_CovariantAlias1|;
+ tearoff • = self::ET_CovariantAlias1|_#new#tearOff;
+}
+inline class ET_CovariantAlias2<T extends core::Object? = dynamic> /* declaredRepresentationType = ((T%) → void) → void */ {
+ constructor • = self::ET_CovariantAlias2|;
+ tearoff • = self::ET_CovariantAlias2|_#new#tearOff;
+}
+static inline-class-member method ET_Contravariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|::T%> {
+ lowered final self::ET_Contravariant<self::ET_Contravariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Contravariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Contravariant<self::ET_Contravariant|_#new#tearOff::T%>
+ return self::ET_Contravariant|<self::ET_Contravariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Invariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|::T%> {
+ lowered final self::ET_Invariant<self::ET_Invariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Invariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Invariant<self::ET_Invariant|_#new#tearOff::T%>
+ return self::ET_Invariant|<self::ET_Invariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Covariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|::T%> {
+ lowered final self::ET_Covariant<self::ET_Covariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Covariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Covariant<self::ET_Covariant|_#new#tearOff::T%>
+ return self::ET_Covariant|<self::ET_Covariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_Bivariant|<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|::T%> {
+ lowered final self::ET_Bivariant<self::ET_Bivariant|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_Bivariant|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_Bivariant<self::ET_Bivariant|_#new#tearOff::T%>
+ return self::ET_Bivariant|<self::ET_Bivariant|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> {
+ lowered final self::ET_ContravariantAlias<self::ET_ContravariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias<self::ET_ContravariantAlias|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias|<self::ET_ContravariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_InvariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> {
+ lowered final self::ET_InvariantAlias<self::ET_InvariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_InvariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_InvariantAlias<self::ET_InvariantAlias|_#new#tearOff::T%>
+ return self::ET_InvariantAlias|<self::ET_InvariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> {
+ lowered final self::ET_CovariantAlias<self::ET_CovariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias<self::ET_CovariantAlias|_#new#tearOff::T%>
+ return self::ET_CovariantAlias|<self::ET_CovariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_BivariantAlias|<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> {
+ lowered final self::ET_BivariantAlias<self::ET_BivariantAlias|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_BivariantAlias|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_BivariantAlias<self::ET_BivariantAlias|_#new#tearOff::T%>
+ return self::ET_BivariantAlias|<self::ET_BivariantAlias|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> {
+ lowered final self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias1<self::ET_ContravariantAlias1|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias1|<self::ET_ContravariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_ContravariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> {
+ lowered final self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_ContravariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_ContravariantAlias2<self::ET_ContravariantAlias2|_#new#tearOff::T%>
+ return self::ET_ContravariantAlias2|<self::ET_ContravariantAlias2|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias1|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> {
+ lowered final self::ET_CovariantAlias1<self::ET_CovariantAlias1|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias1|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias1<self::ET_CovariantAlias1|_#new#tearOff::T%>
+ return self::ET_CovariantAlias1|<self::ET_CovariantAlias1|_#new#tearOff::T%>(f);
+static inline-class-member method ET_CovariantAlias2|<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> {
+ lowered final self::ET_CovariantAlias2<self::ET_CovariantAlias2|::T%> #this = f;
+ return #this;
+}
+static inline-class-member method ET_CovariantAlias2|_#new#tearOff<T extends core::Object? = dynamic>(dynamic f) → self::ET_CovariantAlias2<self::ET_CovariantAlias2|_#new#tearOff::T%>
+ return self::ET_CovariantAlias2|<self::ET_CovariantAlias2|_#new#tearOff::T%>(f);
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 9b76986..511a223 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -149,6 +149,7 @@
inline_class/extension_types/issue52667: FormatterCrash
inline_class/extension_types/member_not_found: FormatterCrash
inline_class/extension_types/method_access: FormatterCrash
+inline_class/extension_types/non_covariant_type_parameter: FormatterCrash
inline_class/extension_types/procedures: FormatterCrash
inline_class/extension_types/representation: FormatterCrash
inline_class/extension_types/supertype_conflict: FormatterCrash