[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 {}