@@ -743,7 +743,7 @@ object Checking {
743
743
}
744
744
745
745
/** 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 = {
747
747
def checkValueClassMember (stat : Tree ) = stat match {
748
748
case _ : TypeDef if stat.symbol.isClass =>
749
749
report.error(ValueClassesMayNotDefineInner (clazz, stat.symbol), stat.srcPos)
@@ -760,6 +760,15 @@ object Checking {
760
760
// enum extending a value class type (AnyVal or an alias of it)
761
761
// The error message 'EnumMayNotBeValueClassesID' will take care of generating the error message (See #22236)
762
762
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
+
763
772
if (clazz.is(Trait ))
764
773
report.error(CannotExtendAnyVal (clazz), clazz.srcPos)
765
774
if clazz.is(Module ) then
@@ -770,6 +779,8 @@ object Checking {
770
779
report.error(ValueClassesMayNotBeAbstract (clazz), clazz.srcPos)
771
780
if (! clazz.isStatic)
772
781
report.error(ValueClassesMayNotBeContainted (clazz), clazz.srcPos)
782
+ if (isExtendingAliasOfAnyVal)
783
+ report.error(ValueClassCannotExtendAliasOfAnyVal (clazz, parentOpt.get.symbol), clazz.srcPos)
773
784
if (isDerivedValueClass(underlyingOfValueClass(clazz.asClass).classSymbol))
774
785
report.error(ValueClassesMayNotWrapAnotherValueClass (clazz), clazz.srcPos)
775
786
else {
@@ -1307,8 +1318,8 @@ trait Checking {
1307
1318
else tpt
1308
1319
1309
1320
/** 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)
1312
1323
1313
1324
/** Check that case classes are not inherited by case classes.
1314
1325
*/
@@ -1689,7 +1700,7 @@ trait NoChecking extends ReChecking {
1689
1700
override def checkNoTargetNameConflict (stats : List [Tree ])(using Context ): Unit = ()
1690
1701
override def checkParentCall (call : Tree , caller : ClassSymbol )(using Context ): Unit = ()
1691
1702
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 = ()
1693
1704
override def checkCaseInheritance (parentSym : Symbol , caseCls : ClassSymbol , pos : SrcPos )(using Context ): Unit = ()
1694
1705
override def checkNoForwardDependencies (vparams : List [ValDef ])(using Context ): Unit = ()
1695
1706
override def checkMembersOK (tp : Type , pos : SrcPos )(using Context ): Type = tp
0 commit comments