summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-04-03 09:18:19 +0000
committerMartin Odersky <odersky@gmail.com>2006-04-03 09:18:19 +0000
commitd1007862edf2f20a46a5395354991c63ede4abfa (patch)
treef5f2453236cc476f1bb65111ad97e9c52ac679cd
parent2b8d5f6485faec89410678834d25cce9656a7232 (diff)
downloadscala-d1007862edf2f20a46a5395354991c63ede4abfa.tar.gz
scala-d1007862edf2f20a46a5395354991c63ede4abfa.tar.bz2
scala-d1007862edf2f20a46a5395354991c63ede4abfa.zip
Fixed abstract override problem detected by Moez
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala2
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala2
-rw-r--r--test/files/run/absoverride.check15
-rwxr-xr-xtest/files/run/absoverride.scala37
4 files changed, 54 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index bf2685d466..112294ead3 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -620,7 +620,7 @@ trait Symbols requires SymbolTable {
* @param site The base type from which member types are computed
*/
final def matchingSymbol(ofclazz: Symbol, site: Type): Symbol =
- ofclazz.info.nonPrivateDecl(name).suchThat(sym =>
+ ofclazz.info.nonPrivateDecl(name).filter(sym =>
!sym.isTerm || (site.memberType(this) matches site.memberType(sym)));
/** The symbol overridden by this symbol in given class `ofclazz' */
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index a52ff1e5f5..c7f9f775fd 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -49,7 +49,7 @@ abstract class Mixin extends InfoTransform {
val other = bcs.head.info.nonPrivateDecl(member.name);
log("rebindsuper " + bcs.head + " " + other + " " + other.tpe + " " + other.hasFlag(DEFERRED));
}
- sym = member.overridingSymbol(bcs.head).suchThat(sym => !sym.hasFlag(DEFERRED));
+ sym = member.overridingSymbol(bcs.head).suchThat(sym => !sym.hasFlag(DEFERRED | BRIDGE));
bcs = bcs.tail
}
assert(sym != NoSymbol, member);
diff --git a/test/files/run/absoverride.check b/test/files/run/absoverride.check
new file mode 100644
index 0000000000..0f4a2b9d5f
--- /dev/null
+++ b/test/files/run/absoverride.check
@@ -0,0 +1,15 @@
+<sync>
+next: j
+</sync>
+log: j
+j
+<sync>
+next: v
+</sync>
+log: v
+v
+<sync>
+next: m
+</sync>
+log: m
+m
diff --git a/test/files/run/absoverride.scala b/test/files/run/absoverride.scala
new file mode 100755
index 0000000000..cf14ff475b
--- /dev/null
+++ b/test/files/run/absoverride.scala
@@ -0,0 +1,37 @@
+abstract class AbsIterator {
+ type T
+ def hasNext: boolean
+ def next: T
+}
+trait RichIterator extends AbsIterator {
+ def foreach(f: T => unit): unit =
+ while (hasNext) f(next)
+}
+class StringIterator(s: String) extends AbsIterator {
+ type T = char
+ private var i = 0
+ def hasNext = i < s.length()
+ def next = { val x = s.charAt(i); i = i + 1; Console.println("next: " + x); x }
+}
+trait SyncIterator extends AbsIterator {
+ abstract override def hasNext: boolean =
+ synchronized(super.hasNext)
+ abstract override def next: T =
+ synchronized {
+ Console.println("<sync>"); val x = super.next; Console.println("</sync>"); x
+ }
+}
+trait LoggedIterator extends AbsIterator {
+ abstract override def next: T = {
+ val x = super.next; Console.println("log: " + x); x
+ }
+}
+class Iter2(s: String) extends StringIterator(s)
+ with SyncIterator with LoggedIterator;
+object Test {
+ def main(args: Array[String]): unit = {
+ class Iter extends StringIterator(args(0)) with RichIterator with SyncIterator with LoggedIterator
+ val iter = new Iter
+ iter foreach Console.println
+ }
+}