Skip to content

Commit 2dfd81a

Browse files
committed
Fix #5008: forbid any class from extending Enums
1 parent 644053a commit 2dfd81a

File tree

4 files changed

+15
-4
lines changed

4 files changed

+15
-4
lines changed

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2128,7 +2128,7 @@ object messages {
21282128

21292129
case class ClassCannotExtendEnum(cls: Symbol, parent: Symbol)(implicit ctx: Context) extends Message(ClassCannotExtendEnumID) {
21302130
override def kind: String = "Syntax"
2131-
override def msg: String = hl"""Normal case class cannot extend an enum. case $cls in ${cls.owner} is extending enum ${parent.name}."""
2131+
override def msg: String = hl"""$cls in ${cls.owner} extends enum ${parent.name}, but extending enums is prohibited."""
21322132
override def explanation: String = ""
21332133
}
21342134

compiler/src/dotty/tools/dotc/typer/Checking.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,12 @@ trait Checking {
908908
cls.owner.isTerm &&
909909
(cls.owner.flagsUNSAFE.is(Case) || cls.owner.name == nme.DOLLAR_NEW)
910910
if (!cdef.mods.isEnumCase && !isEnumAnonCls) {
911-
if (cls.is(Case))
911+
// Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
912+
// parent.
913+
//
914+
// Unlike firstParent.derivesFrom(defn.EnumClass), this test allows inheriting from `Enum` by hand;
915+
// see enum-List-control.scala.
916+
if (cls.is(Case) || firstParent.is(Enum))
912917
ctx.error(ClassCannotExtendEnum(cls, firstParent), cdef.sourcePos)
913918
}
914919
}

tests/neg/i5008.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
enum Foo { case A }
2+
enum Bar { case A }
3+
enum Baz extends Foo { case Z } // error
4+
5+
enum Quux extends Foo with Bar { case Z } // error
6+
7+
class Quuw extends Foo // error
8+
class Quuz extends Foo { val enumTag = 1 } // error

tests/pending/neg/i5008

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)