diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-06-24 03:00:56 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-06-24 03:00:56 -0700 |
commit | 54c92ca7abe56e9f8947c9d64e72a90ea76c9b86 (patch) | |
tree | cbe44377cb8a22df249de042f782f64dcc315509 /src | |
parent | e0761b4dcbbc3bcbebc6392faa91bf239d247ca0 (diff) | |
parent | 72ee06de4cc0b8c12acf07c892302a3043a1e578 (diff) | |
download | scala-54c92ca7abe56e9f8947c9d64e72a90ea76c9b86.tar.gz scala-54c92ca7abe56e9f8947c9d64e72a90ea76c9b86.tar.bz2 scala-54c92ca7abe56e9f8947c9d64e72a90ea76c9b86.zip |
Merge pull request #733 from retronym/ticket/4989-3
SI-4989 Reject super.x if an intermediate class declares x abstract.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index daae69590f..f67cec730b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -124,7 +124,15 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT !(member.isAbstractOverride && member.isIncompleteIn(clazz))) unit.error(sel.pos, ""+sym.fullLocationString+" is accessed from super. It may not be abstract "+ "unless it is overridden by a member declared `abstract' and `override'"); + } else if (mix == tpnme.EMPTY && !sym.owner.isTrait){ + // SI-4989 Check if an intermediate class between `clazz` and `sym.owner` redeclares the method as abstract. + val intermediateClasses = clazz.info.baseClasses.tail.takeWhile(_ != sym.owner) + intermediateClasses.map(sym.overridingSymbol).find(s => s.isDeferred && !s.isAbstractOverride && !s.owner.isTrait).foreach { + absSym => + unit.error(sel.pos, s"${sym.fullLocationString} cannot be directly accessed from ${clazz} because ${absSym.owner} redeclares it as abstract") + } } + if (name.isTermName && mix == tpnme.EMPTY && (clazz.isTrait || clazz != currentClass || !validCurrentOwner)) ensureAccessor(sel) else sel |