Version 2.17.0-16.0.dev
Merge commit 'eb3d490b0f8049ea42a8ba03c9cc1222431f824d' into 'dev'
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 6fe3c15..1a7d41b 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2363,7 +2363,7 @@
const FixedNullableList<EnumConstantInfo>().pop(stack, elementsCount);
int endCharOffset = popCharOffset();
int startCharOffset = popCharOffset();
- pop() as List<TypeBuilder>?; // interfaces.
+ List<TypeBuilder>? interfaces = pop() as List<TypeBuilder>?;
MixinApplicationBuilder? mixinBuilder = pop() as MixinApplicationBuilder?;
List<TypeVariableBuilder>? typeVariables =
pop() as List<TypeVariableBuilder>?;
@@ -2373,11 +2373,26 @@
checkEmpty(startCharOffset);
if (name is! ParserRecovery) {
+ if (interfaces != null) {
+ for (TypeBuilder interface in interfaces) {
+ if (interface.nullabilityBuilder.build(libraryBuilder) ==
+ Nullability.nullable) {
+ libraryBuilder.addProblem(
+ templateNullableInterfaceError
+ .withArguments(interface.fullNameForErrors),
+ interface.charOffset ?? startCharOffset,
+ (name as String).length,
+ uri);
+ }
+ }
+ }
+
libraryBuilder.addEnum(
metadata,
name as String,
typeVariables,
mixinBuilder,
+ interfaces,
enumConstantInfos,
startCharOffset,
charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 9a0fe61..c9f1615 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -93,6 +93,8 @@
List<MetadataBuilder>? metadata,
String name,
List<TypeVariableBuilder>? typeVariables,
+ TypeBuilder supertypeBuilder,
+ List<TypeBuilder>? interfaceBuilders,
Scope scope,
ConstructorScope constructors,
Class cls,
@@ -100,7 +102,6 @@
this.intType,
this.listType,
this.objectType,
- TypeBuilder supertypeBuilder,
this.stringType,
SourceLibraryBuilder parent,
int startCharOffset,
@@ -113,7 +114,7 @@
name,
typeVariables,
supertypeBuilder,
- /* interfaces = */ null,
+ interfaceBuilders,
/* onTypes = */ null,
scope,
constructors,
@@ -130,6 +131,7 @@
String name,
List<TypeVariableBuilder>? typeVariables,
TypeBuilder? supertypeBuilder,
+ List<TypeBuilder>? interfaceBuilders,
List<EnumConstantInfo?>? enumConstantInfos,
SourceLibraryBuilder parent,
int startCharOffset,
@@ -408,6 +410,8 @@
metadata,
name,
typeVariables,
+ supertypeBuilder,
+ interfaceBuilders,
new Scope(
local: members,
setters: setters,
@@ -420,7 +424,6 @@
intType,
listType,
objectType,
- supertypeBuilder,
stringType,
parent,
startCharOffsetComputed,
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0ef86e7..67f880b 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2794,6 +2794,7 @@
String name,
List<TypeVariableBuilder>? typeVariables,
TypeBuilder? supertypeBuilder,
+ List<TypeBuilder>? interfaceBuilders,
List<EnumConstantInfo?>? enumConstantInfos,
int startCharOffset,
int charOffset,
@@ -2818,6 +2819,7 @@
applyMixins(supertypeBuilder, startCharOffset, charOffset,
charEndOffset, name, /* isMixinDeclaration = */ false,
typeVariables: typeVariables, isMacro: false, isEnumMixin: true),
+ interfaceBuilders,
enumConstantInfos,
this,
startCharOffset,
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart
new file mode 100644
index 0000000..07b8a79
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart
@@ -0,0 +1,44 @@
+// 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.
+
+abstract class I {
+ void foo();
+}
+
+enum E1 implements I { // Ok.
+ one,
+ two;
+
+ void foo() {}
+}
+
+enum E2 implements I { // Error.
+ one,
+ two
+}
+
+enum E3 implements I? { // Error.
+ one,
+ two;
+
+ void foo() {}
+}
+
+enum E4 {
+ one,
+ two;
+
+ void foo() {}
+}
+
+bar(I i) {}
+
+test(E1 e1, E2 e2, E3 e3, E4 e4) {
+ bar(e1); // Ok.
+ bar(e2); // Ok.
+ bar(e3); // Ok.
+ bar(e4); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.expect
new file mode 100644
index 0000000..8c56fb4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+// - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// bar(e4); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ : super core::Object::•()
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E1> values = #C7;
+ static const field self::E1 one = #C3;
+ static const field self::E1 two = #C6;
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E2 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E2> values = #C10;
+ static const field self::E2 one = #C8;
+ static const field self::E2 two = #C9;
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = #C13;
+ static const field self::E3 one = #C11;
+ static const field self::E3 two = #C12;
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = #C16;
+ static const field self::E4 one = #C14;
+ static const field self::E4 two = #C15;
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+static method bar(self::I i) → dynamic {}
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
+ self::bar(e1);
+ self::bar(e2);
+ self::bar(e3);
+ self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+ - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ bar(e4); // Error.
+ ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E1 {index:#C4, _name:#C5}
+ #C7 = <self::E1>[#C3, #C6]
+ #C8 = self::E2 {index:#C1, _name:#C2}
+ #C9 = self::E2 {index:#C4, _name:#C5}
+ #C10 = <self::E2>[#C8, #C9]
+ #C11 = self::E3 {index:#C1, _name:#C2}
+ #C12 = self::E3 {index:#C4, _name:#C5}
+ #C13 = <self::E3>[#C11, #C12]
+ #C14 = self::E4 {index:#C1, _name:#C2}
+ #C15 = self::E4 {index:#C4, _name:#C5}
+ #C16 = <self::E4>[#C14, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_interfaces.dart:
+- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
+- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
+- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.transformed.expect
new file mode 100644
index 0000000..8c56fb4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.strong.transformed.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+// - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// bar(e4); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ : super core::Object::•()
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E1> values = #C7;
+ static const field self::E1 one = #C3;
+ static const field self::E1 two = #C6;
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E2 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E2> values = #C10;
+ static const field self::E2 one = #C8;
+ static const field self::E2 two = #C9;
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = #C13;
+ static const field self::E3 one = #C11;
+ static const field self::E3 two = #C12;
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = #C16;
+ static const field self::E4 one = #C14;
+ static const field self::E4 two = #C15;
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+static method bar(self::I i) → dynamic {}
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
+ self::bar(e1);
+ self::bar(e2);
+ self::bar(e3);
+ self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+ - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ bar(e4); // Error.
+ ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E1 {index:#C4, _name:#C5}
+ #C7 = <self::E1>[#C3, #C6]
+ #C8 = self::E2 {index:#C1, _name:#C2}
+ #C9 = self::E2 {index:#C4, _name:#C5}
+ #C10 = <self::E2>[#C8, #C9]
+ #C11 = self::E3 {index:#C1, _name:#C2}
+ #C12 = self::E3 {index:#C4, _name:#C5}
+ #C13 = <self::E3>[#C11, #C12]
+ #C14 = self::E4 {index:#C1, _name:#C2}
+ #C15 = self::E4 {index:#C4, _name:#C5}
+ #C16 = <self::E4>[#C14, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_interfaces.dart:
+- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
+- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
+- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.textual_outline.expect
new file mode 100644
index 0000000..b33af83
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+abstract class I {
+ void foo();
+}
+enum E1 implements I { one, two; void foo() {} }
+enum E2 implements I { one, two }
+enum E3 implements I? { one, two; void foo() {} }
+enum E4 { one, two; void foo() {} }
+bar(I i) {}
+test(E1 e1, E2 e2, E3 e3, E4 e4) {}
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.expect
new file mode 100644
index 0000000..fbe74f9
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+// - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// bar(e4); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ : super core::Object::•()
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E1> values = #C7;
+ static const field self::E1 one = #C3;
+ static const field self::E1 two = #C6;
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E2 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E2> values = #C10;
+ static const field self::E2 one = #C8;
+ static const field self::E2 two = #C9;
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = #C13;
+ static const field self::E3 one = #C11;
+ static const field self::E3 two = #C12;
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = #C16;
+ static const field self::E4 one = #C14;
+ static const field self::E4 two = #C15;
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+static method bar(self::I i) → dynamic {}
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
+ self::bar(e1);
+ self::bar(e2);
+ self::bar(e3);
+ self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+ - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ bar(e4); // Error.
+ ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E1 {index:#C4, _name:#C5}
+ #C7 = <self::E1*>[#C3, #C6]
+ #C8 = self::E2 {index:#C1, _name:#C2}
+ #C9 = self::E2 {index:#C4, _name:#C5}
+ #C10 = <self::E2*>[#C8, #C9]
+ #C11 = self::E3 {index:#C1, _name:#C2}
+ #C12 = self::E3 {index:#C4, _name:#C5}
+ #C13 = <self::E3*>[#C11, #C12]
+ #C14 = self::E4 {index:#C1, _name:#C2}
+ #C15 = self::E4 {index:#C4, _name:#C5}
+ #C16 = <self::E4*>[#C14, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_interfaces.dart:
+- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
+- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
+- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.modular.expect
new file mode 100644
index 0000000..fbe74f9
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.modular.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+// - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// bar(e4); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ : super core::Object::•()
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E1> values = #C7;
+ static const field self::E1 one = #C3;
+ static const field self::E1 two = #C6;
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E2 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E2> values = #C10;
+ static const field self::E2 one = #C8;
+ static const field self::E2 two = #C9;
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = #C13;
+ static const field self::E3 one = #C11;
+ static const field self::E3 two = #C12;
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = #C16;
+ static const field self::E4 one = #C14;
+ static const field self::E4 two = #C15;
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+static method bar(self::I i) → dynamic {}
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
+ self::bar(e1);
+ self::bar(e2);
+ self::bar(e3);
+ self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+ - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ bar(e4); // Error.
+ ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E1 {index:#C4, _name:#C5}
+ #C7 = <self::E1*>[#C3, #C6]
+ #C8 = self::E2 {index:#C1, _name:#C2}
+ #C9 = self::E2 {index:#C4, _name:#C5}
+ #C10 = <self::E2*>[#C8, #C9]
+ #C11 = self::E3 {index:#C1, _name:#C2}
+ #C12 = self::E3 {index:#C4, _name:#C5}
+ #C13 = <self::E3*>[#C11, #C12]
+ #C14 = self::E4 {index:#C1, _name:#C2}
+ #C15 = self::E4 {index:#C4, _name:#C5}
+ #C16 = <self::E4*>[#C14, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_interfaces.dart:
+- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
+- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
+- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.outline.expect
new file mode 100644
index 0000000..02c7b48
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.outline.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*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");
+ static const field self::E1 two = const self::E1::•(1, "two");
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void
+ ;
+}
+class E2 extends core::_Enum implements self::I /*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");
+ static const field self::E2 two = const self::E2::•(1, "two");
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = const <self::E3>[self::E3::one, self::E3::two];
+ static const field self::E3 one = const self::E3::•(0, "one");
+ static const field self::E3 two = const self::E3::•(1, "two");
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void
+ ;
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = const <self::E4>[self::E4::one, self::E4::two];
+ static const field self::E4 one = const self::E4::•(0, "one");
+ static const field self::E4 two = const self::E4::•(1, "two");
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void
+ ;
+}
+static method bar(self::I i) → dynamic
+ ;
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_interfaces.dart:9: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_interfaces.dart:10:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_interfaces.dart:11:3 -> InstanceConstant(const E1{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_interfaces.dart:16: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_interfaces.dart:17:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_interfaces.dart:18:3 -> InstanceConstant(const E2{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_interfaces.dart:21: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_interfaces.dart:22:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_interfaces.dart:23:3 -> InstanceConstant(const E3{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///simple_interfaces.dart:28:6 -> ListConstant(const <E4*>[const E4{_Enum.index: 0, _Enum._name: "one"}, const E4{_Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_interfaces.dart:29:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_interfaces.dart:30:3 -> InstanceConstant(const E4{_Enum.index: 1, _Enum._name: "two"})
+Extra constant evaluation: evaluated: 32, effectively constant: 12
diff --git a/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.transformed.expect
new file mode 100644
index 0000000..fbe74f9
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart.weak.transformed.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
+// enum E3 implements I? { // Error.
+// ^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
+// - I.foo
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// enum E2 implements I { // Error.
+// ^^
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
+// void foo();
+// ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+// - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+// bar(e4); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+ synthetic constructor •() → self::I
+ : super core::Object::•()
+ ;
+ abstract method foo() → void;
+}
+class E1 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E1> values = #C7;
+ static const field self::E1 one = #C3;
+ static const field self::E1 two = #C6;
+ const constructor •(core::int index, core::String name) → self::E1
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E1.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E2 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E2> values = #C10;
+ static const field self::E2 one = #C8;
+ static const field self::E2 two = #C9;
+ const constructor •(core::int index, core::String name) → self::E2
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3 extends core::_Enum implements self::I /*isEnum*/ {
+ static const field core::List<self::E3> values = #C13;
+ static const field self::E3 one = #C11;
+ static const field self::E3 two = #C12;
+ const constructor •(core::int index, core::String name) → self::E3
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E3.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+class E4 extends core::_Enum /*isEnum*/ {
+ static const field core::List<self::E4> values = #C16;
+ static const field self::E4 one = #C14;
+ static const field self::E4 two = #C15;
+ const constructor •(core::int index, core::String name) → self::E4
+ : super core::_Enum::•(index, name)
+ ;
+ method toString() → core::String
+ return "E4.${this.{core::_Enum::_name}{core::String}}";
+ method foo() → void {}
+}
+static method bar(self::I i) → dynamic {}
+static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
+ self::bar(e1);
+ self::bar(e2);
+ self::bar(e3);
+ self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
+ - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
+ bar(e4); // Error.
+ ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = 0
+ #C2 = "one"
+ #C3 = self::E1 {index:#C1, _name:#C2}
+ #C4 = 1
+ #C5 = "two"
+ #C6 = self::E1 {index:#C4, _name:#C5}
+ #C7 = <self::E1*>[#C3, #C6]
+ #C8 = self::E2 {index:#C1, _name:#C2}
+ #C9 = self::E2 {index:#C4, _name:#C5}
+ #C10 = <self::E2*>[#C8, #C9]
+ #C11 = self::E3 {index:#C1, _name:#C2}
+ #C12 = self::E3 {index:#C4, _name:#C5}
+ #C13 = <self::E3*>[#C11, #C12]
+ #C14 = self::E4 {index:#C1, _name:#C2}
+ #C15 = self::E4 {index:#C4, _name:#C5}
+ #C16 = <self::E4*>[#C14, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_interfaces.dart:
+- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
+- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
+- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 0228fca..35116bf 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -35,6 +35,7 @@
enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
enhanced_enums/redirecting_initializers: FormatterCrash
enhanced_enums/simple_fields: FormatterCrash
+enhanced_enums/simple_interfaces: FormatterCrash
enhanced_enums/simple_mixins: FormatterCrash
extension_types/basic_show: FormatterCrash
extension_types/call_not_get: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index bce7bbe..019f1ab 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 15
+PRERELEASE 16
PRERELEASE_PATCH 0
\ No newline at end of file