diff --git a/src/dotty/tools/dotc/core/Symbols.scala b/src/dotty/tools/dotc/core/Symbols.scala index f6e4119ea6fd..a27ce3d6accc 100644 --- a/src/dotty/tools/dotc/core/Symbols.scala +++ b/src/dotty/tools/dotc/core/Symbols.scala @@ -418,9 +418,12 @@ object Symbols { def filter(p: Symbol => Boolean): Symbol = if (p(this)) this else NoSymbol /** Is this symbol a user-defined value class? */ - final def isDerivedValueClass(implicit ctx: Context): Boolean = + final def isDerivedValueClass(implicit ctx: Context): Boolean = { + this.derivesFrom(defn.AnyValClass)(ctx.withPhase(denot.validFor.firstPhaseId)) + // Simulate ValueClasses.isDerivedValueClass false // will migrate to ValueClasses.isDerivedValueClass; // unsupported value class code will continue to use this stub while it exists + } /** The current name of this symbol */ final def name(implicit ctx: Context): ThisName = denot.name.asInstanceOf[ThisName] diff --git a/src/dotty/tools/dotc/transform/ValueClasses.scala b/src/dotty/tools/dotc/transform/ValueClasses.scala index 1527d46bbaa2..276385b0b40c 100644 --- a/src/dotty/tools/dotc/transform/ValueClasses.scala +++ b/src/dotty/tools/dotc/transform/ValueClasses.scala @@ -11,11 +11,15 @@ import Flags._ /** Methods that apply to user-defined value classes */ object ValueClasses { - def isDerivedValueClass(d: SymDenotation)(implicit ctx: Context) = - d.isClass && - d.derivesFrom(defn.AnyValClass) && - (d.symbol ne defn.AnyValClass) && - !d.isPrimitiveValueClass + def isDerivedValueClass(d: SymDenotation)(implicit ctx: Context) = { + val di = d.initial.asSymDenotation + di.isClass && + di.derivesFrom(defn.AnyValClass)(ctx.withPhase(di.validFor.firstPhaseId)) && + // need to check derivesFrom at initialPhase to avoid cyclic references caused + // by forcing in transformInfo + (di.symbol ne defn.AnyValClass) && + !di.isPrimitiveValueClass + } def isMethodWithExtension(d: SymDenotation)(implicit ctx: Context) = d.isSourceMethod &&