diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index fabf2ed063..0c3ac481ed 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -411,10 +411,15 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT unit.error(pos, "Implementation restriction: " + msg) } + def accessibleThroughSubclassing: Boolean = + (validCurrentOwner + && currentOwner.enclClass.thisSym.isSubClass(sym.owner) + && !currentOwner.enclClass.isTrait) + val res = /* settings.debug.value && */ ((sym hasFlag PROTECTED) && !sym.owner.isPackageClass - && (!validCurrentOwner || !(currentOwner.enclClass.thisSym isSubClass sym.owner)) + && !accessibleThroughSubclassing && (enclPackage(sym.owner) != enclPackage(currentOwner)) && (enclPackage(sym.owner) == enclPackage(sym.accessBoundary(sym.owner)))) @@ -424,9 +429,12 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT if (host.isPackageClass) false else if (host.thisSym != host) { if (host.thisSym.tpe.typeSymbol.hasFlag(JAVA)) - errorRestriction(currentOwner.enclClass + " accesses protected " + sym - + " from self type " + host.thisSym.tpe) + errorRestriction("%s accesses protected %s from self type %s.".format(currentOwner.enclClass, sym, host.thisSym.tpe)) false + } else if (host.isTrait && sym.hasFlag(JAVA)) { + errorRestriction(("%s accesses protected %s inside a concrete trait method. " + + "Add an accessor in a class extending %s to work around this bug.").format(currentOwner.enclClass, sym, sym.enclClass)) + false } else res } else res } |