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