From 0a840380aa47d52d2addd2b96dbbb68b874c3a67 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 5 Sep 2016 09:55:04 +1000 Subject: 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). --- test/junit/scala/lang/traits/BytecodeTest.scala | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'test/junit/scala/lang/traits/BytecodeTest.scala') 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 @@ -276,6 +276,29 @@ class BytecodeTest extends BytecodeTesting { assert(cls.isEmpty, cls.map(_.name)) } + @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") -- cgit v1.2.3