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
