@@ -720,7 +720,7 @@ object Checking {
720720 }
721721
722722 /** Verify classes extending AnyVal meet the requirements */
723- def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit = {
723+ def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit = {
724724 def checkValueClassMember (stat : Tree ) = stat match {
725725 case _ : TypeDef if stat.symbol.isClass =>
726726 report.error(ValueClassesMayNotDefineInner (clazz, stat.symbol), stat.srcPos)
@@ -733,6 +733,14 @@ object Checking {
733733 case _ =>
734734 report.error(ValueClassesMayNotContainInitalization (clazz), stat.srcPos)
735735 }
736+ inline def checkParentIsNotAnyValAlias (): Unit =
737+ cdef.rhs match {
738+ case impl : Template =>
739+ val parent = impl.parents.head
740+ if parent.symbol.isAliasType && parent.typeOpt.dealias =:= defn.AnyValType then
741+ report.error(ValueClassCannotExtendAliasOfAnyVal (clazz, parent.symbol), cdef.srcPos)
742+ case _ => ()
743+ }
736744 // We don't check synthesised enum anonymous classes that are generated from
737745 // enum extending a value class type (AnyVal or an alias of it)
738746 // The error message 'EnumMayNotBeValueClassesID' will take care of generating the error message (See #22236)
@@ -747,6 +755,9 @@ object Checking {
747755 report.error(ValueClassesMayNotBeAbstract (clazz), clazz.srcPos)
748756 if (! clazz.isStatic)
749757 report.error(ValueClassesMayNotBeContainted (clazz), clazz.srcPos)
758+
759+ checkParentIsNotAnyValAlias()
760+
750761 if (isDerivedValueClass(underlyingOfValueClass(clazz.asClass).classSymbol))
751762 report.error(ValueClassesMayNotWrapAnotherValueClass (clazz), clazz.srcPos)
752763 else {
@@ -1228,8 +1239,8 @@ trait Checking {
12281239 else tpt
12291240
12301241 /** Verify classes extending AnyVal meet the requirements */
1231- def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1232- Checking .checkDerivedValueClass(clazz, stats)
1242+ def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit =
1243+ Checking .checkDerivedValueClass(cdef, clazz, stats)
12331244
12341245 /** Check that case classes are not inherited by case classes.
12351246 */
@@ -1600,7 +1611,7 @@ trait NoChecking extends ReChecking {
16001611 override def checkNoTargetNameConflict (stats : List [Tree ])(using Context ): Unit = ()
16011612 override def checkParentCall (call : Tree , caller : ClassSymbol )(using Context ): Unit = ()
16021613 override def checkSimpleKinded (tpt : Tree )(using Context ): Tree = tpt
1603- override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
1614+ override def checkDerivedValueClass (cdef : untpd. TypeDef , clazz : Symbol , stats : List [Tree ])(using Context ): Unit = ()
16041615 override def checkCaseInheritance (parentSym : Symbol , caseCls : ClassSymbol , pos : SrcPos )(using Context ): Unit = ()
16051616 override def checkNoForwardDependencies (vparams : List [ValDef ])(using Context ): Unit = ()
16061617 override def checkMembersOK (tp : Type , pos : SrcPos )(using Context ): Type = tp
0 commit comments