summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-07-15 10:19:42 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-07-15 10:19:42 +0200
commit17d6a735dcfe679fb4d8f57b19946d15bb2559f8 (patch)
tree95b92cfe5bb0638b2bc6730a9ec157aa1579a1dc /src/compiler
parenteda41a253ee004318262ce1a12c4f44a45aec229 (diff)
downloadscala-17d6a735dcfe679fb4d8f57b19946d15bb2559f8.tar.gz
scala-17d6a735dcfe679fb4d8f57b19946d15bb2559f8.tar.bz2
scala-17d6a735dcfe679fb4d8f57b19946d15bb2559f8.zip
SI-9392 Clarify the workaround comment and introduce a devWarning
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
index 7b238e56eb..9b4451d492 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
@@ -351,15 +351,15 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
val isTopLevel = innerClassSym.rawowner.isPackageClass
// impl classes are considered top-level, see comment in BTypes
if (isTopLevel || considerAsTopLevelImplementationArtifact(innerClassSym)) None
- else if (innerClassSym.rawowner.isTerm)
- // SI-9392 An errant macro might leave a reference to a local class symbol that no longer exists in the tree,
- // this avoids an assertion error in that case. AFAICT, we don't actually need the `NestedInfo` for all BTypes,
- // only for ones that describe classes defined in the trees that reach the backend, so this is safe enough.
- //
- // TODO Can we avoid creating `NestedInfo` for each type that is referred to, and instead only create if for
- // symbols of ClassDefs?
+ else if (innerClassSym.rawowner.isTerm) {
+ // This case should never be reached: the lambdalift phase mutates the rawowner field of all
+ // classes to be the enclosing class. SI-9392 shows an errant macro that leaves a reference
+ // to a local class symbol that no longer exists, which is not updated by lambdalift.
+ devWarning(innerClassSym.pos,
+ s"""The class symbol $innerClassSym with the term symbol ${innerClassSym.rawowner} as `rawowner` reached the backend.
+ |Most likely this indicates a stale reference to a non-existing class introduced by a macro, see SI-9392.""".stripMargin)
None
- else {
+ } else {
// See comment in BTypes, when is a class marked static in the InnerClass table.
val isStaticNestedClass = isOriginallyStaticOwner(innerClassSym.originalOwner)