Skip to content

Commit 4670733

Browse files
committed
Fix #5008: forbid enums extending enums
Check if we inherit from scala.Enum both directly (as a result of the desugaring) and indirectly.
1 parent 28ddeac commit 4670733

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,15 @@ class Typer extends Namer
15751575
if (!cls.is(AbstractOrTrait) && !ctx.isAfterTyper)
15761576
checkRealizableBounds(cls, cdef.namePos)
15771577
if (cls.is(Case) && cls.derivesFrom(defn.EnumClass)) checkEnum(cdef, cls)
1578+
if (seenParents.contains(defn.EnumClass)) {
1579+
// Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
1580+
// parent.
1581+
val firstParent = parents1.head.tpe.dealias.typeSymbol
1582+
if (firstParent.derivesFrom(defn.EnumClass))
1583+
//Tricky to phrase; language taken from "case-to-case inheritance is prohibited".
1584+
ctx.error(s"Enum ${cls.name} has enum ancestor ${firstParent.name}, but enum-to-enum inheritance is prohibited", cdef.pos)
1585+
}
1586+
15781587
val cdef1 = assignType(cpy.TypeDef(cdef)(name, impl1), cls)
15791588
checkVariance(cdef1)
15801589
if (ctx.phase.isTyper && cdef1.tpe.derivesFrom(defn.DynamicClass) && !ctx.dynamicsEnabled) {

tests/neg/i5008.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
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

tests/pending/neg/i5008

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

0 commit comments

Comments
 (0)