Skip to content

Commit 42d4c3f

Browse files
committed
Fix scala#6601: Check that an enum case extends its enum class
1 parent f3c52b3 commit 42d4c3f

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
229229
cpy.Inlined(tree)(callTrace, transformSub(bindings), transform(expansion)(inlineContext(call)))
230230
case tree: Template =>
231231
withNoCheckNews(tree.parents.flatMap(newPart)) {
232+
Checking.checkEnumParentOK(tree.symbol.owner)
232233
val templ1 = paramFwd.forwardParamAccessors(tree)
233234
synthMbr.addSyntheticMembers(
234235
superAcc.wrapTemplate(templ1)(

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,17 @@ object Checking {
592592
stats.foreach(checkValueClassMember)
593593
}
594594
}
595+
596+
/** Check that an enum case extends its enum class */
597+
def checkEnumParentOK(cls: Symbol)(using ctx: Context): Unit =
598+
val enumCase =
599+
if cls.isAllOf(EnumCase) then cls
600+
else if cls.isAnonymousClass && cls.owner.isAllOf(EnumCase) then cls.owner
601+
else NoSymbol
602+
if enumCase.exists then
603+
val enumCls = enumCase.owner.linkedClass
604+
if !cls.info.parents.exists(_.typeSymbol == enumCls) then
605+
ctx.error(i"enum case does not extend its enum $enumCls", enumCase.sourcePos)
595606
}
596607

597608
trait Checking {

tests/neg/i6601.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
object GADTs2 {
2+
enum Var[G, A] {
3+
case Z[A, G]() extends Expr[(A, G), A] // error
4+
case X extends AnyRef // error
5+
}
6+
enum Expr[G, A] {
7+
case Lit[G](n: Int) extends Expr[G, Int]
8+
// case S[A, G](x:
9+
}
10+
}

0 commit comments

Comments
 (0)