diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Symbols.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Mixin.scala | 2 | ||||
-rw-r--r-- | test/files/run/absoverride.check | 15 | ||||
-rwxr-xr-x | test/files/run/absoverride.scala | 37 |
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 + } +} |