Skip to content

Commit 56eefb0

Browse files
committed
Fix #2202: Check bridge clash in super classes.
1 parent d514638 commit 56eefb0

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

compiler/src/dotty/tools/dotc/transform/Erasure.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -626,17 +626,19 @@ object Erasure extends TypeTestsCasts{
626626

627627
if (isRequired) {
628628
// check for clashes
629-
val clash: Option[Symbol] = oldSymbol.owner.info.decls.lookupAll(bridge.name).find {
630-
sym =>
631-
(sym.name eq bridge.name) && sym.info.widen =:= bridge.info.widen
632-
}.orElse(
633-
emittedBridges.find(stat => (stat.name == bridge.name) && stat.tpe.widen =:= bridge.info.widen)
629+
val clash: Option[Symbol] = oldSymbol.owner.info.memberExcluding(bridge.name, Flags.Bridge).alternatives.find {
630+
denot => {
631+
!denot.symbol.owner.is(Flags.Trait) && (denot.symbol.owner ne defn.ObjectClass) &&
632+
!denot.symbol.owner.derivesFrom(bridge.owner) && denot.symbol.info.widen =:= bridge.info.widen
633+
}
634+
}.map(_.symbol).orElse(
635+
emittedBridges.find(stat => (stat.name eq bridge.name) && stat.tpe.widen =:= bridge.info.widen)
634636
.map(_.symbol))
635637
clash match {
636638
case Some(cl) =>
637639
ctx.error(i"bridge for method ${newSymbol.showLocated(beforeCtx)} of type ${newSymbol.info(beforeCtx)}\n" +
638640
i"clashes with ${cl.symbol.showLocated(beforeCtx)} of type ${cl.symbol.info(beforeCtx)}\n" +
639-
i"both have same type after erasure: ${bridge.symbol.info}")
641+
i"both have same type after erasure: ${bridge.symbol.info}", newSymbol.pos)
640642
case None => minimalSet += bridge
641643
}
642644
}

tests/neg/i2202.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
class A {
3+
def compareTo(o: Any): Int = 0
4+
}
5+
class B extends A with Comparable[B] {
6+
def compareTo(b: B): Int = 0 // error
7+
}
8+
object C {
9+
def main(args: Array[String]): Unit = {
10+
println(new B().compareTo(new Object()))
11+
}
12+
}

0 commit comments

Comments
 (0)