summaryrefslogtreecommitdiff
path: root/test/junit/scala/lang/traits/BytecodeTest.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-09-05 09:55:04 +1000
committerLukas Rytz <lukas.rytz@gmail.com>2016-09-05 22:47:47 +0200
commit0a840380aa47d52d2addd2b96dbbb68b874c3a67 (patch)
tree04052ca7a13877ed8d38a3b84960567a0f8d7cef /test/junit/scala/lang/traits/BytecodeTest.scala
parentd29df860e5b10181f6c37bde3bd7539bdc843e0d (diff)
downloadscala-0a840380aa47d52d2addd2b96dbbb68b874c3a67.tar.gz
scala-0a840380aa47d52d2addd2b96dbbb68b874c3a67.tar.bz2
scala-0a840380aa47d52d2addd2b96dbbb68b874c3a67.zip
SD-143 allow super calls to methods defined in indirect super classes
The restriction for super calls to methods defined in indirect super classes introduced in a980fde was over-restrictive. In particular, it ruled out a valid code pattern to select a method from a superclass when an unqualified `super` would resolve to an override defined in a trait (example in the commit as a test).
Diffstat (limited to 'test/junit/scala/lang/traits/BytecodeTest.scala')
-rw-r--r--test/junit/scala/lang/traits/BytecodeTest.scala23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/junit/scala/lang/traits/BytecodeTest.scala b/test/junit/scala/lang/traits/BytecodeTest.scala
index 7bfa3362d4..cf658288c4 100644
--- a/test/junit/scala/lang/traits/BytecodeTest.scala
+++ b/test/junit/scala/lang/traits/BytecodeTest.scala
@@ -277,6 +277,29 @@ class BytecodeTest extends BytecodeTesting {
}
@Test
+ def sd143c(): Unit = {
+ // Allow super calls to class methods of indirect super classes
+ val code =
+ """class A { def f = 1 }
+ |class B extends A
+ |trait T extends A { override def f = 2 }
+ |class C extends B with T {
+ | def t1 = super[B].f
+ | def t2 = super.f
+ | def t3 = super[T].f
+ |}
+ """.stripMargin
+ val List(_, _, c, _) = compileClasses(code)
+ val t1 = getInstructions(c, "t1")
+ assert(t1 contains Invoke(INVOKESPECIAL, "A", "f", "()I", false), t1.stringLines)
+ val t2 = getInstructions(c, "t2")
+ val invStat = Invoke(INVOKESTATIC, "T", "f$", "(LT;)I", true)
+ assert(t2 contains invStat, t2.stringLines)
+ val t3 = getInstructions(c, "t3")
+ assert(t3 contains invStat, t3.stringLines)
+ }
+
+ @Test
def sd210(): Unit = {
val forwardersCompiler = newCompiler(extraArgs = "-Xmixin-force-forwarders:true")
val jCode = List("interface A { default int m() { return 1; } }" -> "A.java")