summaryrefslogtreecommitdiff
path: root/test/files/run/t9268/Test.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-04-21 11:52:39 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-04-21 12:02:36 +1000
commitc51080b78385402c941e5280d1740406ea8702d0 (patch)
tree7ddf795eca3644d17576e62bc2aedb80ca09d9cb /test/files/run/t9268/Test.scala
parent555f8f09c90b7014f153488e442f2d107b18b6e5 (diff)
downloadscala-c51080b78385402c941e5280d1740406ea8702d0.tar.gz
scala-c51080b78385402c941e5280d1740406ea8702d0.tar.bz2
scala-c51080b78385402c941e5280d1740406ea8702d0.zip
SI-9268 Be robust against absent classfiles during signature parsing
When parsing a Java generic signature that references an inner class `A$B`, we were tripping an assertion if the enclosing class `A` was absent. This commit creates a stub symbol for `B` when this happens, rather than continuing on with `NoSymbol`. The enclosed test shows that we can instantiate a class containing a method referring to such an inner class with only a warning about the absent classfile, and that an error is issued only upon a subsequent attempt to call the method.
Diffstat (limited to 'test/files/run/t9268/Test.scala')
-rw-r--r--test/files/run/t9268/Test.scala40
1 files changed, 40 insertions, 0 deletions
diff --git a/test/files/run/t9268/Test.scala b/test/files/run/t9268/Test.scala
new file mode 100644
index 0000000000..813cbe7b60
--- /dev/null
+++ b/test/files/run/t9268/Test.scala
@@ -0,0 +1,40 @@
+import scala.tools.partest._
+import java.io.File
+
+object Test extends StoreReporterDirectTest {
+ def code = ???
+
+ def compileCode(code: String) = {
+ val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+ compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+ }
+
+ def client1 = """
+ class Client1 { def p(p: Partial) = p.toString }
+ """
+
+ def client2 = """
+ class Client2 { def p(p: Partial) = p.waitFor() }
+ """
+
+ def deleteClass(s: String) = {
+ val f = new File(testOutput.path, s + ".class")
+ assert(f.exists)
+ f.delete()
+ }
+
+ def show(): Unit = {
+ deleteClass("Waiter")
+ deleteClass("Waiter$Predicate")
+
+ // Used to crash in Java Generic Signature parsing
+ println("Compiling Client1")
+ compileCode(client1)
+ println(storeReporter.infos.mkString("\n"))
+ storeReporter.reset()
+ println("Compiling Client2")
+ compileCode(client2)
+ println(storeReporter.infos.mkString("\n"))
+ }
+}
+