Skip to content

Commit ff6b5d4

Browse files
committed
Check that Java sub-enums do not have parameterized enum cases
1 parent 4c800e2 commit ff6b5d4

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,20 +1046,26 @@ trait Checking {
10461046
ctx.error(em"$what $msg", posd.sourcePos)
10471047
}
10481048

1049-
/** Check that all case classes that extend `scala.Enum` are `enum` cases */
1049+
/** 1. Check that all case classes that extend `scala.Enum` are `enum` cases
1050+
* 2. Check that case class `enum` cases do not extend java.lang.Enum.
1051+
*/
10501052
def checkEnum(cdef: untpd.TypeDef, cls: Symbol, firstParent: Symbol)(implicit ctx: Context): Unit = {
10511053
import untpd.modsDeco
10521054
def isEnumAnonCls =
10531055
cls.isAnonymousClass &&
10541056
cls.owner.isTerm &&
10551057
(cls.owner.flagsUNSAFE.is(Case) || cls.owner.name == nme.DOLLAR_NEW)
1056-
if (!cdef.mods.isEnumCase && !isEnumAnonCls) {
1057-
// Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
1058-
// parent.
1059-
//
1060-
// Unlike firstParent.derivesFrom(defn.EnumClass), this test allows inheriting from `Enum` by hand;
1061-
// see enum-List-control.scala.
1062-
if (cls.is(Case) || firstParent.is(Enum))
1058+
if (!isEnumAnonCls) {
1059+
if (cdef.mods.isEnumCase) {
1060+
if (cls.derivesFrom(defn.JavaEnumClass))
1061+
ctx.error(em"paramerized case is not allowed in an enum that extends java.lang.Enum", cdef.sourcePos)
1062+
}
1063+
else if (cls.is(Case) || firstParent.is(Enum))
1064+
// Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
1065+
// parent.
1066+
//
1067+
// Unlike firstParent.derivesFrom(defn.EnumClass), this test allows inheriting from `Enum` by hand;
1068+
// see enum-List-control.scala.
10631069
ctx.error(ClassCannotExtendEnum(cls, firstParent), cdef.sourcePos)
10641070
}
10651071
}

tests/neg/enum-constrs.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
enum E[+T] extends java.lang.Enum[E[_]] {
3+
case S1, S2
4+
case C() extends E[Int] // error: parameterized case is not allowed
5+
}

tests/run/enum-constrs.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
enum Color extends java.lang.Enum[Color] {
2+
case Red, Green, Blue
3+
}
4+
5+
enum E[+T] extends java.lang.Enum[E[_]] {
6+
case S1, S2
7+
case C extends E[Int]
8+
}
9+
10+
enum Vehicle(wheels: Int) extends java.lang.Enum[Vehicle] {
11+
case Bike extends Vehicle(2)
12+
case Car extends Vehicle(4)
13+
}

0 commit comments

Comments
 (0)