Skip to content

Commit 771524e

Browse files
committed
fix #1642: disallow value classe wrapping value class
1 parent bc0ec86 commit 771524e

File tree

3 files changed

+5
-1
lines changed

3 files changed

+5
-1
lines changed

src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
427427
private def eraseDerivedValueClassRef(tref: TypeRef)(implicit ctx: Context): Type = {
428428
val cls = tref.symbol.asClass
429429
val underlying = underlyingOfValueClass(cls)
430-
if (underlying.exists) ErasedValueType(tref, valueErasure(underlying))
430+
if (underlying.exists && isDerivedValueClass(underlying.typeSymbol)) ErasedValueType(tref, valueErasure(underlying))
431431
else NoType
432432
}
433433

src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,9 @@ object RefChecks {
720720
case List(param) =>
721721
if (param.is(Mutable))
722722
ctx.error("value class parameter must not be a var", param.pos)
723+
724+
if (isDerivedValueClass(param.info.typeSymbol))
725+
ctx.error("value class may not wrap another user-defined value class", param.pos)
723726
case _ =>
724727
ctx.error("value class needs to have exactly one val parameter", clazz.pos)
725728
}

tests/neg/i1642.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class Test2(val valueVal: Test2) extends AnyVal

0 commit comments

Comments
 (0)