diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2016-09-05 09:55:04 +1000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-09-05 22:47:47 +0200 |
commit | 0a840380aa47d52d2addd2b96dbbb68b874c3a67 (patch) | |
tree | 04052ca7a13877ed8d38a3b84960567a0f8d7cef /test | |
parent | d29df860e5b10181f6c37bde3bd7539bdc843e0d (diff) | |
download | scala-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')
-rw-r--r-- | test/junit/scala/lang/traits/BytecodeTest.scala | 23 |
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") |