Skip to content

Commit ee6414a

Browse files
committed
Fix #1423: Fix owners of called methods in CollectSuperCalls.
1 parent cc21026 commit ee6414a

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

src/dotty/tools/backend/jvm/CollectSuperCalls.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dotty.tools.backend.jvm
22

3-
import dotty.tools.dotc.ast.tpd._
4-
import dotty.tools.dotc.ast.Trees
3+
import dotty.tools.dotc.ast.tpd
4+
import dotty.tools.dotc.ast.Trees._
55
import dotty.tools.dotc.core.Contexts.Context
66
import dotty.tools.dotc.core.Symbols._
77
import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, TransformerInfo}
@@ -17,14 +17,14 @@ class CollectSuperCalls extends MiniPhaseTransform {
1717

1818
def phaseName: String = "collectSuperCalls"
1919

20-
override def transformSuper(tree: Super)(implicit ctx: Context, info: TransformerInfo): Tree = {
20+
override def transformSelect(tree: tpd.Select)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = {
2121
tree match {
22-
case Trees.Super(qual: This, mix) if mix.nonEmpty =>
22+
case Select(Super(qual, mix), _) if mix.nonEmpty =>
2323
val classSymbol = qual.symbol.asClass.classSymbol
24-
registerSuperCall(classSymbol, tree.tpe.baseClasses.head)
24+
registerSuperCall(classSymbol, tree.symbol.owner.asClass)
2525
case _ =>
2626
}
27-
super.transformSuper(tree)
27+
super.transformSelect(tree)
2828
}
2929

3030
private def registerSuperCall(sym: ClassSymbol, calls: ClassSymbol)(implicit ctx: Context) = {

tests/run/i1423.check

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
3
2+
2
3+
3
4+
1
5+
0

tests/run/i1423.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class B { def m: Int = 0 }
2+
class C extends B { override def m = 4 }
3+
trait T1 extends B { override def m = 1 }
4+
trait T2 extends T1 { override def m = 2 }
5+
trait T3 extends T1 { override def m = 3 }
6+
7+
trait T4 extends T1
8+
class D extends B {
9+
def f() = println(super[B].m)
10+
}
11+
12+
object Test extends C with T2 with T3 with T4 {
13+
def main(args: Array[String]): Unit = {
14+
println(m)
15+
println(super[T2].m)
16+
println(super[T3].m)
17+
println(super[T4].m)
18+
new D().f()
19+
}
20+
}

0 commit comments

Comments
 (0)