scala-dev
scala-dev copied to clipboard
Avoid forcing full base type sequence to determine value-classity
⚡ scalac $(f "class B; class C extends B { def m = 42 }"); rm B.class; scalac -Ydebug $(f "class Client { def c(c: C): C = c }")
[running phase parser on a.scala]
[running phase namer on a.scala]
[running phase packageobjects on a.scala]
[running phase typer on a.scala]
warning: !!! creating stub symbol to defer error: Symbol 'type <empty>.B' is missing from the classpath.
This symbol is required by 'class C'.
Make sure that type B is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
A full rebuild may help if 'C.class' was compiled against an incompatible version of <empty>.
[running phase patmat on a.scala]
[running phase superaccessors on a.scala]
[running phase extmethods on a.scala]
[running phase pickler on a.scala]
[running phase refchecks on a.scala]
[running phase uncurry on a.scala]
[running phase fields on a.scala]
[running phase tailcalls on a.scala]
[running phase specialize on a.scala]
[running phase explicitouter on a.scala]
[running phase erasure on a.scala]
/tmp/a.scala:1: error: Symbol 'type <empty>.B' is missing from the classpath.
This symbol is required by 'class C'.
Make sure that type B is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
A full rebuild may help if 'C.class' was compiled against an incompatible version of <empty>.
class Client { def c(c: C): C = c }
^
java.lang.Throwable
at scala.reflect.internal.Symbols$StubSymbol.fail(Symbols.scala:3490)
at scala.reflect.internal.Symbols$StubSymbol.info(Symbols.scala:3501)
at scala.reflect.internal.Symbols$StubSymbol.info$(Symbols.scala:3501)
at scala.reflect.internal.Symbols$StubClassSymbol.info(Symbols.scala:3505)
at scala.reflect.internal.Symbols$StubClassSymbol.info(Symbols.scala:3505)
at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2300)
at scala.reflect.internal.Types.computeBaseClasses(Types.scala:1448)
at scala.reflect.internal.Types.computeBaseClasses$(Types.scala:1439)
at scala.reflect.internal.SymbolTable.computeBaseClasses(SymbolTable.scala:16)
at scala.reflect.internal.Types.$anonfun$defineBaseClassesOfCompoundType$2(Types.scala:1583)
at scala.reflect.internal.Types$CompoundType.memo(Types.scala:1410)
at scala.reflect.internal.Types.defineBaseClassesOfCompoundType(Types.scala:1583)
at scala.reflect.internal.Types.define$1(Types.scala:1550)
at scala.reflect.internal.Types.defineBaseClassesOfCompoundType(Types.scala:1551)
at scala.reflect.internal.Types.defineBaseClassesOfCompoundType$(Types.scala:1549)
at scala.reflect.internal.SymbolTable.defineBaseClassesOfCompoundType(SymbolTable.scala:16)
at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1393)
at scala.reflect.internal.Symbols$Symbol.ancestors(Symbols.scala:2151)
at scala.reflect.internal.Symbols$Symbol.mixinClasses(Symbols.scala:2147)
at scala.tools.nsc.transform.ExplicitOuter.transformInfo(ExplicitOuter.scala:178)
at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
at scala.reflect.internal.Symbols$Symbol.rawInfo(Symbols.scala:1624)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1541)
at scala.reflect.internal.Symbols$Symbol.isDerivedValueClass(Symbols.scala:826)
at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:131)
at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:101)
at scala.reflect.internal.Symbols$Symbol.modifyInfo(Symbols.scala:1559)
at scala.reflect.internal.Symbols.$anonfun$cloneSymbolsAndModify$1(Symbols.scala:3661)
at scala.reflect.internal.Symbols.cloneSymbolsAndModify(Symbols.scala:3661)
at scala.reflect.internal.Symbols.cloneSymbolsAndModify$(Symbols.scala:3660)
at scala.reflect.internal.SymbolTable.cloneSymbolsAndModify(SymbolTable.scala:16)
at scala.reflect.internal.transform.Erasure$ErasureMap.apply(Erasure.scala:140)
at scala.reflect.internal.transform.Erasure.specialErasure(Erasure.scala:223)
at scala.reflect.internal.transform.Erasure.specialErasure$(Erasure.scala:217)
at scala.tools.nsc.transform.Erasure.specialErasure(Erasure.scala:15)
at scala.reflect.internal.transform.Erasure.transformInfo(Erasure.scala:398)
at scala.reflect.internal.transform.Erasure.transformInfo$(Erasure.scala:360)
at scala.tools.nsc.transform.Erasure.transformInfo(Erasure.scala:15)
at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
at scala.reflect.internal.Symbols$Symbol.rawInfo(Symbols.scala:1624)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1541)
javac
does not require B.class
to compile Client
in equivalent Java code. We could make isDerivedValueClass
asking if info.firstParent.typeSymbol == AnyValClass
in an exitingTyper
?