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