From d1007862edf2f20a46a5395354991c63ede4abfa Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 3 Apr 2006 09:18:19 +0000 Subject: Fixed abstract override problem detected by Moez --- src/compiler/scala/tools/nsc/symtab/Symbols.scala | 2 +- src/compiler/scala/tools/nsc/transform/Mixin.scala | 2 +- test/files/run/absoverride.check | 15 +++++++++ test/files/run/absoverride.scala | 37 ++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 test/files/run/absoverride.check create mode 100755 test/files/run/absoverride.scala 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 @@ + +next: j + +log: j +j + +next: v + +log: v +v + +next: m + +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(""); val x = super.next; Console.println(""); 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 + } +} -- cgit v1.2.3