diff options
author | Martin Odersky <odersky@gmail.com> | 2008-05-30 18:00:25 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2008-05-30 18:00:25 +0000 |
commit | 562647a37a6675fbf328f72e081a7f88913dd004 (patch) | |
tree | 36a8f00923e6991bf483af901f34ec31763111e0 /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | |
parent | b6281cd5a72fa31356020fab3929c6e0f4ad578f (diff) | |
download | scala-562647a37a6675fbf328f72e081a7f88913dd004.tar.gz scala-562647a37a6675fbf328f72e081a7f88913dd004.tar.bz2 scala-562647a37a6675fbf328f72e081a7f88913dd004.zip |
fixed #807. More stuff for virtual classes.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 46b84f4ac1..c8dad51275 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -93,6 +93,9 @@ abstract class RefChecks extends InfoTransform { val self = clazz.thisType + def isAbstractTypeForVirtual(sym: Symbol) = // (part of DEVIRTUALIZE) + sym.isAbstractType && sym.hasFlag(SYNTHETIC) + def infoString(sym: Symbol) = { val sym1 = analyzer.underlying(sym) sym1.toString() + @@ -173,7 +176,7 @@ abstract class RefChecks extends InfoTransform { overrideAccessError() } else if (other hasFlag FINAL) { // (1.2) overrideError("cannot override final member"); - } else if (!other.isDeferred && !(member hasFlag (OVERRIDE | ABSOVERRIDE))) { // (1.3) + } else if (!other.isDeferred && !(member hasFlag (OVERRIDE | ABSOVERRIDE | SYNTHETIC))) { // (1.3), SYNTHETIC because of DEVIRTUALIZE overrideError("needs `override' modifier"); } else if ((other hasFlag ABSOVERRIDE) && other.isIncompleteIn(clazz) && !(member hasFlag ABSOVERRIDE)) { overrideError("needs `abstract override' modifiers") @@ -262,6 +265,7 @@ abstract class RefChecks extends InfoTransform { }) for (val member <- clazz.tpe.nonPrivateMembers) if (member.isDeferred && !(clazz hasFlag ABSTRACT) && + !isAbstractTypeForVirtual(member) && !((member hasFlag JAVA) && javaErasedOverridingSym(member) != NoSymbol)) { abstractClassError( false, infoString(member) + " is not defined" + analyzer.varNotice(member)) @@ -283,7 +287,7 @@ abstract class RefChecks extends InfoTransform { // (3) is violated but not (2). def checkNoAbstractDecls(bc: Symbol) { for (val decl <- bc.info.decls.elements) { - if (decl.isDeferred) { + if (decl.isDeferred && !isAbstractTypeForVirtual(decl)) { val impl = decl.matchingSymbol(clazz.thisType) if (impl == NoSymbol || (decl.owner isSubClass impl.owner)) { abstractClassError(false, "there is a deferred declaration of "+infoString(decl)+ |