From 3b6b2bfe9fdd7995bf9f90a5fafc30613a101179 Mon Sep 17 00:00:00 2001 From: Lukas Rytz Date: Wed, 15 Jul 2015 10:19:42 +0200 Subject: [backport] SI-9392 Clarify the workaround comment and introduce a devWarning --- .../scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala | 16 ++++++++-------- 1 file 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) -- cgit v1.2.3