diff --git a/compiler/src/dotty/tools/dotc/transform/Erasure.scala b/compiler/src/dotty/tools/dotc/transform/Erasure.scala index 71ecb5c65cc7..6af956a6d029 100644 --- a/compiler/src/dotty/tools/dotc/transform/Erasure.scala +++ b/compiler/src/dotty/tools/dotc/transform/Erasure.scala @@ -600,6 +600,7 @@ object Erasure extends TypeTestsCasts{ // this implementation doesn't check for bridge clashes with value types! def addBridges(oldStats: List[untpd.Tree], newStats: List[tpd.Tree])(implicit ctx: Context): List[tpd.Tree] = { val beforeCtx = ctx.withPhase(ctx.erasurePhase) + val afterCtx = ctx.withPhase(ctx.elimErasedValueTypePhase.next) def traverse(after: List[Tree], before: List[untpd.Tree], emittedBridges: ListBuffer[tpd.DefDef] = ListBuffer[tpd.DefDef]()): List[tpd.DefDef] = { after match { @@ -613,7 +614,7 @@ object Erasure extends TypeTestsCasts{ val newSymbol = member.symbol(ctx) assert(oldSymbol.name(beforeCtx) == newSymbol.name, s"${oldSymbol.name(beforeCtx)} bridging with ${newSymbol.name}") - val newOverridden = oldSymbol.denot.allOverriddenSymbols.toSet // TODO: clarify new <-> old in a comment; symbols are swapped here + val newOverridden = oldSymbol.denot.allOverriddenSymbols(afterCtx).toSet // TODO: clarify new <-> old in a comment; symbols are swapped here val oldOverridden = newSymbol.allOverriddenSymbols(beforeCtx).toSet // TODO: can we find a more efficient impl? newOverridden does not have to be a set! def stillInBaseClass(sym: Symbol) = ctx.owner derivesFrom sym.owner val neededBridges = (oldOverridden -- newOverridden).filter(stillInBaseClass) diff --git a/tests/run/iarray.scala b/tests/run/iarray.scala new file mode 100644 index 000000000000..d91bc71365ff --- /dev/null +++ b/tests/run/iarray.scala @@ -0,0 +1,20 @@ +import scala.reflect.ClassTag + +class Arr[T](private val underlying: scala.Array[T]) extends AnyVal { + def toList = underlying.toList +} + +trait SeqMonoTransforms[+A, +Repr] extends Any { + protected[this] def fromIterableWithSameElemType(): Repr +} + +class ArrOps[A](val xs: Arr[A]) extends AnyRef with SeqMonoTransforms[A, Arr[A]] { + def fromIterableWithSameElemType(): Arr[A] = xs +} + +object Test { + def main(args: Array[String]) = + assert(new ArrOps(new Arr(Array(1, 2, 3))).fromIterableWithSameElemType.toList == + List(1, 2, 3)) +} +