@@ -743,7 +743,7 @@ object Checking {
743743 }
744744
745745 /** Verify classes extending AnyVal meet the requirements */
746- def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit = {
746+ def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit = {
747747 def checkValueClassMember (stat : Tree ) = stat match {
748748 case _ : TypeDef if stat.symbol.isClass =>
749749 report.error(ValueClassesMayNotDefineInner (clazz, stat.symbol), stat.srcPos)
@@ -760,6 +760,10 @@ object Checking {
760760 // enum extending a value class type (AnyVal or an alias of it)
761761 // The error message 'EnumMayNotBeValueClassesID' will take care of generating the error message (See #22236)
762762 if (clazz.isDerivedValueClass && ! clazz.isEnumAnonymClass) {
763+ val implTree @ Template (_, _, _, _) = cdef.rhs: @ unchecked
764+ val parent = implTree.parents.head
765+ val isExtendingAliasOfAnyVal = parent.tpe.nn.dealias =:= defn.AnyValType && ! (parent.tpe.nn =:= defn.AnyValType )
766+
763767 if (clazz.is(Trait ))
764768 report.error(CannotExtendAnyVal (clazz), clazz.srcPos)
765769 if clazz.is(Module ) then
@@ -770,6 +774,8 @@ object Checking {
770774 report.error(ValueClassesMayNotBeAbstract (clazz), clazz.srcPos)
771775 if (! clazz.isStatic)
772776 report.error(ValueClassesMayNotBeContainted (clazz), clazz.srcPos)
777+ if (isExtendingAliasOfAnyVal)
778+ report.error(ValueClassCannotExtendAliasOfAnyVal (clazz, parent.symbol), clazz.srcPos)
773779 if (isDerivedValueClass(underlyingOfValueClass(clazz.asClass).classSymbol))
774780 report.error(ValueClassesMayNotWrapAnotherValueClass (clazz), clazz.srcPos)
775781 else {
@@ -1307,8 +1313,8 @@ trait Checking {
13071313 else tpt
13081314
13091315 /** Verify classes extending AnyVal meet the requirements */
1310- def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1311- Checking .checkDerivedValueClass(clazz, stats)
1316+ def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1317+ Checking .checkDerivedValueClass(cdef, clazz, stats)
13121318
13131319 /** Check that case classes are not inherited by case classes.
13141320 */
@@ -1689,7 +1695,7 @@ trait NoChecking extends ReChecking {
16891695 override def checkNoTargetNameConflict (stats : List [Tree ])(using Context ): Unit = ()
16901696 override def checkParentCall (call : Tree , caller : ClassSymbol )(using Context ): Unit = ()
16911697 override def checkSimpleKinded (tpt : Tree )(using Context ): Tree = tpt
1692- override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
1698+ override def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
16931699 override def checkCaseInheritance (parentSym : Symbol , caseCls : ClassSymbol , pos : SrcPos )(using Context ): Unit = ()
16941700 override def checkNoForwardDependencies (vparams : List [ValDef ])(using Context ): Unit = ()
16951701 override def checkMembersOK (tp : Type , pos : SrcPos )(using Context ): Type = tp
0 commit comments