diff options
author | Martin Odersky <odersky@gmail.com> | 2009-11-15 13:56:21 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-11-15 13:56:21 +0000 |
commit | 0c373e49859b872e339a3e86216d0f2d7c471454 (patch) | |
tree | b53f6b446e88bb1f30c30141f0c686bf201728d1 /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | |
parent | c43f01c39d029be1a82c78bb2f49da5eb6833ab5 (diff) | |
download | scala-0c373e49859b872e339a3e86216d0f2d7c471454.tar.gz scala-0c373e49859b872e339a3e86216d0f2d7c471454.tar.bz2 scala-0c373e49859b872e339a3e86216d0f2d7c471454.zip |
Fixed #1459
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index d5187a4564..522a03d91d 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -401,9 +401,7 @@ abstract class RefChecks extends InfoTransform { else clazz.toString() + " needs to be abstract") + ", since " + msg); clazz.setFlag(ABSTRACT) } - // Find a concrete Java method that overrides `sym' under the erasure model. - // Bridge symbols qualify. - // Used as a fall back if no overriding symbol of a Java abstract method can be found + def javaErasedOverridingSym(sym: Symbol): Symbol = clazz.tpe.nonPrivateMemberAdmitting(sym.name, BRIDGE).filter(other => !other.isDeferred && @@ -413,10 +411,12 @@ abstract class RefChecks extends InfoTransform { atPhase(currentRun.erasurePhase.next)(tp1 matches tp2) }) + def ignoreDeferred(member: Symbol) = + isAbstractTypeWithoutFBound(member) || + ((member hasFlag JAVA) && javaErasedOverridingSym(member) != NoSymbol) + for (member <- clazz.tpe.nonPrivateMembersAdmitting(VBRIDGE)) - if (member.isDeferred && !(clazz hasFlag ABSTRACT) && - !isAbstractTypeWithoutFBound(member) && - !((member hasFlag JAVA) && javaErasedOverridingSym(member) != NoSymbol)) { + if (member.isDeferred && !(clazz hasFlag ABSTRACT) && !ignoreDeferred(member)) { abstractClassError( false, infoString(member) + " is not defined" + analyzer.varNotice(member)) } else if ((member hasFlag ABSOVERRIDE) && member.isIncompleteIn(clazz)) { @@ -438,8 +438,8 @@ abstract class RefChecks extends InfoTransform { // (3) is violated but not (2). def checkNoAbstractDecls(bc: Symbol) { for (decl <- bc.info.decls.iterator) { - if (decl.isDeferred && !isAbstractTypeWithoutFBound(decl)) { - val impl = decl.matchingSymbol(clazz.thisType) + if (decl.isDeferred && !ignoreDeferred(decl)) { + val impl = decl.matchingSymbol(clazz.thisType, admit = VBRIDGE) if (impl == NoSymbol || (decl.owner isSubClass impl.owner)) { abstractClassError(false, "there is a deferred declaration of "+infoString(decl)+ " which is not implemented in a subclass"+analyzer.varNotice(decl)) |