Skip to content

Commit c599de2

Browse files
committed
Fix #5008: forbid any class from extending Enums
1 parent e8e26e1 commit c599de2

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
@@ -2138,7 +2138,7 @@ object messages {
21382138

21392139
case class ClassCannotExtendEnum(cls: Symbol, parent: Symbol)(implicit ctx: Context) extends Message(ClassCannotExtendEnumID) {
21402140
override def kind: String = "Syntax"
2141-
override def msg: String = hl"""Normal case class cannot extend an enum. case $cls in ${cls.owner} is extending enum ${parent.name}."""
2141+
override def msg: String = hl"""$cls in ${cls.owner} extends enum ${parent.name}, but extending enums is prohibited."""
21422142
override def explanation: String = ""
21432143
}
21442144

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.pos)
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)