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