summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala14
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
}