diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index ce16facf77..1276d62995 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -1042,18 +1042,27 @@ abstract class Erasure extends AddInterfaces assert(overridden != NoSymbol, tree.symbol) tree.symbol = overridden } + def isAccessible(sym: Symbol) = localTyper.context.isAccessible(sym, sym.owner.thisType) if (!isAccessible(owner) && qual.tpe != null) { - // Todo: Figure out how qual.tpe could be null in the check above (it does appear in build where SwingWorker.this - // has a null type). - val qualSym = qual.tpe.widen.typeSymbol - if (isAccessible(qualSym) && !qualSym.isPackageClass && !qualSym.isPackageObjectClass) { - // insert cast to prevent illegal access error (see #4283) - // util.trace("insert erasure cast ") (*/ - treeCopy.Select(tree, gen.mkAttributedCast(qual, qual.tpe.widen), name) //) - } else tree + qual match { + case Super(_, _) => + // Insert a cast here at your peril -- see SI-5162. Bail out if the target method is defined in + // Java, otherwise, we'd get an IllegalAccessError at runtime. If the target method is defined in + // Scala, however, we should have access. + if (owner.isJavaDefined) unit.error(tree.pos, s"Unable to access ${tree.symbol.fullLocationString} with a super reference.") + tree + case _ => + // Todo: Figure out how qual.tpe could be null in the check above (it does appear in build where SwingWorker.this + // has a null type). + val qualSym = qual.tpe.widen.typeSymbol + if (isAccessible(qualSym) && !qualSym.isPackageClass && !qualSym.isPackageObjectClass) { + // insert cast to prevent illegal access error (see #4283) + // util.trace("insert erasure cast ") (*/ + treeCopy.Select(tree, gen.mkAttributedCast(qual, qual.tpe.widen), name) //) + } else tree + } } else tree - case Template(parents, self, body) => assert(!currentOwner.isImplClass) //Console.println("checking no dble defs " + tree)//DEBUG |