Version 2.16.0-149.0.dev

Merge commit '41384d7544fe870f4a4dc56160d833796db3030b' into 'dev'
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 7a00b4e..6ecde36 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1760,6 +1760,37 @@
       constructor.initializers.add(buildInvalidInitializer(buildProblem(
           fasta.messageConstructorNotSync, body!.fileOffset, noLength)));
     }
+    if (libraryBuilder.enableEnhancedEnumsInLibrary &&
+        classBuilder is SourceEnumBuilder &&
+        constructor.initializers.isNotEmpty &&
+        constructor.initializers.last is RedirectingInitializer) {
+      RedirectingInitializer redirectingInitializer =
+          constructor.initializers.last as RedirectingInitializer;
+      redirectingInitializer.arguments.positional.insertAll(0, [
+        new VariableGet(constructor.function.positionalParameters[0])
+          ..parent = redirectingInitializer.arguments,
+        new VariableGet(constructor.function.positionalParameters[1])
+          ..parent = redirectingInitializer.arguments
+      ]);
+
+      LocatedMessage? message = checkArgumentsForFunction(
+          redirectingInitializer.target.function,
+          redirectingInitializer.arguments,
+          builder.charOffset, const <TypeParameter>[]);
+      if (message != null) {
+        Initializer invalidInitializer = buildInvalidInitializer(
+            buildUnresolvedError(
+                forest.createNullLiteral(redirectingInitializer.fileOffset),
+                constructorNameForDiagnostics(builder.name, isSuper: false),
+                redirectingInitializer.arguments,
+                redirectingInitializer.fileOffset,
+                isSuper: false,
+                message: message,
+                kind: UnresolvedKind.Constructor));
+        constructor.initializers.removeLast();
+        constructor.initializers.add(invalidInitializer..parent = constructor);
+      }
+    }
     if (needsImplicitSuperInitializer) {
       /// >If no superinitializer is provided, an implicit superinitializer
       /// >of the form super() is added at the end of k’s initializer list,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ce46969..f792c94 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -4576,7 +4576,14 @@
       // The check of the arguments is done later for super initializers if the
       // 'super-parameters' language feature is enabled. In that case the
       // additional parameters can be added at a later stage.
-      if (!(isSuper && _helper.libraryBuilder.enableSuperParametersInLibrary)) {
+      bool isPotentialSuperParametersReceiver =
+          isSuper && _helper.libraryBuilder.enableSuperParametersInLibrary;
+      // Additional arguments are added to the redirecting initializer of an
+      // enum constructor, so the check is performed later.
+      bool isEnumConstructorRedirectingInitializer =
+          constructor.enclosingClass.isEnum;
+      if (!isPotentialSuperParametersReceiver &&
+          !isEnumConstructorRedirectingInitializer) {
         message = _helper.checkArgumentsForFunction(
             constructor.function, arguments, offset, <TypeParameter>[]);
       }
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 75da84f..2bd2dab 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -3114,14 +3114,6 @@
       int count,
       Token beginToken,
       Token endToken) {
-    // TODO(cstefantsova): Call endClassFields instead.
-    debugEvent("EnumFields");
-    popFieldInfos(count); // field infos
-    pop(); // type
-    pop(); // metadata
-    popDeclarationContext();
-    // Skip the declaration. An error as already been produced by the parser.
-
     if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
       addProblem(
           templateExperimentNotEnabled.withArguments('enhanced-enums',
@@ -3129,6 +3121,8 @@
           beginToken.charOffset,
           -1);
     }
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
   @override
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart
new file mode 100644
index 0000000..e047de1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart
@@ -0,0 +1,25 @@
+// 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.
+
+enum E1 {
+  one(1),
+  two.named(2);
+
+  final int foo;
+
+  const E1(this.foo);
+  const E1.named(int value) : this(value); // Ok.
+}
+
+enum E2 {
+  one(1),
+  two.named(2);
+
+  final int foo;
+
+  const E2(this.foo);
+  const E2.named(int value) : this(value, value); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.expect
new file mode 100644
index 0000000..99bf4f6
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   const E2.named(int value) : this(value, value); // Error.
+//         ^^^^^
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
+//   final int foo;
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  static const field self::E2 one = #C9;
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1>[#C4, #C7]
+  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_initializers.dart:
+- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11: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)
+- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
+- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
+- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.transformed.expect
new file mode 100644
index 0000000..99bf4f6
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.transformed.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   const E2.named(int value) : this(value, value); // Error.
+//         ^^^^^
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
+//   final int foo;
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  static const field self::E2 one = #C9;
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1>[#C4, #C7]
+  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_initializers.dart:
+- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11: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)
+- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
+- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
+- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.textual_outline.expect
new file mode 100644
index 0000000..8246ad5
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E1 { one(1), two.named(2); final int foo; const E1(this.foo); const E1.named(int value) : this(value); }
+enum E2 { one(1), two.named(2); final int foo; const E2(this.foo); const E2.named(int value) : this(value, value); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.expect
new file mode 100644
index 0000000..352aa87
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   const E2.named(int value) : this(value, value); // Error.
+//         ^^^^^
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
+//   final int foo;
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  static const field self::E2 one = #C9;
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_initializers.dart:
+- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11: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)
+- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
+- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
+- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.modular.expect
new file mode 100644
index 0000000..352aa87
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.modular.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   const E2.named(int value) : this(value, value); // Error.
+//         ^^^^^
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
+//   final int foo;
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  static const field self::E2 one = #C9;
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_initializers.dart:
+- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11: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)
+- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
+- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
+- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.outline.expect
new file mode 100644
index 0000000..6ded04c
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.outline.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+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::one, self::E1::two];
+  static const field self::E1 one = const self::E1::•(0, "one", 1);
+  static const field self::E1 two = const self::E1::named(1, "two", 2);
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = const <self::E2>[self::E2::one, self::E2::two];
+  static const field self::E2 one = const self::E2::•(0, "one", 1);
+  static const field self::E2 two = const self::E2::named(1, "two", 2);
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///redirecting_initializers.dart:5:6 -> ListConstant(const <E1*>[const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"}, const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:6:3 -> InstanceConstant(const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:7:3 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
+Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_initializers.dart:15:6 -> InstanceConstant(const E2{E2.foo: 1, _Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:16:3 -> InstanceConstant(const E2{E2.foo: 1, _Enum.index: 0, _Enum._name: "one"})
+Extra constant evaluation: evaluated: 23, effectively constant: 5
diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.transformed.expect
new file mode 100644
index 0000000..352aa87
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.weak.transformed.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   const E2.named(int value) : this(value, value); // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   const E2.named(int value) : this(value, value); // Error.
+//         ^^^^^
+// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
+//   final int foo;
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : this self::E1::•(index, name, value)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  static const field self::E2 one = #C9;
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^";
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E2
+    : self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E2
+    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  const E2.named(int value) : this(value, value); // Error.
+                                  ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_initializers.dart:
+- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11: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)
+- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
+- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
+- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart
new file mode 100644
index 0000000..c82bd4d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart
@@ -0,0 +1,28 @@
+// 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.
+
+enum E1 {
+  one(1),
+  two.named(2);
+
+  final int foo;
+
+  const E1(this.foo);
+
+  const E1.named(int value) : foo = value;
+}
+
+enum E2<X, Y> {
+  one<int, String>(1, "one"),
+  two.named("two", 2),
+  three.named("three", "three");
+
+  final X foo;
+  final Y bar;
+
+  const E2(this.foo, this.bar);
+  const E2.named(Y this.bar, X this.foo);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.expect
new file mode 100644
index 0000000..b546ffd
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.expect
@@ -0,0 +1,61 @@
+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 = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
+  static const field self::E2<core::int, core::String> one = #C9;
+  static const field self::E2<core::int, core::String> two = #C10;
+  static const field self::E2<core::String, core::String> three = #C12;
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1>[#C4, #C7]
+  #C9 = self::E2<core::int, core::String> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
+  #C10 = self::E2<core::int, core::String> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
+  #C11 = "three"
+  #C12 = self::E2<core::String, core::String> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
+  #C13 = <self::E2<dynamic, dynamic>>[#C9, #C10, #C12]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_fields.dart:
+- E1. (from org-dartlang-testcase:///simple_fields.dart:11: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)
+- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
+- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
+- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.transformed.expect
new file mode 100644
index 0000000..b546ffd
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.transformed.expect
@@ -0,0 +1,61 @@
+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 = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
+  static const field self::E2<core::int, core::String> one = #C9;
+  static const field self::E2<core::int, core::String> two = #C10;
+  static const field self::E2<core::String, core::String> three = #C12;
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1>[#C4, #C7]
+  #C9 = self::E2<core::int, core::String> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
+  #C10 = self::E2<core::int, core::String> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
+  #C11 = "three"
+  #C12 = self::E2<core::String, core::String> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
+  #C13 = <self::E2<dynamic, dynamic>>[#C9, #C10, #C12]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_fields.dart:
+- E1. (from org-dartlang-testcase:///simple_fields.dart:11: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)
+- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
+- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
+- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.textual_outline.expect
new file mode 100644
index 0000000..d11d9cd
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E1 { one(1), two.named(2); final int foo; const E1(this.foo); const E1.named(int value) : foo = value; }
+enum E2<X, Y> { one<int, String>(1, "one"), two.named("two", 2), three.named("three", "three"); final X foo; final Y bar; const E2(this.foo, this.bar); const E2.named(Y this.bar, X this.foo); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.expect
new file mode 100644
index 0000000..c1e1607
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.expect
@@ -0,0 +1,61 @@
+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 = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
+  static const field self::E2<core::int, core::String> one = #C9;
+  static const field self::E2<core::int, core::String> two = #C10;
+  static const field self::E2<core::String, core::String> three = #C12;
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2<core::int*, core::String*> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
+  #C10 = self::E2<core::int*, core::String*> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
+  #C11 = "three"
+  #C12 = self::E2<core::String*, core::String*> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
+  #C13 = <self::E2<dynamic, dynamic>*>[#C9, #C10, #C12]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_fields.dart:
+- E1. (from org-dartlang-testcase:///simple_fields.dart:11: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)
+- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
+- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
+- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..c1e1607
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+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 = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
+  static const field self::E2<core::int, core::String> one = #C9;
+  static const field self::E2<core::int, core::String> two = #C10;
+  static const field self::E2<core::String, core::String> three = #C12;
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2<core::int*, core::String*> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
+  #C10 = self::E2<core::int*, core::String*> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
+  #C11 = "three"
+  #C12 = self::E2<core::String*, core::String*> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
+  #C13 = <self::E2<dynamic, dynamic>*>[#C9, #C10, #C12]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_fields.dart:
+- E1. (from org-dartlang-testcase:///simple_fields.dart:11: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)
+- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
+- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
+- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.outline.expect
new file mode 100644
index 0000000..e4af5a2
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.outline.expect
@@ -0,0 +1,47 @@
+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::one, self::E1::two];
+  static const field self::E1 one = const self::E1::•(0, "one", 1);
+  static const field self::E1 two = const self::E1::named(1, "two", 2);
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = const <self::E2<dynamic, dynamic>>[self::E2::one, self::E2::two, self::E2::three];
+  static const field self::E2<core::int, core::String> one = const self::E2::•<core::int, core::String>(0, "one", 1, "one");
+  static const field self::E2<core::int, core::String> two = const self::E2::named<core::int, core::String>(1, "two", "two", 2);
+  static const field self::E2<core::String, core::String> three = const self::E2::named<core::String, core::String>(2, "three", "three", "three");
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:5:6 -> ListConstant(const <E1*>[const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"}, const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:6:3 -> InstanceConstant(const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:7:3 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:16:6 -> ListConstant(const <E2<dynamic, dynamic>*>[const E2<int*, String*>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"}, const E2<int*, String*>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"}, const E2<String*, String*>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:17:3 -> InstanceConstant(const E2<int*, String*>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:18:3 -> InstanceConstant(const E2<int*, String*>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:19:3 -> InstanceConstant(const E2<String*, String*>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 27, effectively constant: 7
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.transformed.expect
new file mode 100644
index 0000000..c1e1607
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.weak.transformed.expect
@@ -0,0 +1,61 @@
+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 = #C8;
+  static const field self::E1 one = #C4;
+  static const field self::E1 two = #C7;
+  final field core::int foo;
+  const constructor •(core::int index, core::String name, core::int foo) → self::E1
+    : self::E1::foo = foo, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, core::int value) → self::E1
+    : self::E1::foo = value, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<dynamic, dynamic>> values = #C13;
+  static const field self::E2<core::int, core::String> one = #C9;
+  static const field self::E2<core::int, core::String> two = #C10;
+  static const field self::E2<core::String, core::String> three = #C12;
+  final field self::E2::X% foo;
+  final field self::E2::Y% bar;
+  const constructor •(core::int index, core::String name, self::E2::X% foo, self::E2::Y% bar) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::foo = foo, self::E2::bar = bar, super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name, self::E2::Y% bar, self::E2::X% foo) → self::E2<self::E2::X%, self::E2::Y%>
+    : self::E2::bar = bar, self::E2::foo = foo, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
+  #C5 = 2
+  #C6 = "two"
+  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E1*>[#C4, #C7]
+  #C9 = self::E2<core::int*, core::String*> {foo:#C1, bar:#C3, index:#C2, _name:#C3}
+  #C10 = self::E2<core::int*, core::String*> {foo:#C5, bar:#C6, index:#C1, _name:#C6}
+  #C11 = "three"
+  #C12 = self::E2<core::String*, core::String*> {foo:#C11, bar:#C11, index:#C5, _name:#C11}
+  #C13 = <self::E2<dynamic, dynamic>*>[#C9, #C10, #C12]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_fields.dart:
+- E1. (from org-dartlang-testcase:///simple_fields.dart:11: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)
+- E1.named (from org-dartlang-testcase:///simple_fields.dart:13:9)
+- E2. (from org-dartlang-testcase:///simple_fields.dart:24:9)
+- E2.named (from org-dartlang-testcase:///simple_fields.dart:25:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index bc8ab91..386be8a 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -31,6 +31,8 @@
 enhanced_enums/entries_with_type_arguments: FormatterCrash
 enhanced_enums/inference_in_constructor_parameters: FormatterCrash
 enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
+enhanced_enums/redirecting_initializers: FormatterCrash
+enhanced_enums/simple_fields: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index 12bf080..5ad01eb 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.4.5
+
+- Handle stack traces larger than 100 entries.
+
 ## 0.4.5-dev
 
 - Require Dart >= 2.14
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index 1110d5c..0247ac9 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,6 +1,6 @@
 name: native_stack_traces
 description: Utilities for working with non-symbolic stack traces.
-version: 0.4.5-dev
+version: 0.4.5
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/native_stack_traces
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 3bfb9a8..b4dcf19 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -435,22 +435,6 @@
   }
 }
 
-void Assembler::LoadWordFromPoolIndexFixed(Register dst, intptr_t index) {
-  ASSERT(constant_pool_allowed());
-  ASSERT(dst != PP);
-  Operand op;
-  // PP is _un_tagged on ARM64.
-  const uint32_t offset = target::ObjectPool::element_offset(index);
-  const uint32_t upper20 = offset & 0xfffff000;
-  const uint32_t lower12 = offset & 0x00000fff;
-  const Operand::OperandType ot =
-      Operand::CanHold(upper20, kXRegSizeInBits, &op);
-  ASSERT(ot == Operand::Immediate);
-  ASSERT(Address::CanHoldOffset(lower12));
-  add(dst, PP, op);
-  ldr(dst, Address(dst, lower12));
-}
-
 void Assembler::LoadDoubleWordFromPoolIndex(Register lower,
                                             Register upper,
                                             intptr_t index) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 886ab74..554f4d8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -2250,8 +2250,6 @@
 
   compiler::LRState lr_state_ = compiler::LRState::OnEntry();
 
-  void LoadWordFromPoolIndexFixed(Register dst, intptr_t index);
-
   // Note: the function never clobbers TMP, TMP2 scratch registers.
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
 
diff --git a/tools/VERSION b/tools/VERSION
index 01443da..40a0483 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 148
+PRERELEASE 149
 PRERELEASE_PATCH 0
\ No newline at end of file