summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-05-30 18:00:25 +0000
committerMartin Odersky <odersky@gmail.com>2008-05-30 18:00:25 +0000
commit562647a37a6675fbf328f72e081a7f88913dd004 (patch)
tree36a8f00923e6991bf483af901f34ec31763111e0 /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
parentb6281cd5a72fa31356020fab3929c6e0f4ad578f (diff)
downloadscala-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.scala8
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)+