[cfe] Ensure that enum constructors are created during outline
Enum constructors for enums with mixins were not built in the outline
phase because code assumes that initializers have to be present in order
to have a non-trivial constant constructor.
Closes #56681
Change-Id: Id614e3cde24ba3649db9ca67d938ba21575d7454
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/384264
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/source/diet_listener.dart b/pkg/front_end/lib/src/source/diet_listener.dart
index 6875479..b9c9ecf 100644
--- a/pkg/front_end/lib/src/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/source/diet_listener.dart
@@ -48,7 +48,6 @@
import 'diet_parser.dart';
import 'offset_map.dart';
import 'source_constructor_builder.dart';
-import 'source_enum_builder.dart';
import 'source_field_builder.dart';
import 'source_function_builder.dart';
import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -1180,22 +1179,6 @@
int memberCount, Token endToken) {
debugEvent("Enum");
checkEmpty(enumKeyword.charOffset);
-
- SourceEnumBuilder? enumBuilder = currentClass as SourceEnumBuilder?;
- if (enumBuilder != null) {
- DeclaredSourceConstructorBuilder? defaultConstructorBuilder =
- enumBuilder.synthesizedDefaultConstructorBuilder;
- if (defaultConstructorBuilder != null) {
- BodyBuilder bodyBuilder = createFunctionListener(
- defaultConstructorBuilder,
- inOutlineBuildingPhase: false,
- inMetadata: false,
- inConstFields: false);
- bodyBuilder.finishConstructor(AsyncMarker.Sync, new EmptyStatement(),
- superParametersAsArguments: null);
- }
- }
-
currentDeclaration = null;
memberScope = libraryBuilder.scope;
}
diff --git a/pkg/front_end/lib/src/source/source_builder_factory.dart b/pkg/front_end/lib/src/source/source_builder_factory.dart
index 6cc001f..3f2011e 100644
--- a/pkg/front_end/lib/src/source/source_builder_factory.dart
+++ b/pkg/front_end/lib/src/source/source_builder_factory.dart
@@ -2005,6 +2005,8 @@
// into the outline. In case of super-parameters language feature, the
// super initializers are required to infer the types of super parameters.
constructorBuilder.beginInitializers =
+ // TODO(johnniwinther): Avoid using a dummy token to ensure building
+ // of constant constructors in the outline phase.
beginInitializers ?? new Token.eof(-1);
}
return constructorBuilder;
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart
index 96e5c3b..e05c045 100644
--- a/pkg/front_end/lib/src/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -378,6 +378,11 @@
libraryName: libraryName),
forAbstractClassOrEnumOrMixin: true,
isSynthetic: true);
+ // Trick the constructor to be built during the outline phase.
+ // TODO(johnniwinther): Avoid relying on [beginInitializers] to ensure
+ // building constructors creation during the outline phase.
+ synthesizedDefaultConstructorBuilder!.beginInitializers =
+ new Token.eof(-1);
synthesizedDefaultConstructorBuilder!
.registerInitializedField(valuesBuilder);
nameSpace.addConstructor("", synthesizedDefaultConstructorBuilder!);
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart b/pkg/front_end/testcases/dartdevc/issue56681/main.dart
new file mode 100644
index 0000000..6e2eb32
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'main_lib.dart';
+
+void main() {
+ const a = SomeEnum.value;
+ final b = SomeEnum.value;
+
+ print('a == b: ${a == b}');
+ print('a hash: ${a.hashCode}');
+ print('b hash: ${b.hashCode}');
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.expect
new file mode 100644
index 0000000..157713b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.expect
@@ -0,0 +1,56 @@
+library;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → void {
+ const mai::SomeEnum a = #C3;
+ final mai::SomeEnum b = mai::SomeEnum::value;
+ core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}");
+ core::print("a hash: ${a.{core::Object::hashCode}{core::int}}");
+ core::print("b hash: ${b.{core::Object::hashCode}{core::int}}");
+}
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with mai::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → mai::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> mai::HasSomeField::someField
+}
+class SomeEnum extends mai::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<mai::SomeEnum> values = #C4;
+ enum-element static const field mai::SomeEnum value = #C3;
+ const synthetic constructor •(core::int #index, core::String #name) → mai::SomeEnum
+ : super mai::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @#C5
+ get someField() → core::String
+ return "field";
+}
+
+constants {
+ #C1 = 0.0
+ #C2 = "value"
+ #C3 = mai::SomeEnum {index:#C1, _name:#C2}
+ #C4 = <mai::SomeEnum>[#C3]
+ #C5 = core::_Override {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main_lib.dart:
+- SomeEnum. (from org-dartlang-testcase:///main_lib.dart:9:6)
+- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///main_lib.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart)
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.modular.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.modular.expect
new file mode 100644
index 0000000..54bffa0
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.modular.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → void {
+ const mai::SomeEnum a = #C3;
+ final mai::SomeEnum b = mai::SomeEnum::value;
+ core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}");
+ core::print("a hash: ${a.{core::Object::hashCode}{core::int}}");
+ core::print("b hash: ${b.{core::Object::hashCode}{core::int}}");
+}
+
+constants {
+ #C1 = 0.0
+ #C2 = "value"
+ #C3 = mai::SomeEnum {index:#C1, _name:#C2}
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.outline.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.outline.expect
new file mode 100644
index 0000000..017c043
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.outline.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → void
+ ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with self2::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → self2::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> self2::HasSomeField::someField
+}
+class SomeEnum extends self2::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<self2::SomeEnum> values = const <self2::SomeEnum>[self2::SomeEnum::value];
+ enum-element static const field self2::SomeEnum value = const self2::SomeEnum::•(0, "value");
+ const synthetic constructor •(core::int #index, core::String #name) → self2::SomeEnum
+ : super self2::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @core::override
+ get someField() → core::String
+ ;
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///main_lib.dart:12:4 -> InstanceConstant(const _Override{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///main_lib.dart:9:6 -> ListConstant(const <SomeEnum>[const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main_lib.dart:10:3 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Extra constant evaluation: evaluated: 10, effectively constant: 3
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..1efdc93
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → void {
+ const mai::SomeEnum a = #C3;
+ final mai::SomeEnum b = mai::SomeEnum::value;
+ core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}");
+ core::print("a hash: ${a.{core::Object::hashCode}{core::int}}");
+ core::print("b hash: ${b.{core::Object::hashCode}{core::int}}");
+}
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with mai::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → mai::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> mai::HasSomeField::someField
+}
+class SomeEnum extends mai::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<mai::SomeEnum> values = #C4;
+ enum-element static const field mai::SomeEnum value = #C3;
+ const synthetic constructor •(core::int #index, core::String #name) → mai::SomeEnum
+ : super mai::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @#C5
+ get someField() → core::String
+ return "field";
+}
+
+constants {
+ #C1 = 0.0
+ #C2 = "value"
+ #C3 = mai::SomeEnum {index:#C1, _name:#C2}
+ #C4 = <mai::SomeEnum>[#C3]
+ #C5 = core::_Override {}
+}
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///main.dart:9:22 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:11:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:12:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"})
+Extra constant evaluation: evaluated: 21, effectively constant: 3
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main_lib.dart:
+- SomeEnum. (from org-dartlang-testcase:///main_lib.dart:9:6)
+- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///main_lib.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart)
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline.expect
new file mode 100644
index 0000000..3e55fb8
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+void main() {}
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3e55fb8
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+void main() {}
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/main_lib.dart b/pkg/front_end/testcases/dartdevc/issue56681/main_lib.dart
new file mode 100644
index 0000000..8f8656b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/main_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2024, 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.
+
+mixin HasSomeField {
+ String get someField;
+}
+
+enum SomeEnum with HasSomeField {
+ value;
+
+ @override
+ String get someField => 'field';
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue56681/test.options b/pkg/front_end/testcases/dartdevc/issue56681/test.options
new file mode 100644
index 0000000..61731a9
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue56681/test.options
@@ -0,0 +1 @@
+main_lib.dart
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.outline.expect
index ec99955..7730156 100644
--- a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.outline.expect
@@ -146,6 +146,7 @@
static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
enum-element static const field self::E7 element = const self::E7::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E7
+ : super self::_E7&_Enum&MethodImplementation::•(#index, #name)
;
method _enumToString() → core::String
return "E7.${this.{core::_Enum::_name}{core::String}}";
@@ -168,6 +169,6 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:36:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:43:6 -> ListConstant(const <E6>[const E6{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:44:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:51:6 -> ListConstant(const <E7>[const E7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:52:3 -> InstanceConstant(const E7{})
-Extra constant evaluation: evaluated: 50, effectively constant: 14
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:51:6 -> ListConstant(const <E7>[const E7{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:52:3 -> InstanceConstant(const E7{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 52, effectively constant: 14
diff --git a/pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart.strong.outline.expect
index c9f8eb4..0614319 100644
--- a/pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart.strong.outline.expect
@@ -65,6 +65,10 @@
// void element() {}
// ^^^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:58:6: Error: A constant constructor can't call a non-constant super constructor.
+// enum E9 with A9 {
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -152,6 +156,7 @@
static const field core::List<self::E8> values = const <self::E8>[self::E8::element];
enum-element static const field self::E8 element = const self::E8::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E8
+ : super self::_E8&_Enum&A8::•(#index, #name)
;
method _enumToString() → core::String
return "E8.${this.{core::_Enum::_name}{core::String}}";
@@ -172,6 +177,7 @@
static const field core::List<self::E9> values = const <self::E9>[self::E9::element];
enum-element static const field self::E9 element = const self::E9::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E9
+ : super self::_E9&_Enum&A9::•(#index, #name)
;
method _enumToString() → core::String
return "E9.${this.{core::_Enum::_name}{core::String}}";
@@ -191,6 +197,7 @@
static const field core::List<self::E10> values = const <self::E10>[self::E10::element];
enum-element static const field self::E10 element = const self::E10::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E10
+ : super self::_E10&_Enum&A10::•(#index, #name)
;
method _enumToString() → core::String
return "E10.${this.{core::_Enum::_name}{core::String}}";
@@ -210,10 +217,8 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:35:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:40:6 -> ListConstant(const <E7>[const E7{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:41:3 -> InstanceConstant(const E7{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:50:6 -> ListConstant(const <E8>[const E8{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:51:3 -> InstanceConstant(const E8{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:58:6 -> ListConstant(const <E9>[const E9{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:59:3 -> InstanceConstant(const E9{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:66:6 -> ListConstant(const <E10>[const E10{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:67:3 -> InstanceConstant(const E10{})
-Extra constant evaluation: evaluated: 72, effectively constant: 16
+Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:50:6 -> ListConstant(const <E8>[const E8{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:51:3 -> InstanceConstant(const E8{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///conflicting_elements.dart:66:6 -> ListConstant(const <E10>[const E10{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///conflicting_elements.dart:67:3 -> InstanceConstant(const E10{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 79, effectively constant: 14
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.outline.expect
index 731a5c3..82f1e29 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.outline.expect
@@ -34,6 +34,7 @@
static const field core::List<self::EA> values = const <self::EA>[self::EA::element];
enum-element static const field self::EA element = const self::EA::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::EA
+ : super self::_EA&_Enum&A::•(#index, #name)
;
method _enumToString() → core::String
return "EA.${this.{core::_Enum::_name}{core::String}}";
@@ -55,6 +56,7 @@
static const field core::List<self::EB> values = const <self::EB>[self::EB::element];
enum-element static const field self::EB element = const self::EB::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::EB
+ : super self::_EB&_Enum&B::•(#index, #name)
;
method _enumToString() → core::String
return "EB.${this.{core::_Enum::_name}{core::String}}";
@@ -74,6 +76,7 @@
static const field core::List<self::EM> values = const <self::EM>[self::EM::element];
enum-element static const field self::EM element = const self::EM::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::EM
+ : super self::_EM&_Enum&M::•(#index, #name)
;
method _enumToString() → core::String
return "EM.${this.{core::_Enum::_name}{core::String}}";
@@ -93,6 +96,7 @@
static const field core::List<self::EN> values = const <self::EN>[self::EN::element];
enum-element static const field self::EN element = const self::EN::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::EN
+ : super self::_EN&_Enum&N::•(#index, #name)
;
method _enumToString() → core::String
return "EN.${this.{core::_Enum::_name}{core::String}}";
@@ -104,12 +108,12 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:10:6 -> ListConstant(const <EA>[const EA{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:10:18 -> InstanceConstant(const EA{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:17:6 -> ListConstant(const <EB>[const EB{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:17:18 -> InstanceConstant(const EB{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:24:6 -> ListConstant(const <EM>[const EM{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:24:18 -> InstanceConstant(const EM{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:31:6 -> ListConstant(const <EN>[const EN{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:31:18 -> InstanceConstant(const EN{})
-Extra constant evaluation: evaluated: 32, effectively constant: 8
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:10:6 -> ListConstant(const <EA>[const EA{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:10:18 -> InstanceConstant(const EA{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:17:6 -> ListConstant(const <EB>[const EB{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:17:18 -> InstanceConstant(const EB{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:24:6 -> ListConstant(const <EM>[const EM{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:24:18 -> InstanceConstant(const EM{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:31:6 -> ListConstant(const <EN>[const EN{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:31:18 -> InstanceConstant(const EN{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 40, effectively constant: 8
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart
new file mode 100644
index 0000000..ec293c3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2024, 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.
+
+mixin HasSomeField {
+ String get someField;
+}
+
+enum SomeEnum with HasSomeField {
+ value;
+
+ @override
+ String get someField => 'field';
+}
+
+enum NormalEnum {
+ value;
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.expect
new file mode 100644
index 0000000..b9140a0
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with self::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → self::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> self::HasSomeField::someField
+}
+class SomeEnum extends self::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<self::SomeEnum> values = #C4;
+ enum-element static const field self::SomeEnum value = #C3;
+ const synthetic constructor •(core::int #index, core::String #name) → self::SomeEnum
+ : super self::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @#C5
+ get someField() → core::String
+ return "field";
+}
+class NormalEnum extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::NormalEnum> values = #C7;
+ enum-element static const field self::NormalEnum value = #C6;
+ const synthetic constructor •(core::int #index, core::String #name) → self::NormalEnum
+ : super core::_Enum::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "NormalEnum.${this.{core::_Enum::_name}{core::String}}";
+}
+
+constants {
+ #C1 = 0
+ #C2 = "value"
+ #C3 = self::SomeEnum {index:#C1, _name:#C2}
+ #C4 = <self::SomeEnum>[#C3]
+ #C5 = core::_Override {}
+ #C6 = self::NormalEnum {index:#C1, _name:#C2}
+ #C7 = <self::NormalEnum>[#C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_with_mixin.dart:
+- SomeEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
+- NormalEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:16:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.modular.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.modular.expect
new file mode 100644
index 0000000..b9140a0
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.modular.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with self::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → self::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> self::HasSomeField::someField
+}
+class SomeEnum extends self::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<self::SomeEnum> values = #C4;
+ enum-element static const field self::SomeEnum value = #C3;
+ const synthetic constructor •(core::int #index, core::String #name) → self::SomeEnum
+ : super self::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @#C5
+ get someField() → core::String
+ return "field";
+}
+class NormalEnum extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::NormalEnum> values = #C7;
+ enum-element static const field self::NormalEnum value = #C6;
+ const synthetic constructor •(core::int #index, core::String #name) → self::NormalEnum
+ : super core::_Enum::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "NormalEnum.${this.{core::_Enum::_name}{core::String}}";
+}
+
+constants {
+ #C1 = 0
+ #C2 = "value"
+ #C3 = self::SomeEnum {index:#C1, _name:#C2}
+ #C4 = <self::SomeEnum>[#C3]
+ #C5 = core::_Override {}
+ #C6 = self::NormalEnum {index:#C1, _name:#C2}
+ #C7 = <self::NormalEnum>[#C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_with_mixin.dart:
+- SomeEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
+- NormalEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:16:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.outline.expect
new file mode 100644
index 0000000..b706f8a
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.outline.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with self::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → self::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract mixin-stub get someField() → core::String; -> self::HasSomeField::someField
+}
+class SomeEnum extends self::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<self::SomeEnum> values = const <self::SomeEnum>[self::SomeEnum::value];
+ enum-element static const field self::SomeEnum value = const self::SomeEnum::•(0, "value");
+ const synthetic constructor •(core::int #index, core::String #name) → self::SomeEnum
+ : super self::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @core::override
+ get someField() → core::String
+ ;
+}
+class NormalEnum extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::NormalEnum> values = const <self::NormalEnum>[self::NormalEnum::value];
+ enum-element static const field self::NormalEnum value = const self::NormalEnum::•(0, "value");
+ const synthetic constructor •(core::int #index, core::String #name) → self::NormalEnum
+ : super core::_Enum::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "NormalEnum.${this.{core::_Enum::_name}{core::String}}";
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///enum_with_mixin.dart:12:4 -> InstanceConstant(const _Override{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_with_mixin.dart:9:6 -> ListConstant(const <SomeEnum>[const SomeEnum{_Enum.index: 0, _Enum._name: "value"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_with_mixin.dart:10:3 -> InstanceConstant(const SomeEnum{_Enum.index: 0, _Enum._name: "value"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum_with_mixin.dart:16:6 -> ListConstant(const <NormalEnum>[const NormalEnum{_Enum.index: 0, _Enum._name: "value"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_with_mixin.dart:17:3 -> InstanceConstant(const NormalEnum{_Enum.index: 0, _Enum._name: "value"})
+Extra constant evaluation: evaluated: 17, effectively constant: 5
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.transformed.expect
new file mode 100644
index 0000000..3a9be10
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.strong.transformed.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ {
+ abstract get someField() → core::String;
+}
+abstract class _SomeEnum&_Enum&HasSomeField extends core::_Enum implements self::HasSomeField /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •(core::int index, core::String _name) → self::_SomeEnum&_Enum&HasSomeField
+ : super core::_Enum::•(index, _name)
+ ;
+ abstract get someField() → core::String;
+}
+class SomeEnum extends self::_SomeEnum&_Enum&HasSomeField /*isEnum*/ {
+ static const field core::List<self::SomeEnum> values = #C4;
+ enum-element static const field self::SomeEnum value = #C3;
+ const synthetic constructor •(core::int #index, core::String #name) → self::SomeEnum
+ : super self::_SomeEnum&_Enum&HasSomeField::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "SomeEnum.${this.{core::_Enum::_name}{core::String}}";
+ @#C5
+ get someField() → core::String
+ return "field";
+}
+class NormalEnum extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::NormalEnum> values = #C7;
+ enum-element static const field self::NormalEnum value = #C6;
+ const synthetic constructor •(core::int #index, core::String #name) → self::NormalEnum
+ : super core::_Enum::•(#index, #name)
+ ;
+ method _enumToString() → core::String
+ return "NormalEnum.${this.{core::_Enum::_name}{core::String}}";
+}
+
+constants {
+ #C1 = 0
+ #C2 = "value"
+ #C3 = self::SomeEnum {index:#C1, _name:#C2}
+ #C4 = <self::SomeEnum>[#C3]
+ #C5 = core::_Override {}
+ #C6 = self::NormalEnum {index:#C1, _name:#C2}
+ #C7 = <self::NormalEnum>[#C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_with_mixin.dart:
+- SomeEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///enum_with_mixin.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
+- NormalEnum. (from org-dartlang-testcase:///enum_with_mixin.dart:16:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline.expect
new file mode 100644
index 0000000..3e3482e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+mixin HasSomeField {
+ String get someField;
+}
+
+enum SomeEnum with HasSomeField {
+ value;
+
+ @override
+ String get someField => 'field';
+}
+
+enum NormalEnum {
+ value;
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..694f0b5
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/enum_with_mixin.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+enum NormalEnum {
+ value;
+}
+
+enum SomeEnum with HasSomeField {
+ value;
+
+ @override
+ String get someField => 'field';
+}
+
+mixin HasSomeField {
+ String get someField;
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart.strong.outline.expect
index e58a42f..643b588 100644
--- a/pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart.strong.outline.expect
@@ -92,6 +92,7 @@
static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
enum-element static const field self::E1 element = const self::E1::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E1
+ : super self::_E1&_Enum&A1::•(#index, #name)
;
method _enumToString() → core::String
return "E1.${this.{core::_Enum::_name}{core::String}}";
@@ -113,6 +114,7 @@
static const field core::List<self::E2> values = const <self::E2>[self::E2::element];
enum-element static const field self::E2 element = const self::E2::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E2
+ : super self::_E2&_Enum&A2::•(#index, #name)
;
method _enumToString() → core::String
return "E2.${this.{core::_Enum::_name}{core::String}}";
@@ -134,6 +136,7 @@
static const field core::List<self::E3> values = const <self::E3>[self::E3::element];
enum-element static const field self::E3 element = const self::E3::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E3
+ : super self::_E3&_Enum&A3::•(#index, #name)
;
method _enumToString() → core::String
return "E3.${this.{core::_Enum::_name}{core::String}}";
@@ -155,6 +158,7 @@
static const field core::List<self::E4> values = const <self::E4>[self::E4::element];
enum-element static const field self::E4 element = const self::E4::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E4
+ : super self::_E4&_Enum&A4::•(#index, #name)
;
method _enumToString() → core::String
return "E4.${this.{core::_Enum::_name}{core::String}}";
@@ -174,6 +178,7 @@
static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
enum-element static const field self::E5 element = const self::E5::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E5
+ : super self::_E5&_Enum&M5::•(#index, #name)
;
method _enumToString() → core::String
return "E5.${this.{core::_Enum::_name}{core::String}}";
@@ -193,6 +198,7 @@
static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
enum-element static const field self::E6 element = const self::E6::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E6
+ : super self::_E6&_Enum&M6::•(#index, #name)
;
method _enumToString() → core::String
return "E6.${this.{core::_Enum::_name}{core::String}}";
@@ -212,6 +218,7 @@
static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
enum-element static const field self::E7 element = const self::E7::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E7
+ : super self::_E7&_Enum&M7::•(#index, #name)
;
method _enumToString() → core::String
return "E7.${this.{core::_Enum::_name}{core::String}}";
@@ -231,6 +238,7 @@
static const field core::List<self::E8> values = const <self::E8>[self::E8::element];
enum-element static const field self::E8 element = const self::E8::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E8
+ : super self::_E8&_Enum&M8::•(#index, #name)
;
method _enumToString() → core::String
return "E8.${this.{core::_Enum::_name}{core::String}}";
@@ -254,6 +262,7 @@
static const field core::List<self::E9> values = const <self::E9>[self::E9::element];
enum-element static const field self::E9 element = const self::E9::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E9
+ : super self::_E9&_Enum&A9::•(#index, #name)
;
method _enumToString() → core::String
return "E9.${this.{core::_Enum::_name}{core::String}}";
@@ -275,6 +284,7 @@
static const field core::List<self::E10> values = const <self::E10>[self::E10::element];
enum-element static const field self::E10 element = const self::E10::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E10
+ : super self::_E10&_Enum&M10::•(#index, #name)
;
method _enumToString() → core::String
return "E10.${this.{core::_Enum::_name}{core::String}}";
@@ -284,24 +294,24 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:9:6 -> ListConstant(const <E1>[const E1{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:10:3 -> InstanceConstant(const E1{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:17:6 -> ListConstant(const <E2>[const E2{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:18:3 -> InstanceConstant(const E2{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:25:6 -> ListConstant(const <E3>[const E3{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:26:3 -> InstanceConstant(const E3{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:33:6 -> ListConstant(const <E4>[const E4{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:34:3 -> InstanceConstant(const E4{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:41:6 -> ListConstant(const <E5>[const E5{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:42:3 -> InstanceConstant(const E5{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:49:6 -> ListConstant(const <E6>[const E6{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:50:3 -> InstanceConstant(const E6{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:57:6 -> ListConstant(const <E7>[const E7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:58:3 -> InstanceConstant(const E7{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:65:6 -> ListConstant(const <E8>[const E8{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:66:3 -> InstanceConstant(const E8{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:75:6 -> ListConstant(const <E9>[const E9{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:76:3 -> InstanceConstant(const E9{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:85:6 -> ListConstant(const <E10>[const E10{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:86:3 -> InstanceConstant(const E10{})
-Extra constant evaluation: evaluated: 80, effectively constant: 20
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:9:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:10:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:17:6 -> ListConstant(const <E2>[const E2{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:18:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:25:6 -> ListConstant(const <E3>[const E3{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:26:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:33:6 -> ListConstant(const <E4>[const E4{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:34:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:41:6 -> ListConstant(const <E5>[const E5{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:42:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:49:6 -> ListConstant(const <E6>[const E6{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:50:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:57:6 -> ListConstant(const <E7>[const E7{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:58:3 -> InstanceConstant(const E7{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:65:6 -> ListConstant(const <E8>[const E8{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:66:3 -> InstanceConstant(const E8{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:75:6 -> ListConstant(const <E9>[const E9{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:76:3 -> InstanceConstant(const E9{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///inherited_restricted_members.dart:85:6 -> ListConstant(const <E10>[const E10{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inherited_restricted_members.dart:86:3 -> InstanceConstant(const E10{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 100, effectively constant: 20
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48303.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48303.dart.strong.outline.expect
index 6d3bbf4..28df817 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48303.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48303.dart.strong.outline.expect
@@ -19,6 +19,7 @@
enum-element static const field self::E e2 = const self::E::•(1, "e2");
enum-element static const field self::E e3 = const self::E::•(2, "e3");
const synthetic constructor •(core::int #index, core::String #name) → self::E
+ : super self::_E&_Enum&M1::•(#index, #name)
;
method _enumToString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -30,8 +31,8 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue48303.dart:9:6 -> ListConstant(const <E>[const E{}, const E{}, const E{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:10:3 -> InstanceConstant(const E{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:11:3 -> InstanceConstant(const E{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:12:3 -> InstanceConstant(const E{})
-Extra constant evaluation: evaluated: 11, effectively constant: 4
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue48303.dart:9:6 -> ListConstant(const <E>[const E{_Enum.index: 0, _Enum._name: "e1"}, const E{_Enum.index: 1, _Enum._name: "e2"}, const E{_Enum.index: 2, _Enum._name: "e3"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:10:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "e1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:11:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "e2"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48303.dart:12:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "e3"})
+Extra constant evaluation: evaluated: 13, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/issue49236.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue49236.dart.strong.outline.expect
index fe32e3d..56645b2 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue49236.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue49236.dart.strong.outline.expect
@@ -29,6 +29,7 @@
static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
enum-element static const field self::E1 element = const self::E1::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E1
+ : super self::_E1&_Enum&M::•(#index, #name)
;
method _enumToString() → core::String
return "E1.${this.{core::_Enum::_name}{core::String}}";
@@ -44,6 +45,7 @@
static const field core::List<self::E2> values = const <self::E2>[self::E2::element];
enum-element static const field self::E2 element = const self::E2::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E2
+ : super self::_E2&_Enum&M::•(#index, #name)
;
method _enumToString() → core::String
return "E2.${this.{core::_Enum::_name}{core::String}}";
@@ -92,6 +94,7 @@
static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
enum-element static const field self::E6 element = const self::E6::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E6
+ : super self::_E6&_Enum&A::•(#index, #name)
;
method _enumToString() → core::String
return "E6.${this.{core::_Enum::_name}{core::String}}";
@@ -107,6 +110,7 @@
static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
enum-element static const field self::E7 element = const self::E7::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E7
+ : super self::_E7&_Enum&A::•(#index, #name)
;
method _enumToString() → core::String
return "E7.${this.{core::_Enum::_name}{core::String}}";
@@ -120,18 +124,18 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:17:6 -> ListConstant(const <E1>[const E1{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:17:18 -> InstanceConstant(const E1{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:19:6 -> ListConstant(const <E2>[const E2{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:20:3 -> InstanceConstant(const E2{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:17:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:17:18 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:19:6 -> ListConstant(const <E2>[const E2{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:20:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:25:6 -> ListConstant(const <E3>[const E3{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:26:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:31:6 -> ListConstant(const <E4>[const E4{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:31:24 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:33:6 -> ListConstant(const <E5>[const E5{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:34:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:39:6 -> ListConstant(const <E6>[const E6{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:39:18 -> InstanceConstant(const E6{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:41:6 -> ListConstant(const <E7>[const E7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:42:3 -> InstanceConstant(const E7{})
-Extra constant evaluation: evaluated: 53, effectively constant: 14
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:39:6 -> ListConstant(const <E6>[const E6{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:39:18 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:41:6 -> ListConstant(const <E7>[const E7{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:42:3 -> InstanceConstant(const E7{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 61, effectively constant: 14
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_mixins.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_mixins.dart.strong.outline.expect
index 3158455..285a075 100644
--- a/pkg/front_end/testcases/enhanced_enums/simple_mixins.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/simple_mixins.dart.strong.outline.expect
@@ -26,6 +26,7 @@
enum-element static const field self::E1 one = const self::E1::•(0, "one");
enum-element static const field self::E1 two = const self::E1::•(1, "two");
const synthetic constructor •(core::int #index, core::String #name) → self::E1
+ : super self::_E1&_Enum&M1::•(#index, #name)
;
method _enumToString() → core::String
return "E1.${this.{core::_Enum::_name}{core::String}}";
@@ -49,6 +50,7 @@
enum-element static const field self::E2 one = const self::E2::•(0, "one");
enum-element static const field self::E2 two = const self::E2::•(1, "two");
const synthetic constructor •(core::int #index, core::String #name) → self::E2
+ : super self::_E2&_Enum&M1&M2::•(#index, #name)
;
method _enumToString() → core::String
return "E2.${this.{core::_Enum::_name}{core::String}}";
@@ -65,6 +67,7 @@
enum-element static const field self::E3 one = const self::E3::•(0, "one");
enum-element static const field self::E3 two = const self::E3::•(1, "two");
const synthetic constructor •(core::int #index, core::String #name) → self::E3
+ : super self::_E3&_Enum&M3::•(#index, #name)
;
method _enumToString() → core::String
return "E3.${this.{core::_Enum::_name}{core::String}}";
@@ -80,13 +83,13 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:19:6 -> ListConstant(const <E1>[const E1{}, const E1{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:19 -> InstanceConstant(const E1{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:24 -> InstanceConstant(const E1{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:21:6 -> ListConstant(const <E2>[const E2{}, const E2{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:23 -> InstanceConstant(const E2{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:28 -> InstanceConstant(const E2{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:23:6 -> ListConstant(const <E3>[const E3{}, const E3{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:19 -> InstanceConstant(const E3{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:24 -> InstanceConstant(const E3{})
-Extra constant evaluation: evaluated: 31, effectively constant: 9
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:19:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "one"}, const E1{_Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:19 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:19:24 -> InstanceConstant(const E1{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:21:6 -> ListConstant(const <E2>[const E2{_Enum.index: 0, _Enum._name: "one"}, const E2{_Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:23 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:21:28 -> InstanceConstant(const E2{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_mixins.dart:23:6 -> ListConstant(const <E3>[const E3{_Enum.index: 0, _Enum._name: "one"}, const E3{_Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:19 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_mixins.dart:23:24 -> InstanceConstant(const E3{_Enum.index: 1, _Enum._name: "two"})
+Extra constant evaluation: evaluated: 37, effectively constant: 9
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.outline.expect
index 4df704f..b8a557b 100644
--- a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.outline.expect
@@ -28,6 +28,7 @@
static const field core::List<self::E<core::num, core::num>> values = const <self::E<core::num, core::num>>[self::E::element];
enum-element static const field self::E<core::num, core::num> element = const self::E::•<core::num, core::num>(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E<self::E::S, self::E::T>
+ : super self::_E&_Enum&GM&M::•(#index, #name)
;
method _enumToString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -37,6 +38,6 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6 -> ListConstant(const <E<num, num>>[const E<num, num>{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:18:27 -> InstanceConstant(const E<num, num>{})
-Extra constant evaluation: evaluated: 9, effectively constant: 2
+Evaluated: ListLiteral @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6 -> ListConstant(const <E<num, num>>[const E<num, num>{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:18:27 -> InstanceConstant(const E<num, num>{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 11, effectively constant: 2
diff --git a/pkg/front_end/testcases/enhanced_enums/synthetic_enum_constructor.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/synthetic_enum_constructor.dart.strong.outline.expect
index 66ff4f7..a088055 100644
--- a/pkg/front_end/testcases/enhanced_enums/synthetic_enum_constructor.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/synthetic_enum_constructor.dart.strong.outline.expect
@@ -19,6 +19,7 @@
enum-element static const field self::E e2 = const self::E::•(1, "e2");
enum-element static const field self::E e3 = const self::E::•(2, "e3");
const synthetic constructor •(core::int #index, core::String #name) → self::E
+ : super self::_E&_Enum&M::•(#index, #name)
;
method _enumToString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -48,10 +49,10 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///synthetic_enum_constructor.dart:9:6 -> ListConstant(const <E>[const E{}, const E{}, const E{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:10:3 -> InstanceConstant(const E{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:11:3 -> InstanceConstant(const E{})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:12:3 -> InstanceConstant(const E{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///synthetic_enum_constructor.dart:9:6 -> ListConstant(const <E>[const E{_Enum.index: 0, _Enum._name: "e1"}, const E{_Enum.index: 1, _Enum._name: "e2"}, const E{_Enum.index: 2, _Enum._name: "e3"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:10:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "e1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:11:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "e2"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:12:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "e3"})
Evaluated: ListLiteral @ org-dartlang-testcase:///synthetic_enum_constructor.dart:15:6 -> ListConstant(const <F>[const F{_Enum.index: 0, _Enum._name: "f1"}, const F{_Enum.index: 1, _Enum._name: "f2"}, const F{_Enum.index: 2, _Enum._name: "f3"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:16:3 -> InstanceConstant(const F{_Enum.index: 0, _Enum._name: "f1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:17:3 -> InstanceConstant(const F{_Enum.index: 1, _Enum._name: "f2"})
@@ -60,4 +61,4 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:22:3 -> InstanceConstant(const G{_Enum.index: 0, _Enum._name: "g1"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:23:3 -> InstanceConstant(const G{_Enum.index: 1, _Enum._name: "g2"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///synthetic_enum_constructor.dart:24:3 -> InstanceConstant(const G{_Enum.index: 2, _Enum._name: "g3"})
-Extra constant evaluation: evaluated: 28, effectively constant: 12
+Extra constant evaluation: evaluated: 30, effectively constant: 12
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.strong.outline.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.strong.outline.expect
index dd1b018..03a8e7a 100644
--- a/pkg/front_end/testcases/general/bounds_supertypes.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.strong.outline.expect
@@ -1141,6 +1141,7 @@
static const field core::List<self::EnumWithT1> values = const <self::EnumWithT1>[self::EnumWithT1::a];
enum-element static const field self::EnumWithT1 a = const self::EnumWithT1::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT1
+ : super self::_EnumWithT1&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT1.${this.{core::_Enum::_name}{core::String}}";
@@ -1154,6 +1155,7 @@
static const field core::List<self::EnumWithT2> values = const <self::EnumWithT2>[self::EnumWithT2::a];
enum-element static const field self::EnumWithT2 a = const self::EnumWithT2::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT2
+ : super self::_EnumWithT2&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT2.${this.{core::_Enum::_name}{core::String}}";
@@ -1167,6 +1169,7 @@
static const field core::List<self::EnumWithT3> values = const <self::EnumWithT3>[self::EnumWithT3::a];
enum-element static const field self::EnumWithT3 a = const self::EnumWithT3::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT3
+ : super self::_EnumWithT3&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT3.${this.{core::_Enum::_name}{core::String}}";
@@ -1180,6 +1183,7 @@
static const field core::List<self::EnumWithT4> values = const <self::EnumWithT4>[self::EnumWithT4::a];
enum-element static const field self::EnumWithT4 a = const self::EnumWithT4::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT4
+ : super self::_EnumWithT4&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT4.${this.{core::_Enum::_name}{core::String}}";
@@ -1193,6 +1197,7 @@
static const field core::List<self::EnumWithT5> values = const <self::EnumWithT5>[self::EnumWithT5::a];
enum-element static const field self::EnumWithT5 a = const self::EnumWithT5::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT5
+ : super self::_EnumWithT5&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT5.${this.{core::_Enum::_name}{core::String}}";
@@ -1206,6 +1211,7 @@
static const field core::List<self::EnumWithT6> values = const <self::EnumWithT6>[self::EnumWithT6::a];
enum-element static const field self::EnumWithT6 a = const self::EnumWithT6::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT6
+ : super self::_EnumWithT6&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT6.${this.{core::_Enum::_name}{core::String}}";
@@ -1219,6 +1225,7 @@
static const field core::List<self::EnumWithT7> values = const <self::EnumWithT7>[self::EnumWithT7::a];
enum-element static const field self::EnumWithT7 a = const self::EnumWithT7::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT7
+ : super self::_EnumWithT7&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT7.${this.{core::_Enum::_name}{core::String}}";
@@ -1232,6 +1239,7 @@
static const field core::List<self::EnumWithT8> values = const <self::EnumWithT8>[self::EnumWithT8::a];
enum-element static const field self::EnumWithT8 a = const self::EnumWithT8::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithT8
+ : super self::_EnumWithT8&_Enum&F::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithT8.${this.{core::_Enum::_name}{core::String}}";
@@ -1245,6 +1253,7 @@
static const field core::List<self::EnumWithS1> values = const <self::EnumWithS1>[self::EnumWithS1::a];
enum-element static const field self::EnumWithS1 a = const self::EnumWithS1::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS1
+ : super self::_EnumWithS1&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS1.${this.{core::_Enum::_name}{core::String}}";
@@ -1258,6 +1267,7 @@
static const field core::List<self::EnumWithS2> values = const <self::EnumWithS2>[self::EnumWithS2::a];
enum-element static const field self::EnumWithS2 a = const self::EnumWithS2::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS2
+ : super self::_EnumWithS2&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS2.${this.{core::_Enum::_name}{core::String}}";
@@ -1271,6 +1281,7 @@
static const field core::List<self::EnumWithS3> values = const <self::EnumWithS3>[self::EnumWithS3::a];
enum-element static const field self::EnumWithS3 a = const self::EnumWithS3::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS3
+ : super self::_EnumWithS3&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS3.${this.{core::_Enum::_name}{core::String}}";
@@ -1284,6 +1295,7 @@
static const field core::List<self::EnumWithS4> values = const <self::EnumWithS4>[self::EnumWithS4::a];
enum-element static const field self::EnumWithS4 a = const self::EnumWithS4::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS4
+ : super self::_EnumWithS4&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS4.${this.{core::_Enum::_name}{core::String}}";
@@ -1297,6 +1309,7 @@
static const field core::List<self::EnumWithS5> values = const <self::EnumWithS5>[self::EnumWithS5::a];
enum-element static const field self::EnumWithS5 a = const self::EnumWithS5::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS5
+ : super self::_EnumWithS5&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS5.${this.{core::_Enum::_name}{core::String}}";
@@ -1310,6 +1323,7 @@
static const field core::List<self::EnumWithS6> values = const <self::EnumWithS6>[self::EnumWithS6::a];
enum-element static const field self::EnumWithS6 a = const self::EnumWithS6::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS6
+ : super self::_EnumWithS6&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS6.${this.{core::_Enum::_name}{core::String}}";
@@ -1323,6 +1337,7 @@
static const field core::List<self::EnumWithS7> values = const <self::EnumWithS7>[self::EnumWithS7::a];
enum-element static const field self::EnumWithS7 a = const self::EnumWithS7::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS7
+ : super self::_EnumWithS7&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS7.${this.{core::_Enum::_name}{core::String}}";
@@ -1336,6 +1351,7 @@
static const field core::List<self::EnumWithS8> values = const <self::EnumWithS8>[self::EnumWithS8::a];
enum-element static const field self::EnumWithS8 a = const self::EnumWithS8::•(0, "a");
const synthetic constructor •(core::int #index, core::String #name) → self::EnumWithS8
+ : super self::_EnumWithS8&_Enum&G::•(#index, #name)
;
method _enumToString() → core::String
return "EnumWithS8.${this.{core::_Enum::_name}{core::String}}";
@@ -1443,36 +1459,36 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:137:58 -> InstanceConstant(const EnumImplementsS7{_Enum.index: 0, _Enum._name: "a"})
Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:139:6 -> ListConstant(const <EnumImplementsS8>[const EnumImplementsS8{_Enum.index: 0, _Enum._name: "a"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:139:55 -> InstanceConstant(const EnumImplementsS8{_Enum.index: 0, _Enum._name: "a"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:141:6 -> ListConstant(const <EnumWithT1>[const EnumWithT1{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:141:38 -> InstanceConstant(const EnumWithT1{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:143:6 -> ListConstant(const <EnumWithT2>[const EnumWithT2{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:143:47 -> InstanceConstant(const EnumWithT2{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:145:6 -> ListConstant(const <EnumWithT3>[const EnumWithT3{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:145:45 -> InstanceConstant(const EnumWithT3{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:147:6 -> ListConstant(const <EnumWithT4>[const EnumWithT4{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:147:54 -> InstanceConstant(const EnumWithT4{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:149:6 -> ListConstant(const <EnumWithT5>[const EnumWithT5{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:149:50 -> InstanceConstant(const EnumWithT5{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:151:6 -> ListConstant(const <EnumWithT6>[const EnumWithT6{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:151:57 -> InstanceConstant(const EnumWithT6{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:153:6 -> ListConstant(const <EnumWithT7>[const EnumWithT7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:153:46 -> InstanceConstant(const EnumWithT7{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:155:6 -> ListConstant(const <EnumWithT8>[const EnumWithT8{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:155:43 -> InstanceConstant(const EnumWithT8{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:157:6 -> ListConstant(const <EnumWithS1>[const EnumWithS1{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:157:38 -> InstanceConstant(const EnumWithS1{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:159:6 -> ListConstant(const <EnumWithS2>[const EnumWithS2{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:159:47 -> InstanceConstant(const EnumWithS2{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:161:6 -> ListConstant(const <EnumWithS3>[const EnumWithS3{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:161:45 -> InstanceConstant(const EnumWithS3{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:163:6 -> ListConstant(const <EnumWithS4>[const EnumWithS4{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:163:54 -> InstanceConstant(const EnumWithS4{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:165:6 -> ListConstant(const <EnumWithS5>[const EnumWithS5{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:165:50 -> InstanceConstant(const EnumWithS5{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:167:6 -> ListConstant(const <EnumWithS6>[const EnumWithS6{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:167:57 -> InstanceConstant(const EnumWithS6{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:169:6 -> ListConstant(const <EnumWithS7>[const EnumWithS7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:169:46 -> InstanceConstant(const EnumWithS7{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:171:6 -> ListConstant(const <EnumWithS8>[const EnumWithS8{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:171:43 -> InstanceConstant(const EnumWithS8{})
-Extra constant evaluation: evaluated: 225, effectively constant: 64
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:141:6 -> ListConstant(const <EnumWithT1>[const EnumWithT1{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:141:38 -> InstanceConstant(const EnumWithT1{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:143:6 -> ListConstant(const <EnumWithT2>[const EnumWithT2{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:143:47 -> InstanceConstant(const EnumWithT2{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:145:6 -> ListConstant(const <EnumWithT3>[const EnumWithT3{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:145:45 -> InstanceConstant(const EnumWithT3{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:147:6 -> ListConstant(const <EnumWithT4>[const EnumWithT4{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:147:54 -> InstanceConstant(const EnumWithT4{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:149:6 -> ListConstant(const <EnumWithT5>[const EnumWithT5{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:149:50 -> InstanceConstant(const EnumWithT5{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:151:6 -> ListConstant(const <EnumWithT6>[const EnumWithT6{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:151:57 -> InstanceConstant(const EnumWithT6{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:153:6 -> ListConstant(const <EnumWithT7>[const EnumWithT7{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:153:46 -> InstanceConstant(const EnumWithT7{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:155:6 -> ListConstant(const <EnumWithT8>[const EnumWithT8{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:155:43 -> InstanceConstant(const EnumWithT8{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:157:6 -> ListConstant(const <EnumWithS1>[const EnumWithS1{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:157:38 -> InstanceConstant(const EnumWithS1{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:159:6 -> ListConstant(const <EnumWithS2>[const EnumWithS2{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:159:47 -> InstanceConstant(const EnumWithS2{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:161:6 -> ListConstant(const <EnumWithS3>[const EnumWithS3{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:161:45 -> InstanceConstant(const EnumWithS3{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:163:6 -> ListConstant(const <EnumWithS4>[const EnumWithS4{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:163:54 -> InstanceConstant(const EnumWithS4{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:165:6 -> ListConstant(const <EnumWithS5>[const EnumWithS5{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:165:50 -> InstanceConstant(const EnumWithS5{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:167:6 -> ListConstant(const <EnumWithS6>[const EnumWithS6{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:167:57 -> InstanceConstant(const EnumWithS6{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:169:6 -> ListConstant(const <EnumWithS7>[const EnumWithS7{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:169:46 -> InstanceConstant(const EnumWithS7{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:171:6 -> ListConstant(const <EnumWithS8>[const EnumWithS8{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:171:43 -> InstanceConstant(const EnumWithS8{_Enum.index: 0, _Enum._name: "a"})
+Extra constant evaluation: evaluated: 257, effectively constant: 64
diff --git a/pkg/front_end/testcases/general/const_constructor.dart b/pkg/front_end/testcases/general/const_constructor.dart
new file mode 100644
index 0000000..b90cd0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2024, 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.
+
+class Super {
+ final int field1;
+
+ const Super(this.field1);
+}
+
+class Class extends Super {
+ final int field2;
+
+ const Class(super.field1, this.field2);
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.strong.expect b/pkg/front_end/testcases/general/const_constructor.dart.strong.expect
new file mode 100644
index 0000000..3eb7727
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.strong.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object /*hasConstConstructor*/ {
+ final field core::int field1;
+ const constructor •(core::int field1) → self::Super
+ : self::Super::field1 = field1, super core::Object::•()
+ ;
+}
+class Class extends self::Super /*hasConstConstructor*/ {
+ final field core::int field2;
+ const constructor •(core::int field1, core::int field2) → self::Class
+ : self::Class::field2 = field2, super self::Super::•(field1)
+ ;
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.strong.modular.expect b/pkg/front_end/testcases/general/const_constructor.dart.strong.modular.expect
new file mode 100644
index 0000000..3eb7727
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.strong.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object /*hasConstConstructor*/ {
+ final field core::int field1;
+ const constructor •(core::int field1) → self::Super
+ : self::Super::field1 = field1, super core::Object::•()
+ ;
+}
+class Class extends self::Super /*hasConstConstructor*/ {
+ final field core::int field2;
+ const constructor •(core::int field1, core::int field2) → self::Class
+ : self::Class::field2 = field2, super self::Super::•(field1)
+ ;
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.strong.outline.expect b/pkg/front_end/testcases/general/const_constructor.dart.strong.outline.expect
new file mode 100644
index 0000000..3eb7727
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.strong.outline.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object /*hasConstConstructor*/ {
+ final field core::int field1;
+ const constructor •(core::int field1) → self::Super
+ : self::Super::field1 = field1, super core::Object::•()
+ ;
+}
+class Class extends self::Super /*hasConstConstructor*/ {
+ final field core::int field2;
+ const constructor •(core::int field1, core::int field2) → self::Class
+ : self::Class::field2 = field2, super self::Super::•(field1)
+ ;
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/general/const_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..3eb7727
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object /*hasConstConstructor*/ {
+ final field core::int field1;
+ const constructor •(core::int field1) → self::Super
+ : self::Super::field1 = field1, super core::Object::•()
+ ;
+}
+class Class extends self::Super /*hasConstConstructor*/ {
+ final field core::int field2;
+ const constructor •(core::int field1, core::int field2) → self::Class
+ : self::Class::field2 = field2, super self::Super::•(field1)
+ ;
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/general/const_constructor.dart.textual_outline.expect
new file mode 100644
index 0000000..1047717
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class Super {
+ final int field1;
+ const Super(this.field1);
+}
+
+class Class extends Super {
+ final int field2;
+ const Class(super.field1, this.field2);
+}
diff --git a/pkg/front_end/testcases/general/const_constructor.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/const_constructor.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c3e0a96
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_constructor.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+class Class extends Super {
+ const Class(super.field1, this.field2);
+ final int field2;
+}
+
+class Super {
+ const Super(this.field1);
+ final int field1;
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/class_header.dart.strong.outline.expect b/pkg/front_end/testcases/general/error_recovery/class_header.dart.strong.outline.expect
index 62f5003..823089a 100644
--- a/pkg/front_end/testcases/general/error_recovery/class_header.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/class_header.dart.strong.outline.expect
@@ -2875,6 +2875,7 @@
static const field core::List<self::E> values = const <self::E>[self::E::element];
enum-element static const field self::E element = const self::E::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E
+ : super self::_E&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
@@ -2915,6 +2916,7 @@
static const field core::List<self::E4> values = const <self::E4>[self::E4::element];
enum-element static const field self::E4 element = const self::E4::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E4
+ : super self::_E4&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E4.${this.{core::_Enum::_name}{core::String}}";
@@ -2928,6 +2930,7 @@
static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
enum-element static const field self::E5 element = const self::E5::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E5
+ : super self::_E5&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E5.${this.{core::_Enum::_name}{core::String}}";
@@ -2941,6 +2944,7 @@
static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
enum-element static const field self::E6 element = const self::E6::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E6
+ : super self::_E6&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E6.${this.{core::_Enum::_name}{core::String}}";
@@ -2954,6 +2958,7 @@
static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
enum-element static const field self::E7 element = const self::E7::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E7
+ : super self::_E7&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E7.${this.{core::_Enum::_name}{core::String}}";
@@ -2967,6 +2972,7 @@
static const field core::List<self::E8> values = const <self::E8>[self::E8::element];
enum-element static const field self::E8 element = const self::E8::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E8
+ : super self::_E8&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E8.${this.{core::_Enum::_name}{core::String}}";
@@ -3015,6 +3021,7 @@
static const field core::List<self::E13> values = const <self::E13>[self::E13::element];
enum-element static const field self::E13 element = const self::E13::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E13
+ : super self::_E13&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E13.${this.{core::_Enum::_name}{core::String}}";
@@ -3028,6 +3035,7 @@
static const field core::List<self::E14> values = const <self::E14>[self::E14::element];
enum-element static const field self::E14 element = const self::E14::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E14
+ : super self::_E14&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E14.${this.{core::_Enum::_name}{core::String}}";
@@ -3041,6 +3049,7 @@
static const field core::List<self::E15> values = const <self::E15>[self::E15::element];
enum-element static const field self::E15 element = const self::E15::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E15
+ : super self::_E15&_Enum&D::•(#index, #name)
;
method _enumToString() → core::String
return "E15.${this.{core::_Enum::_name}{core::String}}";
@@ -3099,6 +3108,7 @@
static const field core::List<self::E21> values = const <self::E21>[self::E21::element];
enum-element static const field self::E21 element = const self::E21::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E21
+ : super self::_E21&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E21.${this.{core::_Enum::_name}{core::String}}";
@@ -3112,6 +3122,7 @@
static const field core::List<self::E22> values = const <self::E22>[self::E22::element];
enum-element static const field self::E22 element = const self::E22::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E22
+ : super self::_E22&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E22.${this.{core::_Enum::_name}{core::String}}";
@@ -3143,6 +3154,7 @@
static const field core::List<self::E25> values = const <self::E25>[self::E25::element];
enum-element static const field self::E25 element = const self::E25::•(0, "element");
const synthetic constructor •(core::int #index, core::String #name) → self::E25
+ : super self::_E25&_Enum&C::•(#index, #name)
;
method _enumToString() → core::String
return "E25.${this.{core::_Enum::_name}{core::String}}";
@@ -3167,24 +3179,24 @@
Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:61:6 -> ListConstant(const <E>[const E{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:61:40 -> InstanceConstant(const E{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:61:6 -> ListConstant(const <E>[const E{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:61:40 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:62:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:62:41 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:63:6 -> ListConstant(const <E2>[const E2{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:63:41 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:64:6 -> ListConstant(const <E3>[const E3{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:64:41 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:65:6 -> ListConstant(const <E4>[const E4{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:65:41 -> InstanceConstant(const E4{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:66:6 -> ListConstant(const <E5>[const E5{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:66:41 -> InstanceConstant(const E5{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:67:6 -> ListConstant(const <E6>[const E6{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:67:51 -> InstanceConstant(const E6{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:68:6 -> ListConstant(const <E7>[const E7{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:68:54 -> InstanceConstant(const E7{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:69:6 -> ListConstant(const <E8>[const E8{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:69:48 -> InstanceConstant(const E8{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:65:6 -> ListConstant(const <E4>[const E4{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:65:41 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:66:6 -> ListConstant(const <E5>[const E5{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:66:41 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:67:6 -> ListConstant(const <E6>[const E6{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:67:51 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:68:6 -> ListConstant(const <E7>[const E7{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:68:54 -> InstanceConstant(const E7{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:69:6 -> ListConstant(const <E8>[const E8{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:69:48 -> InstanceConstant(const E8{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:70:6 -> ListConstant(const <E9>[const E9{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:70:51 -> InstanceConstant(const E9{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:71:6 -> ListConstant(const <E10>[const E10{_Enum.index: 0, _Enum._name: "element"}])
@@ -3192,12 +3204,12 @@
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:72:6 -> ListConstant(const <E11>[const E11{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:72:49 -> InstanceConstant(const E11{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:73:6 -> ListConstant(const <E12>[])
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:74:6 -> ListConstant(const <E13>[const E13{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:74:49 -> InstanceConstant(const E13{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:75:6 -> ListConstant(const <E14>[const E14{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:75:55 -> InstanceConstant(const E14{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:76:6 -> ListConstant(const <E15>[const E15{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:76:29 -> InstanceConstant(const E15{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:74:6 -> ListConstant(const <E13>[const E13{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:74:49 -> InstanceConstant(const E13{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:75:6 -> ListConstant(const <E14>[const E14{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:75:55 -> InstanceConstant(const E14{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:76:6 -> ListConstant(const <E15>[const E15{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:76:29 -> InstanceConstant(const E15{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:77:6 -> ListConstant(const <E16>[const E16{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:77:35 -> InstanceConstant(const E16{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:78:6 -> ListConstant(const <E17>[const E17{_Enum.index: 0, _Enum._name: "element"}])
@@ -3208,16 +3220,16 @@
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:80:27 -> InstanceConstant(const E19{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:81:6 -> ListConstant(const <E20>[const E20{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:81:17 -> InstanceConstant(const E20{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:82:6 -> ListConstant(const <E21>[const E21{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:82:40 -> InstanceConstant(const E21{})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:83:6 -> ListConstant(const <E22>[const E22{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:83:30 -> InstanceConstant(const E22{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:82:6 -> ListConstant(const <E21>[const E21{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:82:40 -> InstanceConstant(const E21{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:83:6 -> ListConstant(const <E22>[const E22{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:83:30 -> InstanceConstant(const E22{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:84:6 -> ListConstant(const <E23>[const E23{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:84:23 -> InstanceConstant(const E23{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:85:6 -> ListConstant(const <E24>[const E24{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:85:30 -> InstanceConstant(const E24{_Enum.index: 0, _Enum._name: "element"})
-Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:86:6 -> ListConstant(const <E25>[const E25{}])
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:86:24 -> InstanceConstant(const E25{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:86:6 -> ListConstant(const <E25>[const E25{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:86:24 -> InstanceConstant(const E25{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///class_header.dart:87:6 -> ListConstant(const <E26>[const E26{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///class_header.dart:87:36 -> InstanceConstant(const E26{_Enum.index: 0, _Enum._name: "element"})
-Extra constant evaluation: evaluated: 188, effectively constant: 53
+Extra constant evaluation: evaluated: 212, effectively constant: 53
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
index 0064683..3c11663 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
@@ -8,7 +8,7 @@
[229] enum-element static const field self::E b = [229] [229] #C6;
[232] enum-element static const field self::E c = [232] [232] #C9;
[222] const synthetic constructor •([222] core::int #index, [222] core::String #name) → self::E
- : [-1] super core::_Enum::• [-1]([-1] #index, [-1] #name)
+ : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
[-1] ;
[222] method _enumToString() → core::String
[-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
index 0064683..3c11663 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
@@ -8,7 +8,7 @@
[229] enum-element static const field self::E b = [229] [229] #C6;
[232] enum-element static const field self::E c = [232] [232] #C9;
[222] const synthetic constructor •([222] core::int #index, [222] core::String #name) → self::E
- : [-1] super core::_Enum::• [-1]([-1] #index, [-1] #name)
+ : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
[-1] ;
[222] method _enumToString() → core::String
[-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
index aa2c99a..c13f821 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
@@ -8,7 +8,7 @@
[229] enum-element static const field self::E b = [229] [229] const self::E::• [-1]([-1] 1, [-1] "b");
[232] enum-element static const field self::E c = [232] [232] const self::E::• [-1]([-1] 2, [-1] "c");
[222] const synthetic constructor •([222] core::int #index, [222] core::String #name) → self::E
- : [-1] super core::_Enum::• [-1]([-1] #index, [-1] #name)
+ : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
[-1] ;
[222] method _enumToString() → core::String
[-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
index 0e26295..8c3b114 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
[229] enum-element static const field self::E b = [229] [229] #C6;
[232] enum-element static const field self::E c = [232] [232] #C9;
[222] const synthetic constructor •([222] core::int #index, [222] core::String #name) → self::E
- : [-1] super core::_Enum::• [-1]([-1] #index, [-1] #name)
+ : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
[-1] ;
[222] method _enumToString() → core::String
[-1] return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";