diff --git a/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala b/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala index 946200799109..0380dd208276 100644 --- a/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala +++ b/compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala @@ -2121,9 +2121,9 @@ object messages { |""".stripMargin } - case class CaseClassCannotExtendEnum(cls: Symbol)(implicit ctx: Context) extends Message(CaseClassCannotExtendEnumID) { + case class CaseClassCannotExtendEnum(cls: Symbol, parent: Symbol)(implicit ctx: Context) extends Message(CaseClassCannotExtendEnumID) { override def kind: String = "Syntax" - override def msg: String = hl"""normal case $cls in ${cls.owner} cannot extend an enum""" + override def msg: String = hl"""normal case class cannot extend an enum. case $cls in ${cls.owner} is extending enum ${parent.name}.""" override def explanation: String = "" } } diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala index 260e0753aa69..8923d98ce4ba 100644 --- a/compiler/src/dotty/tools/dotc/typer/Checking.scala +++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala @@ -853,14 +853,14 @@ trait Checking { ctx.error(em"$what can only be used in a rewrite method", pos) /** Check that all case classes that extend `scala.Enum` are `enum` cases */ - def checkEnum(cdef: untpd.TypeDef, cls: Symbol)(implicit ctx: Context): Unit = { + def checkEnum(cdef: untpd.TypeDef, cls: Symbol, parent: Symbol)(implicit ctx: Context): Unit = { import untpd.modsDeco def isEnumAnonCls = cls.isAnonymousClass && cls.owner.isTerm && (cls.owner.flagsUNSAFE.is(Case) || cls.owner.name == nme.DOLLAR_NEW) if (!cdef.mods.isEnumCase && !isEnumAnonCls) - ctx.error(CaseClassCannotExtendEnum(cls), cdef.pos) + ctx.error(CaseClassCannotExtendEnum(cls, parent), cdef.pos) } /** Check that all references coming from enum cases in an enum companion object @@ -938,7 +938,7 @@ trait Checking { trait ReChecking extends Checking { import tpd._ - override def checkEnum(cdef: untpd.TypeDef, cls: Symbol)(implicit ctx: Context): Unit = () + override def checkEnum(cdef: untpd.TypeDef, cls: Symbol, parent: Symbol)(implicit ctx: Context): Unit = () override def checkRefsLegal(tree: tpd.Tree, badOwner: Symbol, allowed: (Name, Symbol) => Boolean, where: String)(implicit ctx: Context): Unit = () override def checkEnumCompanions(stats: List[Tree], enumContexts: collection.Map[Symbol, Context])(implicit ctx: Context): List[Tree] = stats } diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index dfed1555eb68..67b669742e81 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -1578,7 +1578,10 @@ class Typer extends Namer .withType(dummy.termRef) if (!cls.is(AbstractOrTrait) && !ctx.isAfterTyper) checkRealizableBounds(cls, cdef.namePos) - if (cls.is(Case) && cls.derivesFrom(defn.EnumClass)) checkEnum(cdef, cls) + if (cls.is(Case) && cls.derivesFrom(defn.EnumClass)) { + val firstParent = parents1.head.tpe.dealias.typeSymbol + checkEnum(cdef, cls, firstParent) + } val cdef1 = assignType(cpy.TypeDef(cdef)(name, impl1), cls) checkVariance(cdef1) if (ctx.phase.isTyper && cdef1.tpe.derivesFrom(defn.DynamicClass) && !ctx.dynamicsEnabled) { diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala index eeb54b6f183c..b0e3218347d5 100644 --- a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala @@ -30,8 +30,9 @@ class ErrorMessagesTests extends ErrorMessagesTest { implicit val ctx: Context = ictx assertMessageCount(1, messages) val errorMsg = messages.head - val CaseClassCannotExtendEnum(cls) :: Nil = messages + val CaseClassCannotExtendEnum(cls, parent) :: Nil = messages assertEquals("Bar", cls.name.show) + assertEquals("Foo", parent.name.show) assertEquals("", cls.owner.name.show) }