diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-07-15 10:19:42 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-07-23 15:02:25 +0200 |
commit | 3b6b2bfe9fdd7995bf9f90a5fafc30613a101179 (patch) | |
tree | 096cd00e685837f461bc64ea9fd3a17042d49e95 /src/compiler | |
parent | 091c1e6ed8254fbd75a21843e2b9d331cbabf9d8 (diff) | |
download | scala-3b6b2bfe9fdd7995bf9f90a5fafc30613a101179.tar.gz scala-3b6b2bfe9fdd7995bf9f90a5fafc30613a101179.tar.bz2 scala-3b6b2bfe9fdd7995bf9f90a5fafc30613a101179.zip |
[backport] 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.scala | 16 |
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) |