Version 2.16.0-144.0.dev

Merge commit '2ad5ab51bdede28586d21d49258898150c779f1b' into 'dev'
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 25895fe..77326fb 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -256,6 +256,7 @@
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
   CompileTimeErrorCode.INVALID_OVERRIDE,
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
+  CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index f30fcca..7788785 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -76,6 +76,24 @@
   return null;
 }
 
+extension ConstructorDeclarationExtension on ConstructorDeclaration {
+  bool get isNonRedirectingGenerative {
+    // Must be generative.
+    if (externalKeyword != null || factoryKeyword != null) {
+      return false;
+    }
+
+    // Must be non-redirecting.
+    for (var initializer in initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+}
+
 extension ExpressionExtension on Expression {
   /// Return the static type of this expression.
   ///
@@ -104,6 +122,14 @@
     return self;
   }
 
+  FormalParameterList get parentFormalParameterList {
+    var parent = this.parent;
+    if (parent is DefaultFormalParameter) {
+      parent = parent.parent;
+    }
+    return parent as FormalParameterList;
+  }
+
   AstNode get typeOrSelf {
     var self = this;
     if (self is SimpleFormalParameter) {
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 42f8ae1..0f00d43 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -7520,6 +7520,20 @@
 
   /**
    * Parameters:
+   * 0: the super modifier
+   */
+  static const CompileTimeErrorCode INVALID_SUPER_FORMAL_PARAMETER_LOCATION =
+      CompileTimeErrorCode(
+    'INVALID_SUPER_FORMAL_PARAMETER_LOCATION',
+    "Super-formal parameters can only be used in non-redirecting generative "
+        "constructors.",
+    correctionMessage:
+        "Try removing the 'super' modifier, or changing the constructor to be "
+        "non-redirecting and generative.",
+  );
+
+  /**
+   * Parameters:
    * 0: the name of the type parameter
    */
   // #### Description
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 1d7d77c..7d363ca 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1140,6 +1140,20 @@
   }
 
   @override
+  void visitSuperFormalParameter(SuperFormalParameter node) {
+    var constructor = node.parentFormalParameterList.parent;
+    if (!(constructor is ConstructorDeclaration &&
+        constructor.isNonRedirectingGenerative)) {
+      errorReporter.reportErrorForToken(
+        CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION,
+        node.superKeyword,
+      );
+    }
+
+    super.visitSuperFormalParameter(node);
+  }
+
+  @override
   void visitSwitchCase(SwitchCase node) {
     _withHiddenElements(node.statements, () {
       _duplicateDefinitionVerifier.checkStatements(node.statements);
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index b079038..fc0b1e9 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -6526,6 +6526,12 @@
 
       class C {}
       ```
+  INVALID_SUPER_FORMAL_PARAMETER_LOCATION:
+    problemMessage: "Super-formal parameters can only be used in non-redirecting generative constructors."
+    comment: |-
+      Parameters:
+      0: the super modifier
+    correctionMessage: Try removing the 'super' modifier, or changing the constructor to be non-redirecting and generative.
   INVALID_TYPE_ARGUMENT_IN_CONST_LIST:
     sharedName: INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     problemMessage: "Constant list literals can't include a type parameter as a type argument, such as '{0}'."
diff --git a/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
index 6a24380..83f2777 100644
--- a/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
@@ -2,6 +2,7 @@
 // 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.
 
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -46,9 +47,11 @@
   }
 
   test_invalid_notConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 void f(super.a) {}
-''');
+''', [
+      error(CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 7, 5),
+    ]);
 
     var f = findElement.topFunction('f');
     var element = f.superFormalParameter('a');
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart
new file mode 100644
index 0000000..adaa449
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_super_formal_parameter_location_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2021, 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidSuperFormalParameterLocationTest);
+  });
+}
+
+@reflectiveTest
+class InvalidSuperFormalParameterLocationTest extends PubPackageResolutionTest {
+  test_class_constructor_external() async {
+    await assertErrorsInCode(r'''
+class A {
+  external A(super.a);
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 23, 5),
+    ]);
+  }
+
+  test_class_constructor_factory() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A(super.a) {
+    return A._();
+  }
+  A._();
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 22, 5),
+    ]);
+  }
+
+  test_class_constructor_redirecting() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(super.a) : this._();
+  A._();
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 14, 5),
+    ]);
+  }
+
+  test_class_method() async {
+    await assertErrorsInCode(r'''
+class A {
+  void foo(super.a) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 21, 5),
+    ]);
+  }
+
+  test_extension_method() async {
+    await assertErrorsInCode(r'''
+extension E on int {
+  void foo(super.a) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 32, 5),
+    ]);
+  }
+
+  test_local_function() async {
+    await assertErrorsInCode(r'''
+void f() {
+  // ignore:unused_element
+  void g(super.a) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 47, 5),
+    ]);
+  }
+
+  test_mixin_method() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  void foo(super.a) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 21, 5),
+    ]);
+  }
+
+  test_unit_function() async {
+    await assertErrorsInCode(r'''
+void f(super.a) {}
+''', [
+      error(CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION, 7, 5),
+    ]);
+  }
+
+  test_valid_optionalNamed() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+
+class B extends A {
+  B({super.a});
+}
+''');
+  }
+
+  test_valid_optionalPositional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+
+class B extends A {
+  B([super.a]);
+}
+''');
+  }
+
+  test_valid_requiredNamed() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({required super.a});
+}
+''');
+  }
+
+  test_valid_requiredPositional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 485fb55..639450e 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -346,6 +346,8 @@
 import 'invalid_required_positional_param_test.dart'
     as invalid_required_positional_param;
 import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
+import 'invalid_super_formal_parameter_location_test.dart'
+    as invalid_super_formal_parameter_location;
 import 'invalid_super_in_initializer_test.dart' as invalid_super_in_initializer;
 import 'invalid_type_argument_in_const_list_test.dart'
     as invalid_type_argument_in_const_list;
@@ -952,6 +954,7 @@
     invalid_required_optional_positional_param.main();
     invalid_required_positional_param.main();
     invalid_sealed_annotation.main();
+    invalid_super_formal_parameter_location.main();
     invalid_super_in_initializer.main();
     invalid_type_argument_in_const_list.main();
     invalid_type_argument_in_const_map.main();
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 847a435..509bb49 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -833,8 +833,9 @@
             typeAliasedFactoryInvocations.remove(initializer);
           }
         } else {
-          initializer = typeInferrer.inferFieldInitializer(
-              this, fieldBuilder.builtType, initializer);
+          initializer = typeInferrer
+              .inferFieldInitializer(this, fieldBuilder.builtType, initializer)
+              .expression;
 
           if (transformCollections || transformSetLiterals) {
             // Wrap the initializer in a temporary parent expression; the
@@ -1644,6 +1645,15 @@
     return annotation;
   }
 
+  Arguments parseArguments(Token token) {
+    Parser parser = new Parser(this,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+    token = parser.parseArgumentsRest(token);
+    Arguments arguments = pop() as Arguments;
+    checkEmpty(token.charOffset);
+    return arguments;
+  }
+
   void finishConstructor(SourceConstructorBuilder builder,
       AsyncMarker asyncModifier, Statement? body) {
     /// Quotes below are from [Dart Programming Language Specification, 4th
@@ -1757,10 +1767,25 @@
       Constructor? superTarget = lookupConstructor(emptyName, isSuper: true);
       Initializer initializer;
       Arguments arguments;
+      List<Expression>? positionalArguments;
+      List<NamedExpression>? namedArguments;
       if (libraryBuilder.enableSuperParametersInLibrary) {
+        positionalArguments = positionalSuperParametersAsArguments;
+        namedArguments = namedSuperParametersAsArguments;
+      }
+      if (classBuilder is EnumBuilder) {
+        assert(constructor.function.positionalParameters.length >= 2 &&
+            constructor.function.positionalParameters[0].name == "index" &&
+            constructor.function.positionalParameters[1].name == "name");
+        (positionalArguments ??= <Expression>[]).insertAll(0, [
+          new VariableGet(constructor.function.positionalParameters[0]),
+          new VariableGet(constructor.function.positionalParameters[1])
+        ]);
+      }
+      if (positionalArguments != null || namedArguments != null) {
         arguments = forest.createArguments(
-            noLocation, positionalSuperParametersAsArguments ?? <Expression>[],
-            named: namedSuperParametersAsArguments);
+            noLocation, positionalArguments ?? <Expression>[],
+            named: namedArguments);
       } else {
         arguments = forest.createArgumentsEmpty(noLocation);
       }
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 7f34cfd..75da84f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2004,7 +2004,7 @@
   @override
   void endArguments(int count, Token beginToken, Token endToken) {
     debugEvent("Arguments");
-    push(NullValue.Arguments);
+    push(beginToken);
   }
 
   @override
@@ -2307,14 +2307,42 @@
   @override
   void handleEnumElement(Token beginToken) {
     debugEvent("EnumElements");
-    pop(); // arguments.
-    pop(); // constructor reference.
-    // Keep on the stack the EnumConstantInfo created in handleIdentifier.
+    Token? argumentsBeginToken = pop() as Token?;
+
+    ConstructorReferenceBuilder? constructorReferenceBuilder =
+        pop() as ConstructorReferenceBuilder?;
+    Object? enumConstantInfo = pop();
+    if (enumConstantInfo is EnumConstantInfo) {
+      push(enumConstantInfo
+        ..constructorReferenceBuilder = constructorReferenceBuilder
+        ..argumentsBeginToken = argumentsBeginToken);
+    } else {
+      assert(enumConstantInfo is ParserRecovery);
+      push(enumConstantInfo);
+    }
   }
 
   @override
   void handleEnumHeader(Token enumKeyword, Token leftBrace) {
     debugEvent("EnumHeader");
+
+    // We pop more values than needed to reach typeVariables, offset and name.
+    List<TypeBuilder>? interfaces = pop() as List<TypeBuilder>?;
+    List<TypeBuilder>? mixins = pop() as List<TypeBuilder>?;
+    List<TypeVariableBuilder>? typeVariables =
+        pop() as List<TypeVariableBuilder>?;
+    int charOffset = popCharOffset(); // identifier char offset.
+    Object? name = pop();
+
+    libraryBuilder.currentTypeParameterScopeBuilder.markAsEnumDeclaration(
+        name is String ? name : "<syntax-error>", charOffset, typeVariables);
+
+    push(name ?? NullValue.Name);
+    push(charOffset);
+    push(typeVariables ?? NullValue.TypeVariables);
+    push(mixins ?? NullValue.TypeBuilderList);
+    push(interfaces ?? NullValue.TypeBuilderList);
+
     push(enumKeyword.charOffset); // start char offset.
     push(leftBrace.endGroup!.charOffset); // end char offset.
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index ed633a7..8fbed56 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -76,13 +76,16 @@
   final List<SynthesizedFunctionNode> _superParameterDefaultValueCloners =
       <SynthesizedFunctionNode>[];
 
+  @override
+  List<FormalParameterBuilder>? formals;
+
   SourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
       TypeBuilder? returnType,
       String name,
       List<TypeVariableBuilder>? typeVariables,
-      List<FormalParameterBuilder>? formals,
+      this.formals,
       SourceLibraryBuilder compilationUnit,
       int startCharOffset,
       int charOffset,
@@ -670,6 +673,14 @@
     _initializedFields = null;
     return result;
   }
+
+  void ensureGrowableFormals() {
+    if (formals != null) {
+      formals = new List<FormalParameterBuilder>.from(formals!, growable: true);
+    } else {
+      formals = <FormalParameterBuilder>[];
+    }
+  }
 }
 
 class SyntheticConstructorBuilder extends DillConstructorBuilder
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 112e190..9e13bbc 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -4,6 +4,8 @@
 
 library fasta.enum_builder;
 
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+
 import 'package:kernel/ast.dart'
     show
         Arguments,
@@ -11,6 +13,7 @@
         Class,
         Constructor,
         ConstructorInvocation,
+        DartType,
         Expression,
         Field,
         InstanceAccessKind,
@@ -26,12 +29,14 @@
         StringConcatenation,
         StringLiteral,
         SuperInitializer,
-        ThisExpression;
+        ThisExpression,
+        setParents;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
+import '../builder/constructor_reference_builder.dart';
 import '../builder/field_builder.dart';
 import '../builder/formal_parameter_builder.dart';
 import '../builder/library_builder.dart';
@@ -41,6 +46,7 @@
 import '../builder/nullability_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_builder.dart';
+import '../builder/type_variable_builder.dart';
 import '../fasta_codes.dart'
     show
         LocatedMessage,
@@ -49,10 +55,18 @@
         templateDuplicatedDeclarationCause,
         templateDuplicatedDeclarationSyntheticCause,
         templateEnumConstantSameNameAsEnclosing;
+
+import '../kernel/body_builder.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/kernel_helper.dart';
+import '../kernel/internal_ast.dart';
+
 import '../modifier.dart' show constMask, hasInitializerMask, staticMask;
+
+import '../constant_context.dart';
 import '../scope.dart';
+import '../type_inference/type_inferrer.dart';
+import '../type_inference/type_schema.dart';
 import '../util/helpers.dart';
 import 'name_scheme.dart';
 import 'source_class_builder.dart' show SourceClassBuilder;
@@ -72,9 +86,12 @@
 
   final NamedTypeBuilder listType;
 
+  SourceConstructorBuilder? _synthesizedDefaultConstructorBuilder;
+
   EnumBuilder.internal(
       List<MetadataBuilder>? metadata,
       String name,
+      List<TypeVariableBuilder>? typeVariables,
       Scope scope,
       ConstructorScope constructors,
       Class cls,
@@ -93,7 +110,7 @@
             metadata,
             0,
             name,
-            /* typeVariable = */ null,
+            typeVariables,
             enumType,
             /* interfaces = */ null,
             /* onTypes = */ null,
@@ -110,6 +127,7 @@
   factory EnumBuilder(
       List<MetadataBuilder>? metadata,
       String name,
+      List<TypeVariableBuilder>? typeVariables,
       List<EnumConstantInfo?>? enumConstantInfos,
       SourceLibraryBuilder parent,
       int startCharOffset,
@@ -164,6 +182,8 @@
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
     Class cls = new Class(
         name: name,
+        typeParameters:
+            TypeVariableBuilder.typeParametersFromBuilders(typeVariables),
         reference: referencesFromIndexed?.cls.reference,
         fileUri: fileUri);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
@@ -235,27 +255,6 @@
           referencesFromIndexed.lookupSetterReference(valuesName);
     }
 
-    SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
-        /* metadata = */ null,
-        constMask,
-        /* returnType = */ null,
-        "",
-        /* typeParameters = */ null,
-        <FormalParameterBuilder>[
-          new FormalParameterBuilder(
-              null, 0, intType, "index", parent, charOffset),
-          new FormalParameterBuilder(
-              null, 0, stringType, "name", parent, charOffset)
-        ],
-        parent,
-        charOffset,
-        charOffset,
-        charOffset,
-        charEndOffset,
-        constructorReference,
-        tearOffReference,
-        forAbstractClassOrEnum: true);
-    constructors[""] = constructorBuilder;
     FieldBuilder valuesBuilder = new SourceFieldBuilder(
         /* metadata = */ null,
         listType,
@@ -270,6 +269,48 @@
         fieldGetterReference: valuesGetterReference,
         fieldSetterReference: valuesSetterReference);
     members["values"] = valuesBuilder;
+
+    SourceConstructorBuilder? synthesizedDefaultConstructorBuilder;
+    if (constructorScope.local.isEmpty) {
+      synthesizedDefaultConstructorBuilder = new SourceConstructorBuilder(
+          /* metadata = */ null,
+          constMask,
+          /* returnType = */ null,
+          "",
+          /* typeParameters = */ null,
+          <FormalParameterBuilder>[
+            new FormalParameterBuilder(
+                null, 0, intType, "index", parent, charOffset),
+            new FormalParameterBuilder(
+                null, 0, stringType, "name", parent, charOffset)
+          ],
+          parent,
+          charOffset,
+          charOffset,
+          charOffset,
+          charEndOffset,
+          constructorReference,
+          tearOffReference,
+          forAbstractClassOrEnum: true);
+      synthesizedDefaultConstructorBuilder
+          .registerInitializedField(valuesBuilder);
+      constructors[""] = synthesizedDefaultConstructorBuilder;
+    } else {
+      constructorScope.forEach((name, member) {
+        if (member is SourceConstructorBuilder) {
+          member.ensureGrowableFormals();
+          member.formals!.insert(
+              0,
+              new FormalParameterBuilder(
+                  null, 0, stringType, "name", parent, charOffset));
+          member.formals!.insert(
+              0,
+              new FormalParameterBuilder(
+                  null, 0, intType, "index", parent, charOffset));
+        }
+      });
+    }
+
     ProcedureBuilder toStringBuilder = new SourceProcedureBuilder(
         /* metadata = */ null,
         0,
@@ -290,7 +331,6 @@
         isExtensionMember: false,
         isInstanceMember: true);
     members["toString"] = toStringBuilder;
-    constructorBuilder.registerInitializedField(valuesBuilder);
     String className = name;
     if (enumConstantInfos != null) {
       for (int i = 0; i < enumConstantInfos.length; i++) {
@@ -364,6 +404,7 @@
     EnumBuilder enumBuilder = new EnumBuilder.internal(
         metadata,
         name,
+        typeVariables,
         new Scope(
             local: members,
             setters: setters,
@@ -382,7 +423,9 @@
         startCharOffsetComputed,
         charOffset,
         charEndOffset,
-        referencesFromIndexed);
+        referencesFromIndexed)
+      .._synthesizedDefaultConstructorBuilder =
+          synthesizedDefaultConstructorBuilder;
 
     void setParent(String name, MemberBuilder? builder) {
       while (builder != null) {
@@ -435,27 +478,39 @@
     SourceFieldBuilder valuesBuilder =
         firstMemberNamed("values") as SourceFieldBuilder;
     valuesBuilder.build(libraryBuilder);
-    SourceConstructorBuilder constructorBuilder =
-        constructorScopeBuilder[""] as SourceConstructorBuilder;
-    Constructor constructor = constructorBuilder.build(libraryBuilder);
-    ClassBuilder objectClass = objectType.declaration as ClassBuilder;
-    ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
-    MemberBuilder? superConstructor = enumClass.findConstructorOrFactory(
-        "", charOffset, fileUri, libraryBuilder);
-    if (superConstructor == null || !superConstructor.isConstructor) {
-      // TODO(ahe): Ideally, we would also want to check that [Object]'s
-      // unnamed constructor requires no arguments. But that information isn't
-      // always available at this point, and it's not really a situation that
-      // can happen unless you start modifying the SDK sources.
-      // (We should add a correct message. We no longer depend on Object here.)
-      library.addProblem(messageNoUnnamedConstructorInObject,
-          objectClass.charOffset, objectClass.name.length, objectClass.fileUri);
-    } else {
-      constructor.initializers.add(new SuperInitializer(
-          superConstructor.member as Constructor,
-          new Arguments.forwarded(constructor.function, libraryBuilder.library))
-        ..parent = constructor);
+
+    // The super initializer for the synthesized default constructor is
+    // inserted here. Other constructors are handled in
+    // [BodyBuilder.finishConstructor], as they are processed via the pipeline
+    // for constructor parsing and building.
+    if (_synthesizedDefaultConstructorBuilder != null) {
+      Constructor constructor =
+          _synthesizedDefaultConstructorBuilder!.build(libraryBuilder);
+      ClassBuilder objectClass = objectType.declaration as ClassBuilder;
+      ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
+      MemberBuilder? superConstructor = enumClass.findConstructorOrFactory(
+          "", charOffset, fileUri, libraryBuilder);
+      if (superConstructor == null || !superConstructor.isConstructor) {
+        // TODO(ahe): Ideally, we would also want to check that [Object]'s
+        // unnamed constructor requires no arguments. But that information
+        // isn't always available at this point, and it's not really a
+        // situation that can happen unless you start modifying the SDK
+        // sources. (We should add a correct message. We no longer depend on
+        // Object here.)
+        library.addProblem(
+            messageNoUnnamedConstructorInObject,
+            objectClass.charOffset,
+            objectClass.name.length,
+            objectClass.fileUri);
+      } else {
+        constructor.initializers.add(new SuperInitializer(
+            superConstructor.member as Constructor,
+            new Arguments.forwarded(
+                constructor.function, libraryBuilder.library))
+          ..parent = constructor);
+      }
     }
+
     return super.build(libraryBuilder, coreLibrary);
   }
 
@@ -484,9 +539,7 @@
         classHierarchy.coreTypes,
         new ListLiteral(values,
             typeArgument: rawType(library.nonNullable), isConst: true));
-    SourceConstructorBuilder constructorBuilder =
-        constructorScopeBuilder[""] as SourceConstructorBuilder;
-    Constructor constructor = constructorBuilder.constructor;
+
     int index = 0;
     if (enumConstantInfos != null) {
       for (EnumConstantInfo? enumConstantInfo in enumConstantInfos!) {
@@ -499,12 +552,64 @@
           } else {
             continue;
           }
-          Arguments arguments = new Arguments(<Expression>[
-            new IntLiteral(index++),
-            new StringLiteral(constant),
-          ]);
-          field.buildBody(classHierarchy.coreTypes,
-              new ConstructorInvocation(constructor, arguments, isConst: true));
+
+          String constructorName =
+              enumConstantInfo.constructorReferenceBuilder?.suffix ?? "";
+          SourceConstructorBuilder? constructorBuilder =
+              constructorScopeBuilder[constructorName]
+                  as SourceConstructorBuilder?;
+
+          if (constructorBuilder == null) {
+            // TODO(cstefantsova): Report an error.
+          } else {
+            Arguments arguments;
+            List<Expression> enumSyntheticArguments = <Expression>[
+              new IntLiteral(index++),
+              new StringLiteral(constant),
+            ];
+            List<DartType>? typeArguments;
+            List<TypeBuilder>? typeArgumentBuilders =
+                enumConstantInfo.constructorReferenceBuilder?.typeArguments;
+            if (typeArgumentBuilders != null) {
+              typeArguments = <DartType>[];
+              for (TypeBuilder typeBuilder in typeArgumentBuilders) {
+                typeArguments.add(typeBuilder.build(library));
+              }
+            }
+            BodyBuilder? bodyBuilder;
+            if (enumConstantInfo.argumentsBeginToken != null) {
+              bodyBuilder = library.loader
+                  .createBodyBuilderForOutlineExpression(
+                      library, this, this, scope, fileUri);
+              bodyBuilder.constantContext = ConstantContext.required;
+              arguments = bodyBuilder
+                  .parseArguments(enumConstantInfo.argumentsBeginToken!);
+              bodyBuilder.performBacklogComputations(delayedActionPerformers);
+
+              arguments.positional.insertAll(0, enumSyntheticArguments);
+            } else {
+              arguments = new ArgumentsImpl(enumSyntheticArguments);
+            }
+            if (typeArguments != null && arguments is ArgumentsImpl) {
+              ArgumentsImpl.setNonInferrableArgumentTypes(
+                  arguments, typeArguments);
+            }
+            setParents(enumSyntheticArguments, arguments);
+            Expression initializer = new ConstructorInvocation(
+                constructorBuilder.constructor, arguments,
+                isConst: true)
+              ..fileOffset = field.charOffset;
+            if (bodyBuilder != null) {
+              ExpressionInferenceResult inferenceResult =
+                  bodyBuilder.typeInferrer.inferFieldInitializer(
+                      bodyBuilder, const UnknownType(), initializer);
+              initializer = inferenceResult.expression;
+              if (field is SourceFieldBuilder) {
+                field.fieldType = inferenceResult.inferredType;
+              }
+            }
+            field.buildBody(classHierarchy.coreTypes, initializer);
+          }
         }
       }
     }
@@ -543,5 +648,8 @@
   final List<MetadataBuilder>? metadata;
   final String name;
   final int charOffset;
-  const EnumConstantInfo(this.metadata, this.name, this.charOffset);
+  ConstructorReferenceBuilder? constructorReferenceBuilder;
+  Token? argumentsBeginToken;
+
+  EnumConstantInfo(this.metadata, this.name, this.charOffset);
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
index 634ffab..d864cd8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
@@ -405,10 +405,10 @@
               library, declarationBuilder, this, scope, fileUri);
       bodyBuilder.constantContext =
           isConst ? ConstantContext.inferred : ConstantContext.required;
-      Expression initializer = bodyBuilder.typeInferrer.inferFieldInitializer(
-          bodyBuilder,
-          fieldType,
-          bodyBuilder.parseFieldInitializer(_constInitializerToken!));
+      Expression initializer = bodyBuilder.typeInferrer
+          .inferFieldInitializer(bodyBuilder, fieldType,
+              bodyBuilder.parseFieldInitializer(_constInitializerToken!))
+          .expression;
       if (bodyBuilder.transformSetLiterals ||
           bodyBuilder.transformCollections) {
         // Wrap the initializer in a temporary parent expression; the
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 4b3cd4c..b60f0ec 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2809,10 +2809,9 @@
           referencesFromIndexed!.lookupIndexedClass(name);
     }
     // Nested declaration began in `OutlineBuilder.beginEnum`.
-    // TODO(cstefantsova): Use actual type variables here.
     TypeParameterScopeBuilder declaration =
         endNestedDeclaration(TypeParameterScopeKind.enumDeclaration, name)
-          ..resolveNamedTypes([], this);
+          ..resolveNamedTypes(typeVariables, this);
     Map<String, Builder> members = declaration.members!;
     Map<String, MemberBuilder> constructors = declaration.constructors!;
     Map<String, MemberBuilder> setters = declaration.setters!;
@@ -2820,6 +2819,7 @@
     EnumBuilder enumBuilder = new EnumBuilder(
         metadata,
         name,
+        typeVariables,
         enumConstantInfos,
         this,
         startCharOffset,
@@ -5027,6 +5027,17 @@
     _typeVariables = typeVariables;
   }
 
+  /// Registers that this builder is preparing for an enum declaration with
+  /// the given [name] and [typeVariables] located [charOffset].
+  void markAsEnumDeclaration(
+      String name, int charOffset, List<TypeVariableBuilder>? typeVariables) {
+    assert(_kind == TypeParameterScopeKind.enumDeclaration,
+        "Unexpected declaration kind: $_kind");
+    _name = name;
+    _charOffset = charOffset;
+    _typeVariables = typeVariables;
+  }
+
   /// Registers the 'extension this type' of the extension declaration prepared
   /// for by this builder.
   ///
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 78618cb..f30fc34 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -116,7 +116,7 @@
   AssignedVariables<TreeNode, VariableDeclaration> get assignedVariables;
 
   /// Performs full type inference on the given field initializer.
-  Expression inferFieldInitializer(
+  ExpressionInferenceResult inferFieldInitializer(
       InferenceHelper helper, DartType declaredType, Expression initializer);
 
   /// Returns the type used as the inferred type of a variable declaration,
@@ -2030,7 +2030,7 @@
   }
 
   @override
-  Expression inferFieldInitializer(
+  ExpressionInferenceResult inferFieldInitializer(
     InferenceHelper helper,
     DartType context,
     Expression initializer,
@@ -2043,7 +2043,8 @@
     initializer = ensureAssignableResult(context, initializerResult,
         isVoidAllowed: context is VoidType);
     this.helper = null;
-    return initializer;
+    return new ExpressionInferenceResult(
+        initializerResult.inferredType, initializer);
   }
 
   @override
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
index 6ad6b41..899e7e9f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = #C10;
-  static const field self::E one = #C3;
-  static const field self::E two = #C6;
-  static const field self::E three = #C9;
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+  static const field self::E<core::int, core::String> one = #C3;
+  static const field self::E<core::double, core::num> two = #C6;
+  static const field self::E<core::int, core::int> three = #C9;
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
 constants  {
   #C1 = 0
   #C2 = "one"
-  #C3 = self::E {index:#C1, _name:#C2}
+  #C3 = self::E<core::int, core::String> {index:#C1, _name:#C2}
   #C4 = 1
   #C5 = "two"
-  #C6 = self::E {index:#C4, _name:#C5}
+  #C6 = self::E<core::double, core::num> {index:#C4, _name:#C5}
   #C7 = 2
   #C8 = "three"
-  #C9 = self::E {index:#C7, _name:#C8}
-  #C10 = <self::E>[#C3, #C6, #C9]
+  #C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
+  #C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
index 6ad6b41..899e7e9f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = #C10;
-  static const field self::E one = #C3;
-  static const field self::E two = #C6;
-  static const field self::E three = #C9;
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+  static const field self::E<core::int, core::String> one = #C3;
+  static const field self::E<core::double, core::num> two = #C6;
+  static const field self::E<core::int, core::int> three = #C9;
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
 constants  {
   #C1 = 0
   #C2 = "one"
-  #C3 = self::E {index:#C1, _name:#C2}
+  #C3 = self::E<core::int, core::String> {index:#C1, _name:#C2}
   #C4 = 1
   #C5 = "two"
-  #C6 = self::E {index:#C4, _name:#C5}
+  #C6 = self::E<core::double, core::num> {index:#C4, _name:#C5}
   #C7 = 2
   #C8 = "three"
-  #C9 = self::E {index:#C7, _name:#C8}
-  #C10 = <self::E>[#C3, #C6, #C9]
+  #C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
+  #C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
index 5081c27..fbd0a6f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = #C10;
-  static const field self::E one = #C3;
-  static const field self::E two = #C6;
-  static const field self::E three = #C9;
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+  static const field self::E<core::int, core::String> one = #C3;
+  static const field self::E<core::double, core::num> two = #C6;
+  static const field self::E<core::int, core::int> three = #C9;
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
 constants  {
   #C1 = 0
   #C2 = "one"
-  #C3 = self::E {index:#C1, _name:#C2}
+  #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
   #C4 = 1
   #C5 = "two"
-  #C6 = self::E {index:#C4, _name:#C5}
+  #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
   #C7 = 2
   #C8 = "three"
-  #C9 = self::E {index:#C7, _name:#C8}
-  #C10 = <self::E*>[#C3, #C6, #C9]
+  #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+  #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
index 5081c27..fbd0a6f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = #C10;
-  static const field self::E one = #C3;
-  static const field self::E two = #C6;
-  static const field self::E three = #C9;
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+  static const field self::E<core::int, core::String> one = #C3;
+  static const field self::E<core::double, core::num> two = #C6;
+  static const field self::E<core::int, core::int> three = #C9;
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
 constants  {
   #C1 = 0
   #C2 = "one"
-  #C3 = self::E {index:#C1, _name:#C2}
+  #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
   #C4 = 1
   #C5 = "two"
-  #C6 = self::E {index:#C4, _name:#C5}
+  #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
   #C7 = 2
   #C8 = "three"
-  #C9 = self::E {index:#C7, _name:#C8}
-  #C10 = <self::E*>[#C3, #C6, #C9]
+  #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+  #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
index 584e232..718544d 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three];
-  static const field self::E one = const self::E::•(0, "one");
-  static const field self::E two = const self::E::•(1, "two");
-  static const field self::E three = const self::E::•(2, "three");
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = const <self::E<dynamic, dynamic>>[self::E::one, self::E::two, self::E::three];
+  static const field self::E<core::int, core::String> one = const self::E::•<core::int, core::String>(0, "one");
+  static const field self::E<core::double, core::num> two = const self::E::•<core::double, core::num>(1, "two");
+  static const field self::E<core::int, core::int> three = const self::E::named<core::int, core::int>(2, "three", 42);
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,8 +21,8 @@
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"})
-Extra constant evaluation: evaluated: 9, effectively constant: 4
+Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E<dynamic, dynamic>*>[const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"}, const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"}, const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 11, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
index 5081c27..fbd0a6f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -1,26 +1,17 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.named(int value);
-//         ^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
-class E extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::E> values = #C10;
-  static const field self::E one = #C3;
-  static const field self::E two = #C6;
-  static const field self::E three = #C9;
-  const constructor •(core::int index, core::String name) → self::E
+class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic, dynamic>> values = #C10;
+  static const field self::E<core::int, core::String> one = #C3;
+  static const field self::E<core::double, core::num> two = #C6;
+  static const field self::E<core::int, core::int> three = #C9;
+  const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
-  const constructor named(core::int value) → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:11:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.named(int value);
-        ^^^^^"
+  const constructor named(core::int index, core::String name, core::int value) → self::E<self::E::X%, self::E::Y%>
+    : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
     return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,19 +21,20 @@
 constants  {
   #C1 = 0
   #C2 = "one"
-  #C3 = self::E {index:#C1, _name:#C2}
+  #C3 = self::E<core::int*, core::String*> {index:#C1, _name:#C2}
   #C4 = 1
   #C5 = "two"
-  #C6 = self::E {index:#C4, _name:#C5}
+  #C6 = self::E<core::double*, core::num*> {index:#C4, _name:#C5}
   #C7 = 2
   #C8 = "three"
-  #C9 = self::E {index:#C7, _name:#C8}
-  #C10 = <self::E*>[#C3, #C6, #C9]
+  #C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
+  #C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///entries_with_type_arguments.dart:
-- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
new file mode 100644
index 0000000..6afc407
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, 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.
+
+X foo<X>(X x) => x;
+
+enum E1 {
+  bar(foo);
+
+  const E1(int Function(int) f);
+}
+
+enum E2<X> {
+  bar(foo);
+
+  const E2(X f);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
new file mode 100644
index 0000000..cdcb164
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 bar = #C3;
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = #C6;
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  return x;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
+  #C6 = <self::E2<dynamic>>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..cdcb164
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 bar = #C3;
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = #C6;
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  return x;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
+  #C6 = <self::E2<dynamic>>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..9f80f5b
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+X foo<X>(X x) => x;
+enum E1 { bar(foo); const E1(int Function(int) f); }
+enum E2<X> { bar(foo); const E2(X f); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 bar = #C3;
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = #C6;
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  return x;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+  #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 bar = #C3;
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = #C6;
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  return x;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+  #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..2a59034
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = const <self::E1>[self::E1::bar];
+  static const field self::E1 bar = const self::E1::•(0, "bar", self::foo<core::int>);
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = const <self::E2<dynamic>>[self::E2::bar];
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = const self::E2::•<<X extends core::Object? = dynamic>(X%) → X%>(0, "bar", self::foo);
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:7:6 -> ListConstant(const <E1*>[const E1{_Enum.index: 0, _Enum._name: "bar"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:8:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "bar"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:13:6 -> ListConstant(const <E2<dynamic>*>[const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:14:3 -> InstanceConstant(const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"})
+Extra constant evaluation: evaluated: 14, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..a6f1734
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 bar = #C3;
+  const constructor •(core::int index, core::String name, (core::int) → core::int f) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic>> values = #C6;
+  static const field self::E2<<X extends core::Object? = dynamic>(X%) → X%> bar = #C5;
+  const constructor •(core::int index, core::String name, self::E2::X% f) → self::E2<self::E2::X%>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
+  return x;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
+  #C6 = <self::E2<dynamic>*>[#C5]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inference_in_constructor_parameters.dart:
+- E1. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:10:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
index 43b585e..ffb1eca 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = #C4;
   static const field self::E a = #C3;
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
@@ -35,6 +23,6 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
index 43b585e..ffb1eca 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = #C4;
   static const field self::E a = #C3;
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
@@ -35,6 +23,6 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = #C4;
   static const field self::E a = #C3;
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
@@ -35,6 +23,6 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = #C4;
   static const field self::E a = #C3;
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
@@ -35,6 +23,6 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
index b0ba4b4..cf85d8d 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = const <self::E>[self::E::a];
-  static const field self::E a = const self::E::•(0, "a");
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  static const field self::E a = const self::E::b(0, "a");
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
index d44bcfc..08918e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
@@ -1,23 +1,11 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-//   const E.b();
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
 class E extends core::_Enum /*isEnum*/  {
   static const field core::List<self::E> values = #C4;
   static const field self::E a = #C3;
-  const constructor b() → self::E
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart:8:9: Error: The superclass, '_Enum', has no unnamed constructor that takes no arguments.
-  const E.b();
-        ^"
-    ;
-  const constructor •(core::int index, core::String name) → self::E
+  const constructor b(core::int index, core::String name) → self::E
     : super core::_Enum::•(index, name)
     ;
   method toString() → core::String
@@ -35,6 +23,6 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
-- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- E.b (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:8:9)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index db22169c..bc8ab91 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -29,6 +29,7 @@
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
 enhanced_enums/entries_with_type_arguments: FormatterCrash
+enhanced_enums/inference_in_constructor_parameters: FormatterCrash
 enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 393bdb2..0516db1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 143
+PRERELEASE 144
 PRERELEASE_PATCH 0
\ No newline at end of file