Version 2.17.0-58.0.dev

Merge commit 'e0d0ff605976837486090055caded78f7b70d195' into 'dev'
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 68b6741..093c77c 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
@@ -37,6 +37,7 @@
 
 import '../kernel/body_builder.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
+import '../kernel/expression_generator_helper.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/internal_ast.dart';
 
@@ -253,7 +254,20 @@
     members["values"] = valuesBuilder;
 
     DeclaredSourceConstructorBuilder? synthesizedDefaultConstructorBuilder;
-    if (constructorScope.local.isEmpty) {
+
+    // The default constructor is added if no generative or unnamed factory
+    // constructors are declared.
+    bool needsSynthesizedDefaultConstructor = true;
+    if (constructorScope.local.isNotEmpty) {
+      for (MemberBuilder constructorBuilder in constructorScope.local.values) {
+        if (!constructorBuilder.isFactory || constructorBuilder.name == "") {
+          needsSynthesizedDefaultConstructor = false;
+          break;
+        }
+      }
+    }
+
+    if (needsSynthesizedDefaultConstructor) {
       synthesizedDefaultConstructorBuilder =
           new DeclaredSourceConstructorBuilder(
               /* metadata = */ null,
@@ -540,6 +554,13 @@
     if (enumConstantInfos != null) {
       for (EnumConstantInfo? enumConstantInfo in enumConstantInfos!) {
         if (enumConstantInfo != null) {
+          if (enumConstantInfo.argumentsBeginToken == null &&
+              enumConstantInfo.constructorReferenceBuilder?.typeArguments !=
+                  null) {
+            addProblem(messageEnumEntryWithTypeArgumentsWithoutArguments,
+                enumConstantInfo.charOffset, noLength);
+          }
+
           String constant = enumConstantInfo.name;
           Builder declaration = firstMemberNamed(constant)!;
           SourceFieldBuilder field;
@@ -554,63 +575,69 @@
           MemberBuilder? constructorBuilder =
               constructorScopeBuilder[constructorName];
 
+          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 ||
+              typeArgumentBuilders == null && cls.typeParameters.isNotEmpty) {
+            // We need to create a BodyBuilder in two cases: 1) if the
+            // arguments token is provided, we'll use the BodyBuilder to
+            // parse them and perform inference, 2) if the type arguments
+            // aren't provided, but required, we'll use it to infer them.
+            bodyBuilder = library.loader.createBodyBuilderForOutlineExpression(
+                library, this, this, scope, fileUri);
+            bodyBuilder.constantContext = ConstantContext.required;
+          }
+
+          if (enumConstantInfo.argumentsBeginToken != null) {
+            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);
+          } else if (cls.typeParameters.isNotEmpty) {
+            arguments.types.addAll(new List<DartType>.filled(
+                cls.typeParameters.length, const UnknownType()));
+          }
+          setParents(enumSyntheticArguments, arguments);
+
           if (constructorBuilder == null ||
               constructorBuilder is! SourceConstructorBuilder) {
-            // TODO(cstefantsova): Report an error.
+            bodyBuilder ??= library.loader
+                .createBodyBuilderForOutlineExpression(
+                    library, this, this, scope, fileUri)
+              ..constantContext = ConstantContext.required;
+            field.buildBody(
+                classHierarchy.coreTypes,
+                bodyBuilder.buildUnresolvedError(
+                    new NullLiteral(),
+                    enumConstantInfo
+                            .constructorReferenceBuilder?.fullNameForErrors ??
+                        constructorName,
+                    arguments,
+                    enumConstantInfo.constructorReferenceBuilder?.charOffset ??
+                        enumConstantInfo.charOffset,
+                    kind: UnresolvedKind.Constructor));
           } else {
-            if (enumConstantInfo.argumentsBeginToken == null &&
-                enumConstantInfo.constructorReferenceBuilder?.typeArguments !=
-                    null) {
-              addProblem(messageEnumEntryWithTypeArgumentsWithoutArguments,
-                  enumConstantInfo.charOffset, noLength);
-            }
-
-            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 ||
-                typeArgumentBuilders == null && cls.typeParameters.isNotEmpty) {
-              // We need to create a BodyBuilder in two cases: 1) if the
-              // arguments token is provided, we'll use the BodyBuilder to
-              // parse them and perform inference, 2) if the type arguments
-              // aren't provided, but required, we'll use it to infer them.
-              bodyBuilder = library.loader
-                  .createBodyBuilderForOutlineExpression(
-                      library, this, this, scope, fileUri);
-              bodyBuilder.constantContext = ConstantContext.required;
-            }
-
-            if (enumConstantInfo.argumentsBeginToken != null) {
-              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);
-            } else if (cls.typeParameters.isNotEmpty) {
-              arguments.types.addAll(new List<DartType>.filled(
-                  cls.typeParameters.length, const UnknownType()));
-            }
-            setParents(enumSyntheticArguments, arguments);
-
             Expression initializer = new ConstructorInvocation(
                 constructorBuilder.constructor, arguments,
                 isConst: true)
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart b/pkg/front_end/testcases/enhanced_enums/issue48181.dart
new file mode 100644
index 0000000..9d6ac05
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, 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 E {
+  e1,
+  e2;
+  factory E.f(int i) => E.values[i];
+}
+
+enum F {
+  f1,
+  f2(42),
+  f3.foo();
+  factory F(int i) => F.values[i];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
new file mode 100644
index 0000000..0f6d2ba
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C7;
+  static const field self::E e1 = #C3;
+  static const field self::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    return #C7.{core::List::[]}(i){(core::int) → self::E};
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^".{core::List::[]}(i){(core::int) → self::F};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = <self::E>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue48181.dart:
+- E. (from org-dartlang-testcase:///issue48181.dart:5:6)
+- _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/issue48181.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f6d2ba
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C7;
+  static const field self::E e1 = #C3;
+  static const field self::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    return #C7.{core::List::[]}(i){(core::int) → self::E};
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^".{core::List::[]}(i){(core::int) → self::F};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = <self::E>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue48181.dart:
+- E. (from org-dartlang-testcase:///issue48181.dart:5:6)
+- _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/issue48181.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.textual_outline.expect
new file mode 100644
index 0000000..ac00eb5e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E { e1, e2; factory E.f(int i) => E.values[i]; }
+enum F { f1, f2(42), f3.foo(); factory F(int i) => F.values[i]; }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
new file mode 100644
index 0000000..ff44426
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C7;
+  static const field self::E e1 = #C3;
+  static const field self::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    return #C7.{core::List::[]}(i){(core::int) → self::E};
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^".{core::List::[]}(i){(core::int) → self::F};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = <self::E*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue48181.dart:
+- E. (from org-dartlang-testcase:///issue48181.dart:5:6)
+- _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/issue48181.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
new file mode 100644
index 0000000..ff44426
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C7;
+  static const field self::E e1 = #C3;
+  static const field self::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    return #C7.{core::List::[]}(i){(core::int) → self::E};
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^".{core::List::[]}(i){(core::int) → self::F};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = <self::E*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue48181.dart:
+- E. (from org-dartlang-testcase:///issue48181.dart:5:6)
+- _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/issue48181.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
new file mode 100644
index 0000000..dbb7eac
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+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::e1, self::E::e2];
+  static const field self::E e1 = const self::E::•(0, "e1");
+  static const field self::E e2 = const self::E::•(1, "e2");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    ;
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = const <self::F>[self::F::f1, self::F::f2, self::F::f3];
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    ;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue48181.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "e1"}, const E{_Enum.index: 1, _Enum._name: "e2"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48181.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "e1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48181.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "e2"})
+Extra constant evaluation: evaluated: 15, effectively constant: 3
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
new file mode 100644
index 0000000..ff44426
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+//   f1,
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+//   f2(42),
+//     ^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C7;
+  static const field self::E e1 = #C3;
+  static const field self::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f(core::int i) → self::E
+    return #C7.{core::List::[]}(i){(core::int) → self::E};
+}
+class F extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::F> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^";
+  static const field self::F f2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:13:5: Error: Couldn't find constructor 'F'.
+  f2(42),
+    ^";
+  static const field self::F f3 = invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+  f3.foo();
+    ^^^";
+  method toString() → core::String
+    return "F.${this.{core::_Enum::_name}{core::String}}";
+  static factory •(core::int i) → self::F
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
+  f1,
+    ^".{core::List::[]}(i){(core::int) → self::F};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = <self::E*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue48181.dart:
+- E. (from org-dartlang-testcase:///issue48181.dart:5:6)
+- _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 751ebe1..ca04916 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -33,6 +33,7 @@
 enhanced_enums/inference_in_constructor_parameters: FormatterCrash
 enhanced_enums/instantiated_generic_enum_types: FormatterCrash
 enhanced_enums/issue48084: FormatterCrash
+enhanced_enums/issue48181: FormatterCrash
 enhanced_enums/members: FormatterCrash
 enhanced_enums/named_arguments: FormatterCrash
 enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index 9c19b90..1cdff08 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 57
+PRERELEASE 58
 PRERELEASE_PATCH 0
\ No newline at end of file