aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/backend/jvm/CollectSuperCalls.scala15
-rw-r--r--tests/run/i1423.check5
-rw-r--r--tests/run/i1423.scala20
3 files changed, 33 insertions, 7 deletions
diff --git a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala
index d19228364..8f9b067ba 100644
--- a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala
+++ b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala
@@ -1,7 +1,7 @@
package dotty.tools.backend.jvm
-import dotty.tools.dotc.ast.tpd._
-import dotty.tools.dotc.ast.Trees
+import dotty.tools.dotc.ast.tpd
+import dotty.tools.dotc.ast.Trees._
import dotty.tools.dotc.core.Contexts.Context
import dotty.tools.dotc.core.Symbols._
import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, TransformerInfo}
@@ -14,17 +14,18 @@ import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, Transforme
* the redundant mixin class could be required as a parent by the JVM.
*/
class CollectSuperCalls extends MiniPhaseTransform {
+ import tpd._
def phaseName: String = "collectSuperCalls"
- override def transformSuper(tree: Super)(implicit ctx: Context, info: TransformerInfo): Tree = {
- tree match {
- case Trees.Super(qual: This, mix) if mix.nonEmpty =>
+ override def transformSelect(tree: Select)(implicit ctx: Context, info: TransformerInfo): Tree = {
+ tree.qualifier match {
+ case Super(qual: This, mix) if mix.nonEmpty =>
val classSymbol = qual.symbol.asClass.classSymbol
- registerSuperCall(classSymbol, tree.tpe.baseClasses.head)
+ registerSuperCall(classSymbol, tree.symbol.owner.asClass)
case _ =>
}
- super.transformSuper(tree)
+ tree
}
private def registerSuperCall(sym: ClassSymbol, calls: ClassSymbol)(implicit ctx: Context) = {
diff --git a/tests/run/i1423.check b/tests/run/i1423.check
new file mode 100644
index 000000000..a6a795856
--- /dev/null
+++ b/tests/run/i1423.check
@@ -0,0 +1,5 @@
+3
+2
+3
+1
+0
diff --git a/tests/run/i1423.scala b/tests/run/i1423.scala
new file mode 100644
index 000000000..a7091c114
--- /dev/null
+++ b/tests/run/i1423.scala
@@ -0,0 +1,20 @@
+class B { def m: Int = 0 }
+class C extends B { override def m = 4 }
+trait T1 extends B { override def m = 1 }
+trait T2 extends T1 { override def m = 2 }
+trait T3 extends T1 { override def m = 3 }
+
+trait T4 extends T1
+class D extends B {
+ def f() = println(super[B].m)
+}
+
+object Test extends C with T2 with T3 with T4 {
+ def main(args: Array[String]): Unit = {
+ println(m)
+ println(super[T2].m)
+ println(super[T3].m)
+ println(super[T4].m)
+ new D().f()
+ }
+}