summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2016-07-15 12:17:52 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2016-07-15 12:33:22 +0200
commita0590aa9ba45e83c8c8d496b8ab132966b1a7a95 (patch)
tree5cef800cac09f4ccb7d0188ef804ce0615e94f3b /test
parent3c43a7bc389eba0d7d52ef0d0cdb19812c4a8a0f (diff)
downloadscala-a0590aa9ba45e83c8c8d496b8ab132966b1a7a95.tar.gz
scala-a0590aa9ba45e83c8c8d496b8ab132966b1a7a95.tar.bz2
scala-a0590aa9ba45e83c8c8d496b8ab132966b1a7a95.zip
SD-182 compiler option -Xgen-mixin-forwarders
Introduce a compiler option -Xgen-mixin-forwarders to always generate mixin forwarder methods.
Diffstat (limited to 'test')
-rw-r--r--test/junit/scala/lang/traits/BytecodeTest.scala29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/junit/scala/lang/traits/BytecodeTest.scala b/test/junit/scala/lang/traits/BytecodeTest.scala
index ec8508df99..e6c74b86ab 100644
--- a/test/junit/scala/lang/traits/BytecodeTest.scala
+++ b/test/junit/scala/lang/traits/BytecodeTest.scala
@@ -230,6 +230,35 @@ class BytecodeTest extends BytecodeTesting {
List(ALOAD, ILOAD, PUTFIELD, ALOAD, ACONST_NULL, "<init>", RETURN))
}
+ @Test
+ def mixinForwarders(): Unit = {
+ val code =
+ """trait T { def f = 1 }
+ |class C extends T
+ """.stripMargin
+ val List(c1, _) = compileClasses(code)
+ val List(c2, _) = newCompiler(extraArgs = "-Xgen-mixin-forwarders").compileClasses(code)
+ assert(getMethods(c1, "f").isEmpty)
+ assertSameCode(getMethod(c2, "f"),
+ List(VarOp(ALOAD, 0), Invoke(INVOKESTATIC, "T", "f$", "(LT;)I", true), Op(IRETURN)))
+ }
+
+ @Test
+ def sd143(): Unit = {
+ // this tests the status quo, which is wrong.
+ val code =
+ """class A { def m = 1 }
+ |class B extends A { override def m = 2 }
+ |trait T extends A
+ |class C extends B with T {
+ | override def m = super[T].m // should invoke A.m
+ |}
+ """.stripMargin
+ val List(_, _, c, _) = compileClasses(code)
+ // even though the bytecode refers to A.m, invokespecial will resolve to B.m
+ assertSameCode(getMethod(c, "m"),
+ List(VarOp(ALOAD, 0), Invoke(INVOKESPECIAL, "A", "m", "()I", false), Op(IRETURN)))
+ }
}
object invocationReceiversTestCode {