@@ -720,7 +720,7 @@ object Checking {
720
720
}
721
721
722
722
/** 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 = {
724
724
def checkValueClassMember (stat : Tree ) = stat match {
725
725
case _ : TypeDef if stat.symbol.isClass =>
726
726
report.error(ValueClassesMayNotDefineInner (clazz, stat.symbol), stat.srcPos)
@@ -733,6 +733,14 @@ object Checking {
733
733
case _ =>
734
734
report.error(ValueClassesMayNotContainInitalization (clazz), stat.srcPos)
735
735
}
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
+ }
736
744
// We don't check synthesised enum anonymous classes that are generated from
737
745
// enum extending a value class type (AnyVal or an alias of it)
738
746
// The error message 'EnumMayNotBeValueClassesID' will take care of generating the error message (See #22236)
@@ -747,6 +755,9 @@ object Checking {
747
755
report.error(ValueClassesMayNotBeAbstract (clazz), clazz.srcPos)
748
756
if (! clazz.isStatic)
749
757
report.error(ValueClassesMayNotBeContainted (clazz), clazz.srcPos)
758
+
759
+ checkParentIsNotAnyValAlias()
760
+
750
761
if (isDerivedValueClass(underlyingOfValueClass(clazz.asClass).classSymbol))
751
762
report.error(ValueClassesMayNotWrapAnotherValueClass (clazz), clazz.srcPos)
752
763
else {
@@ -1228,8 +1239,8 @@ trait Checking {
1228
1239
else tpt
1229
1240
1230
1241
/** 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)
1233
1244
1234
1245
/** Check that case classes are not inherited by case classes.
1235
1246
*/
@@ -1600,7 +1611,7 @@ trait NoChecking extends ReChecking {
1600
1611
override def checkNoTargetNameConflict (stats : List [Tree ])(using Context ): Unit = ()
1601
1612
override def checkParentCall (call : Tree , caller : ClassSymbol )(using Context ): Unit = ()
1602
1613
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 = ()
1604
1615
override def checkCaseInheritance (parentSym : Symbol , caseCls : ClassSymbol , pos : SrcPos )(using Context ): Unit = ()
1605
1616
override def checkNoForwardDependencies (vparams : List [ValDef ])(using Context ): Unit = ()
1606
1617
override def checkMembersOK (tp : Type , pos : SrcPos )(using Context ): Type = tp
0 commit comments