[cfe] Report errors on implementors of 'Enum' declaring 'values'

Part of https://github.com/dart-lang/sdk/issues/47453

Closes https://github.com/dart-lang/sdk/issues/48388

Change-Id: I87d57407e16916a78864b9ce74b9250afc39958f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/233304
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index bb5c37e..7312240 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2836,6 +2836,31 @@
         r"""Enum factory constructors can't redirect to generative constructors.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateEnumImplementerContainsValuesDeclaration =
+    const Template<Message Function(String name)>(
+        problemMessageTemplate:
+            r"""'#name' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.""",
+        withArguments: _withArgumentsEnumImplementerContainsValuesDeclaration);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeEnumImplementerContainsValuesDeclaration =
+    const Code<Message Function(String name)>(
+  "EnumImplementerContainsValuesDeclaration",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsEnumImplementerContainsValuesDeclaration(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeEnumImplementerContainsValuesDeclaration,
+      problemMessage:
+          """'${name}' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 470af5a..0f930faf 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -622,25 +622,58 @@
     // Moreover, it checks that `FutureOr` and `void` are not among the
     // supertypes and that `Enum` is not implemented by non-abstract classes.
 
-    if (!cls.isAbstract && !cls.isEnum) {
-      bool isEnumFound = false;
+    if (library.enableEnhancedEnumsInLibrary) {
+      bool hasEnumSuperinterface = false;
       List<Supertype> interfaces =
           hierarchyBuilder.getNodeFromClass(cls).superclasses;
-      for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+      for (int i = 0; !hasEnumSuperinterface && i < interfaces.length; i++) {
         if (interfaces[i].classNode == enumClass) {
-          isEnumFound = true;
+          hasEnumSuperinterface = true;
         }
       }
       interfaces = hierarchyBuilder.getNodeFromClass(cls).interfaces;
-      for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+      for (int i = 0; !hasEnumSuperinterface && i < interfaces.length; i++) {
         if (interfaces[i].classNode == enumClass) {
-          isEnumFound = true;
+          hasEnumSuperinterface = true;
         }
       }
-      if (isEnumFound) {
+      if (!cls.isAbstract && !cls.isEnum && hasEnumSuperinterface) {
         addProblem(templateEnumSupertypeOfNonAbstractClass.withArguments(name),
             charOffset, noLength);
       }
+
+      if (hasEnumSuperinterface) {
+        Builder? customValuesDeclaration =
+            scope.lookupLocalMember("values", setter: false);
+        if (customValuesDeclaration != null &&
+            !customValuesDeclaration.isStatic) {
+          // Retrieve the earliest declaration for error reporting.
+          while (customValuesDeclaration?.next != null) {
+            customValuesDeclaration = customValuesDeclaration?.next;
+          }
+          library.addProblem(
+              templateEnumImplementerContainsValuesDeclaration
+                  .withArguments(this.name),
+              customValuesDeclaration!.charOffset,
+              customValuesDeclaration.fullNameForErrors.length,
+              fileUri);
+        }
+        customValuesDeclaration =
+            scope.lookupLocalMember("values", setter: true);
+        if (customValuesDeclaration != null &&
+            !customValuesDeclaration.isStatic) {
+          // Retrieve the earliest declaration for error reporting.
+          while (customValuesDeclaration?.next != null) {
+            customValuesDeclaration = customValuesDeclaration?.next;
+          }
+          library.addProblem(
+              templateEnumImplementerContainsValuesDeclaration
+                  .withArguments(this.name),
+              customValuesDeclaration!.charOffset,
+              customValuesDeclaration.fullNameForErrors.length,
+              fileUri);
+        }
+      }
     }
 
     void fail(NamedTypeBuilder target, Message message,
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 644d13b..0e1957f 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -5,8 +5,6 @@
 # Note that test/spelling: Status will have no effect. Spelling errors can
 # always be fixed by either spelling correctly or updating the dictionary.
 
-EnumContainsValuesDeclaration/analyzerCode: Fail
-EnumContainsValuesDeclaration/example: Fail
 AbstractClassConstructorTearOff/analyzerCode: Fail
 AbstractClassInstantiation/example: Fail
 AbstractExtensionField/analyzerCode: Fail
@@ -219,6 +217,8 @@
 EnumConstructorSuperInitializer/example: Fail
 EnumConstructorTearoff/analyzerCode: Fail
 EnumConstructorTearoff/example: Fail
+EnumContainsValuesDeclaration/analyzerCode: Fail
+EnumContainsValuesDeclaration/example: Fail
 EnumDeclaresConstFactory/analyzerCode: Fail
 EnumDeclaresConstFactory/example: Fail
 EnumDeclaresFactory/analyzerCode: Fail
@@ -227,6 +227,8 @@
 EnumEntryWithTypeArgumentsWithoutArguments/example: Fail
 EnumFactoryRedirectsToConstructor/analyzerCode: Fail
 EnumFactoryRedirectsToConstructor/example: Fail
+EnumImplementerContainsValuesDeclaration/analyzerCode: Fail
+EnumImplementerContainsValuesDeclaration/example: Fail
 EnumInstantiation/example: Fail
 EnumNonConstConstructor/analyzerCode: Fail
 EnumNonConstConstructor/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 8607ae0..043a64d 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5476,3 +5476,6 @@
 
 EnumContainsValuesDeclaration:
   problemMessage: "Enums can't contain declarations of members with the name 'values'."
+
+EnumImplementerContainsValuesDeclaration:
+  problemMessage: "'#name' has 'Enum' as a superinterface and can't contain non-static member with name 'values'."
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart b/pkg/front_end/testcases/enhanced_enums/issue48388.dart
new file mode 100644
index 0000000..eda8388
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+mixin M1 on Enum {
+  final int values = 42; // Error.
+}
+
+mixin M2 on Enum {
+  static final int values = 42; // Ok.
+}
+
+mixin M3 on Enum {
+  void set values(String x) {} // Error.
+}
+
+mixin M4 on Enum {
+  static void set values(String x) {} // Ok.
+}
+
+mixin M5 on Enum {
+  num get values => 0; // Error.
+  void set values(num x) {} // Error.
+}
+
+abstract class E1 extends Enum {
+  int values() => 42; // Error.
+}
+
+abstract class E2 extends Enum {
+  static int values() => 42; // Ok.
+}
+
+abstract class E3 extends Enum {
+  void set values(num x) {} // Error.
+}
+
+abstract class E4 extends Enum {
+  static void set values(num x) {} // Ok.
+}
+
+abstract class E5 extends Enum {
+  num get values => 0; // Error.
+  void set values(num x) {} // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.expect
new file mode 100644
index 0000000..5326e00
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values = 42;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values = 42;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void {}
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void {}
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    : super core::Enum::•()
+    ;
+  method values() → core::int
+    return 42;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    : super core::Enum::•()
+    ;
+  static method values() → core::int
+    return 42;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    : super core::Enum::•()
+    ;
+  set values(core::num x) → void {}
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    : super core::Enum::•()
+    ;
+  static set values(core::num x) → void {}
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    : super core::Enum::•()
+    ;
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.transformed.expect
new file mode 100644
index 0000000..5326e00
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.strong.transformed.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values = 42;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values = 42;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void {}
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void {}
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    : super core::Enum::•()
+    ;
+  method values() → core::int
+    return 42;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    : super core::Enum::•()
+    ;
+  static method values() → core::int
+    return 42;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    : super core::Enum::•()
+    ;
+  set values(core::num x) → void {}
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    : super core::Enum::•()
+    ;
+  static set values(core::num x) → void {}
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    : super core::Enum::•()
+    ;
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline.expect
new file mode 100644
index 0000000..a098e65
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline.expect
@@ -0,0 +1,39 @@
+mixin M1 on Enum {
+  final int values = 42;
+}
+mixin M2 on Enum {
+  static final int values = 42;
+}
+mixin M3 on Enum {
+  void set values(String x) {}
+}
+mixin M4 on Enum {
+  static void set values(String x) {}
+}
+mixin M5 on Enum {
+  num get values => 0;
+  void set values(num x) {}
+}
+
+abstract class E1 extends Enum {
+  int values() => 42;
+}
+
+abstract class E2 extends Enum {
+  static int values() => 42;
+}
+
+abstract class E3 extends Enum {
+  void set values(num x) {}
+}
+
+abstract class E4 extends Enum {
+  static void set values(num x) {}
+}
+
+abstract class E5 extends Enum {
+  num get values => 0;
+  void set values(num x) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ab86f28
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.textual_outline_modelled.expect
@@ -0,0 +1,38 @@
+abstract class E1 extends Enum {
+  int values() => 42;
+}
+
+abstract class E2 extends Enum {
+  static int values() => 42;
+}
+
+abstract class E3 extends Enum {
+  void set values(num x) {}
+}
+
+abstract class E4 extends Enum {
+  static void set values(num x) {}
+}
+
+abstract class E5 extends Enum {
+  num get values => 0;
+  void set values(num x) {}
+}
+
+main() {}
+mixin M1 on Enum {
+  final int values = 42;
+}
+mixin M2 on Enum {
+  static final int values = 42;
+}
+mixin M3 on Enum {
+  void set values(String x) {}
+}
+mixin M4 on Enum {
+  static void set values(String x) {}
+}
+mixin M5 on Enum {
+  num get values => 0;
+  void set values(num x) {}
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.expect
new file mode 100644
index 0000000..5326e00
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values = 42;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values = 42;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void {}
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void {}
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    : super core::Enum::•()
+    ;
+  method values() → core::int
+    return 42;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    : super core::Enum::•()
+    ;
+  static method values() → core::int
+    return 42;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    : super core::Enum::•()
+    ;
+  set values(core::num x) → void {}
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    : super core::Enum::•()
+    ;
+  static set values(core::num x) → void {}
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    : super core::Enum::•()
+    ;
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.modular.expect
new file mode 100644
index 0000000..5326e00
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values = 42;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values = 42;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void {}
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void {}
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    : super core::Enum::•()
+    ;
+  method values() → core::int
+    return 42;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    : super core::Enum::•()
+    ;
+  static method values() → core::int
+    return 42;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    : super core::Enum::•()
+    ;
+  set values(core::num x) → void {}
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    : super core::Enum::•()
+    ;
+  static set values(core::num x) → void {}
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    : super core::Enum::•()
+    ;
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.outline.expect
new file mode 100644
index 0000000..7152d79
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.outline.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void
+    ;
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void
+    ;
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    ;
+  set values(core::num x) → void
+    ;
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    ;
+  method values() → core::int
+    ;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    ;
+  static method values() → core::int
+    ;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    ;
+  set values(core::num x) → void
+    ;
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    ;
+  static set values(core::num x) → void
+    ;
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    ;
+  get values() → core::num
+    ;
+  set values(core::num x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.transformed.expect
new file mode 100644
index 0000000..5326e00
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/issue48388.dart.weak.transformed.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:6:13: Error: 'M1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   final int values = 42; // Error.
+//             ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:14:12: Error: 'M3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(String x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:22:11: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:23:12: Error: 'M5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:27:7: Error: 'E1' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   int values() => 42; // Error.
+//       ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:35:12: Error: 'E3' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:43:11: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   num get values => 0; // Error.
+//           ^^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/issue48388.dart:44:12: Error: 'E5' has 'Enum' as a superinterface and can't contain non-static member with name 'values'.
+//   void set values(num x) {} // Error.
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Enum /*isMixinDeclaration*/  {
+  final field core::int values = 42;
+}
+abstract class M2 extends core::Enum /*isMixinDeclaration*/  {
+  static final field core::int values = 42;
+}
+abstract class M3 extends core::Enum /*isMixinDeclaration*/  {
+  set values(core::String x) → void {}
+}
+abstract class M4 extends core::Enum /*isMixinDeclaration*/  {
+  static set values(core::String x) → void {}
+}
+abstract class M5 extends core::Enum /*isMixinDeclaration*/  {
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+abstract class E1 extends core::Enum {
+  synthetic constructor •() → self::E1
+    : super core::Enum::•()
+    ;
+  method values() → core::int
+    return 42;
+}
+abstract class E2 extends core::Enum {
+  synthetic constructor •() → self::E2
+    : super core::Enum::•()
+    ;
+  static method values() → core::int
+    return 42;
+}
+abstract class E3 extends core::Enum {
+  synthetic constructor •() → self::E3
+    : super core::Enum::•()
+    ;
+  set values(core::num x) → void {}
+}
+abstract class E4 extends core::Enum {
+  synthetic constructor •() → self::E4
+    : super core::Enum::•()
+    ;
+  static set values(core::num x) → void {}
+}
+abstract class E5 extends core::Enum {
+  synthetic constructor •() → self::E5
+    : super core::Enum::•()
+    ;
+  get values() → core::num
+    return 0;
+  set values(core::num x) → void {}
+}
+static method main() → dynamic {}