diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/files/neg/choices.check | 3 | ||||
-rw-r--r-- | test/files/neg/nowarnDefaultJunitMethods.check | 6 | ||||
-rw-r--r-- | test/files/neg/nowarnDefaultJunitMethods.flags | 1 | ||||
-rw-r--r-- | test/files/neg/nowarnDefaultJunitMethods/C_1.scala | 5 | ||||
-rw-r--r-- | test/files/neg/nowarnDefaultJunitMethods/Test.java | 3 | ||||
-rw-r--r-- | test/files/run/junitForwarders/C_1.scala | 15 | ||||
-rw-r--r-- | test/files/run/junitForwarders/Test.java | 10 | ||||
-rw-r--r-- | test/junit/scala/collection/immutable/PagedSeqTest.scala | 3 | ||||
-rw-r--r-- | test/junit/scala/lang/traits/BytecodeTest.scala | 98 |
9 files changed, 119 insertions, 25 deletions
diff --git a/test/files/neg/choices.check b/test/files/neg/choices.check index df4f23461f..2449cadcd6 100644 --- a/test/files/neg/choices.check +++ b/test/files/neg/choices.check @@ -1,5 +1,4 @@ -error: Usage: -Yresolve-term-conflict:<strategy> - where <strategy> choices are package, object, error (default: error) +error: Usage: -Yresolve-term-conflict:<strategy> where <strategy> choices are package, object, error (default: error). error: bad option: '-Yresolve-term-conflict' error: bad options: -Yresolve-term-conflict error: flags file may only contain compiler options, found: -Yresolve-term-conflict diff --git a/test/files/neg/nowarnDefaultJunitMethods.check b/test/files/neg/nowarnDefaultJunitMethods.check deleted file mode 100644 index 7efdcc299a..0000000000 --- a/test/files/neg/nowarnDefaultJunitMethods.check +++ /dev/null @@ -1,6 +0,0 @@ -C_1.scala:2: warning: JUnit tests in traits that are compiled as default methods are not executed by JUnit 4. JUnit 5 will fix this issue. - @org.junit.Test def foo = 0 - ^ -error: No warnings can be incurred under -Xfatal-warnings. -one warning found -one error found diff --git a/test/files/neg/nowarnDefaultJunitMethods.flags b/test/files/neg/nowarnDefaultJunitMethods.flags deleted file mode 100644 index 85d8eb2ba2..0000000000 --- a/test/files/neg/nowarnDefaultJunitMethods.flags +++ /dev/null @@ -1 +0,0 @@ --Xfatal-warnings diff --git a/test/files/neg/nowarnDefaultJunitMethods/C_1.scala b/test/files/neg/nowarnDefaultJunitMethods/C_1.scala deleted file mode 100644 index e2565a48bc..0000000000 --- a/test/files/neg/nowarnDefaultJunitMethods/C_1.scala +++ /dev/null @@ -1,5 +0,0 @@ -trait T { - @org.junit.Test def foo = 0 -} - -class C extends T diff --git a/test/files/neg/nowarnDefaultJunitMethods/Test.java b/test/files/neg/nowarnDefaultJunitMethods/Test.java deleted file mode 100644 index e8d64c2cc8..0000000000 --- a/test/files/neg/nowarnDefaultJunitMethods/Test.java +++ /dev/null @@ -1,3 +0,0 @@ -package org.junit; - -public @interface Test { } diff --git a/test/files/run/junitForwarders/C_1.scala b/test/files/run/junitForwarders/C_1.scala new file mode 100644 index 0000000000..2af2026a61 --- /dev/null +++ b/test/files/run/junitForwarders/C_1.scala @@ -0,0 +1,15 @@ +trait T { + @org.junit.Test def foo = 0 +} + +class C extends T + +object Test extends App { + def check(c: Class[_], e: String) = { + val s = c.getDeclaredMethods.sortBy(_.getName).map(m => s"${m.getName} - ${m.getDeclaredAnnotations.mkString(", ")}").mkString(";") + assert(s == e, s"found: $s\nexpected: $e") + } + check(classOf[C], "foo - @org.junit.Test()") + // TODO scala-dev#213: should `foo$` really carry the @Test annotation? + check(classOf[T], "$init$ - ;foo - @org.junit.Test();foo$ - @org.junit.Test()") +} diff --git a/test/files/run/junitForwarders/Test.java b/test/files/run/junitForwarders/Test.java new file mode 100644 index 0000000000..57c4d5b544 --- /dev/null +++ b/test/files/run/junitForwarders/Test.java @@ -0,0 +1,10 @@ +package org.junit; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Test { } diff --git a/test/junit/scala/collection/immutable/PagedSeqTest.scala b/test/junit/scala/collection/immutable/PagedSeqTest.scala index 74f8825307..6c974db884 100644 --- a/test/junit/scala/collection/immutable/PagedSeqTest.scala +++ b/test/junit/scala/collection/immutable/PagedSeqTest.scala @@ -2,13 +2,14 @@ package scala.collection.immutable import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import org.junit.Test +import org.junit.{Ignore, Test} import org.junit.Assert._ @RunWith(classOf[JUnit4]) class PagedSeqTest { // should not NPE, and should equal the given Seq @Test + @Ignore("This tests a non-stack safe method in a deprecated class that requires ~1.5M stack, disabling") def test_SI6615(): Unit = { assertEquals(Seq('a'), PagedSeq.fromStrings(List.fill(5000)("a")).slice(4096, 4097)) } diff --git a/test/junit/scala/lang/traits/BytecodeTest.scala b/test/junit/scala/lang/traits/BytecodeTest.scala index e6c74b86ab..7bfa3362d4 100644 --- a/test/junit/scala/lang/traits/BytecodeTest.scala +++ b/test/junit/scala/lang/traits/BytecodeTest.scala @@ -9,7 +9,6 @@ import scala.collection.JavaConverters._ import scala.tools.asm.Opcodes import scala.tools.asm.Opcodes._ import scala.tools.asm.tree.ClassNode -import scala.tools.nsc.backend.jvm.opt.BytecodeUtils import scala.tools.partest.ASMConverters._ import scala.tools.testing.BytecodeTesting import scala.tools.testing.BytecodeTesting._ @@ -237,7 +236,7 @@ class BytecodeTest extends BytecodeTesting { |class C extends T """.stripMargin val List(c1, _) = compileClasses(code) - val List(c2, _) = newCompiler(extraArgs = "-Xgen-mixin-forwarders").compileClasses(code) + val List(c2, _) = newCompiler(extraArgs = "-Xmixin-force-forwarders:true").compileClasses(code) assert(getMethods(c1, "f").isEmpty) assertSameCode(getMethod(c2, "f"), List(VarOp(ALOAD, 0), Invoke(INVOKESTATIC, "T", "f$", "(LT;)I", true), Op(IRETURN))) @@ -245,7 +244,6 @@ class BytecodeTest extends BytecodeTesting { @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 } @@ -254,10 +252,96 @@ class BytecodeTest extends BytecodeTesting { | 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))) + + val err = + """cannot emit super call: the selected method m is declared in class A, which is not the direct superclass of class C. + |An unqualified super call (super.m) would be allowed.""".stripMargin + val cls = compileClasses(code, allowMessage = _.msg contains err) + assert(cls.isEmpty, cls.map(_.name)) + } + + @Test + def sd143b(): Unit = { + val jCode = List("interface A { default int m() { return 1; } }" -> "A.java") + val code = + """class B extends A { override def m = 2 } + |trait T extends A + |class C extends B with T { + | override def m = super[T].m + |} + """.stripMargin + + val err = "unable to emit super call unless interface A (which declares method m) is directly extended by class C" + val cls = compileClasses(code, jCode, allowMessage = _.msg contains err) + assert(cls.isEmpty, cls.map(_.name)) + } + + @Test + def sd210(): Unit = { + val forwardersCompiler = newCompiler(extraArgs = "-Xmixin-force-forwarders:true") + val jCode = List("interface A { default int m() { return 1; } }" -> "A.java") + + + // used to crash in the backend (SD-210) under `-Xmixin-force-forwarders:true` + val code1 = + """trait B1 extends A // called "B1" not "B" due to scala-dev#214 + |class C extends B1 + """.stripMargin + + val List(_, c1a) = compileClasses(code1, jCode) + assert(getAsmMethods(c1a, "m").isEmpty) // ok, no forwarder + + // here we test a warning. without `-Xmixin-force-forwarders:true`, the forwarder would not be + // generated, it is not necessary for correctness. + val warn = "Unable to implement a mixin forwarder for method m in class C unless interface A is directly extended by class C" + val List(_, c1b) = forwardersCompiler.compileClasses(code1, jCode, allowMessage = _.msg.contains(warn)) + assert(getAsmMethods(c1a, "m").isEmpty) // no forwarder + + + val code2 = + """abstract class B { def m(): Int } + |trait T extends B with A + |class C extends T + """.stripMargin + + // here we test a compilation error. the forwarder is required for correctness, but it cannot be generated. + val err = "Unable to implement a mixin forwarder for method m in class C unless interface A is directly extended by class C" + val cs = compileClasses(code2, jCode, allowMessage = _.msg contains err) + assert(cs.isEmpty, cs.map(_.name)) + + + val code3 = + """abstract class B { def m: Int } + |class C extends B with A + """.stripMargin + + val List(_, c3) = compileClasses(code3, jCode) + // invokespecial to A.m is correct here: A is an interface, so resolution starts at A. + // https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokespecial + val ins3 = getMethod(c3, "m").instructions + assert(ins3 contains Invoke(INVOKESPECIAL, "A", "m", "()I", true), ins3.stringLines) + + + val code4 = + """trait B { self: A => override def m = 2 } + |class C extends A with B // forwarder, invokestatic B.m$ + """.stripMargin + + val List(_, c4) = compileClasses(code4, jCode) + val ins4 = getMethod(c4, "m").instructions + assert(ins4 contains Invoke(INVOKESTATIC, "B", "m$", "(LB;)I", true), ins4.stringLines) + + + // scala-only example + val code5 = + """trait AS { def m = 1 } + |abstract class B { def m: Int } + |class C extends B with AS // forwarder, invokestatic AS.m$ + """.stripMargin + + val List(_, _, c5) = compileClasses(code5) + val ins5 = getMethod(c5, "m").instructions + assert(ins5 contains Invoke(INVOKESTATIC, "AS", "m$", "(LAS;)I", true), ins5.stringLines) } } |