Skip to content

Commit 0bac80a

Browse files
committed
fix #9579: prevent non static enums that extend jl.Enum
1 parent 4c99388 commit 0bac80a

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,12 +1088,14 @@ trait Checking {
10881088
&& cls.owner.isTerm
10891089
&& (cls.owner.flagsUNSAFE.isAllOf(EnumCase)
10901090
|| ((cls.owner.name eq nme.DOLLAR_NEW) && cls.owner.flagsUNSAFE.isAllOf(Private | Synthetic)))
1091-
if (!isEnumAnonCls)
1092-
if (cdef.mods.isEnumCase) {
1093-
if (cls.derivesFrom(defn.JavaEnumClass))
1091+
val isJavaEnum = cls.derivesFrom(defn.JavaEnumClass)
1092+
if isJavaEnum && cdef.mods.isEnumClass && !cls.isStatic then
1093+
report.error(em"An enum extending java.lang.Enum must be declared in a static scope", cdef.srcPos)
1094+
if !isEnumAnonCls then
1095+
if cdef.mods.isEnumCase then
1096+
if isJavaEnum then
10941097
report.error(em"paramerized case is not allowed in an enum that extends java.lang.Enum", cdef.srcPos)
1095-
}
1096-
else if (cls.is(Case) || firstParent.is(Enum))
1098+
else if cls.is(Case) || firstParent.is(Enum) then
10971099
// Since enums are classes and Namer checks that classes don't extend multiple classes, we only check the class
10981100
// parent.
10991101
//
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import java.{lang => jl}
2+
3+
object TestSuite:
4+
def test(op: => Unit): Unit = op
5+
test {
6+
enum E extends jl.Enum[E] { case A } // error: enum extending java.lang.Enum must be declared in a static scope
7+
}
8+
9+
class Container:
10+
enum E extends jl.Enum[E] { case A } // error: enum extending java.lang.Enum must be declared in a static scope
11+
12+
object Wrap:
13+
def force =
14+
enum E extends jl.Enum[E] { case A } // error: enum extending java.lang.Enum must be declared in a static scope
15+
16+
trait Universe:
17+
enum E extends jl.Enum[E] { case A } // error: enum extending java.lang.Enum must be declared in a static scope
18+
19+
object Static:
20+
enum E extends jl.Enum[E] { case A } // ok

0 commit comments

Comments
 (0)