summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-06-24 03:00:56 -0700
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-06-24 03:00:56 -0700
commit54c92ca7abe56e9f8947c9d64e72a90ea76c9b86 (patch)
treecbe44377cb8a22df249de042f782f64dcc315509 /src
parente0761b4dcbbc3bcbebc6392faa91bf239d247ca0 (diff)
parent72ee06de4cc0b8c12acf07c892302a3043a1e578 (diff)
downloadscala-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.scala8
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