Skip to content

Commit 60eb705

Browse files
Prevent traits from extending java.lang.Enum
See scala#9487 (comment)
1 parent 74ba21c commit 60eb705

File tree

6 files changed

+12
-11
lines changed

6 files changed

+12
-11
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1492,7 +1492,11 @@ import ast.tpd
14921492

14931493
class CannotExtendJavaEnum(sym: Symbol)(using Context)
14941494
extends SyntaxMsg(CannotExtendJavaEnumID) {
1495-
def msg = em"""$sym cannot extend ${hl("java.lang.Enum")}: only enums defined with the ${hl("enum")} syntax can"""
1495+
def msg =
1496+
val reason =
1497+
if Feature.migrateTo3 then i"only classes can (no ${hl("enum")} syntax in migration mode)"
1498+
else i"only enums defined with the ${hl("enum")} syntax can"
1499+
em"""$sym cannot extend ${hl("java.lang.Enum")}: $reason"""
14961500
def explain = ""
14971501
}
14981502

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,8 @@ object RefChecks {
109109
checkSelfConforms(reqd, "missing requirement", "required")
110110

111111
// Prevent wrong `extends` of java.lang.Enum
112-
if !migrateTo3 &&
113-
!cls.isOneOf(Enum | Trait) &&
114-
parents.exists(_.classSymbol == defn.JavaEnumClass)
115-
then
112+
val wrongJavaEnum = if migrateTo3 then cls.is(Trait) else !cls.is(Enum)
113+
if wrongJavaEnum && parents.exists(_.classSymbol == defn.JavaEnumClass) then
116114
report.error(CannotExtendJavaEnum(cls), cls.sourcePos)
117115

118116
case _ =>

compiler/test/dotty/tools/dotc/CompilationTests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ class CompilationTests extends ParallelTesting {
171171
compileFile("tests/neg-custom-args/kind-projector.scala", defaultOptions.and("-Ykind-projector")),
172172
compileFile("tests/neg-custom-args/typeclass-derivation2.scala", defaultOptions.and("-Yerased-terms")),
173173
compileFile("tests/neg-custom-args/i5498-postfixOps.scala", defaultOptions withoutLanguageFeature "postfixOps"),
174+
compileFile("tests/neg-custom-args/trait-extend-java-enum.scala", defaultOptions.and("-source", "3.0-migration"))
174175
).checkExpectedErrors()
175176
}
176177

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
trait T extends java.lang.Enum[T] // error
2+
3+
class E extends T

tests/neg/extend-java-enum.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ class C1 extends jl.Enum[C1] // error: class C1 cannot extend java.lang.Enum
44

55
class C2(name: String, ordinal: Int) extends jl.Enum[C2](name, ordinal) // error: class C2 cannot extend java.lang.Enum
66

7-
trait T extends jl.Enum[T] // ok
7+
trait T extends jl.Enum[T] // error: trait T cannot extend java.lang.Enum
88

99
class C3 extends T // error: class C3 cannot extend java.lang.Enum

tests/pos/trait-java-enum.scala

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

0 commit comments

Comments
 (0)