diff options
author | Paul Phillips <paulp@improving.org> | 2012-09-14 13:08:05 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-09-14 13:08:05 -0700 |
commit | 493d16306cf0e836da9c77a4768dd42620dd1a72 (patch) | |
tree | fee4965ed7d69ca25a888875839b2f54445e7338 /src | |
parent | 261b1c785668ae42a29d9217cc4a8f305a724e2f (diff) | |
parent | e498fac7fdbda3187a2a4fffcdf7fa4f9ddb7ac8 (diff) | |
download | scala-493d16306cf0e836da9c77a4768dd42620dd1a72.tar.gz scala-493d16306cf0e836da9c77a4768dd42620dd1a72.tar.bz2 scala-493d16306cf0e836da9c77a4768dd42620dd1a72.zip |
Merge pull request #1299 from namin/si-6245
Fix for SI-6245 with workaround for SI-2296.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 63050bc032..981ba10183 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -287,16 +287,18 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT // FIXME - this should be unified with needsProtectedAccessor, but some // subtlety which presently eludes me is foiling my attempts. val shouldEnsureAccessor = ( - currentClass.isTrait + currentClass.isTrait && sym.isProtected && sym.enclClass != currentClass && !sym.owner.isTrait && (sym.owner.enclosingPackageClass != currentClass.enclosingPackageClass) - && (qual.symbol.info.member(sym.name) ne NoSymbol)) + && (qual.symbol.info.member(sym.name) ne NoSymbol) + && !needsProtectedAccessor(sym, tree.pos)) if (shouldEnsureAccessor) { log("Ensuring accessor for call to protected " + sym.fullLocationString + " from " + currentClass) ensureAccessor(sel) - } else + } + else mayNeedProtectedAccessor(sel, EmptyTree.asList, false) } @@ -525,7 +527,14 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT ) true } - isCandidate && !host.isPackageClass && !isSelfType + def isJavaProtected = host.isTrait && sym.isJavaDefined && { + restrictionError(pos, unit, + s"""|$clazz accesses protected $sym inside a concrete trait method. + |Add an accessor in a class extending ${sym.enclClass} as a workaround.""".stripMargin + ) + true + } + isCandidate && !host.isPackageClass && !isSelfType && !isJavaProtected } /** Return the innermost enclosing class C of referencingClass for which either |