@@ -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,15 @@ 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 parentOpt = cdef.rhs match {
764+ case impl : Template =>
765+ impl.parents.headOption
766+ case _ => None
767+ }
768+ val isExtendingAliasOfAnyVal = parentOpt.exists { parent =>
769+ parent.symbol.isAliasType && parent.tpe.nn.dealias =:= defn.AnyValType
770+ }
771+
763772 if (clazz.is(Trait ))
764773 report.error(CannotExtendAnyVal (clazz), clazz.srcPos)
765774 if clazz.is(Module ) then
@@ -770,6 +779,8 @@ object Checking {
770779 report.error(ValueClassesMayNotBeAbstract (clazz), clazz.srcPos)
771780 if (! clazz.isStatic)
772781 report.error(ValueClassesMayNotBeContainted (clazz), clazz.srcPos)
782+ if (isExtendingAliasOfAnyVal)
783+ report.error(ValueClassCannotExtendAliasOfAnyVal (clazz, parentOpt.get.symbol), clazz.srcPos)
773784 if (isDerivedValueClass(underlyingOfValueClass(clazz.asClass).classSymbol))
774785 report.error(ValueClassesMayNotWrapAnotherValueClass (clazz), clazz.srcPos)
775786 else {
@@ -1307,8 +1318,8 @@ trait Checking {
13071318 else tpt
13081319
13091320 /** Verify classes extending AnyVal meet the requirements */
1310- def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1311- Checking .checkDerivedValueClass(clazz, stats)
1321+ def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1322+ Checking .checkDerivedValueClass(cdef, clazz, stats)
13121323
13131324 /** Check that case classes are not inherited by case classes.
13141325 */
@@ -1689,7 +1700,7 @@ trait NoChecking extends ReChecking {
16891700 override def checkNoTargetNameConflict (stats : List [Tree ])(using Context ): Unit = ()
16901701 override def checkParentCall (call : Tree , caller : ClassSymbol )(using Context ): Unit = ()
16911702 override def checkSimpleKinded (tpt : Tree )(using Context ): Tree = tpt
1692- override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
1703+ override def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
16931704 override def checkCaseInheritance (parentSym : Symbol , caseCls : ClassSymbol , pos : SrcPos )(using Context ): Unit = ()
16941705 override def checkNoForwardDependencies (vparams : List [ValDef ])(using Context ): Unit = ()
16951706 override def checkMembersOK (tp : Type , pos : SrcPos )(using Context ): Type = tp
0 commit comments