summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-06-03 22:46:00 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-06-04 20:55:30 +0200
commitb2a78b3ab536658f79e4396201c730a8408d3dd2 (patch)
tree983d420b6258a1ae9eb7683a27a6c378cc389103 /test
parenta112422e91018b7f01add6c9d40bec5eb010c321 (diff)
downloadscala-b2a78b3ab536658f79e4396201c730a8408d3dd2.tar.gz
scala-b2a78b3ab536658f79e4396201c730a8408d3dd2.tar.bz2
scala-b2a78b3ab536658f79e4396201c730a8408d3dd2.zip
Fix aliasing / nullness of CHECKCAST
Diffstat (limited to 'test')
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala26
1 files changed, 26 insertions, 0 deletions
diff --git a/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala
index 3d5343e395..3a85f03da2 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/analysis/NullnessAnalyzerTest.scala
@@ -202,4 +202,30 @@ class NullnessAnalyzerTest extends ClearAfterClass {
(end, 5, Null) // d, no change
)) testNullness(a, m, insn, index, nullness)
}
+
+ @Test
+ def testInstanceOf(): Unit = {
+ val code =
+ """def f(a: Object) = {
+ | val x = a
+ | x.isInstanceOf[Throwable] // x and a remain unknown - INSTANCEOF doesn't throw a NPE on null
+ | x.toString // x and a are not null
+ | a.asInstanceOf[String].trim // the stack value (LOAD of local a) is still not-null after the CHECKCAST
+ |}
+ """.stripMargin
+ val List(m) = compileMethods(noOptCompiler)(code)
+ val a = newNullnessAnalyzer(m)
+
+ val instof = "+INSTANCEOF"
+ val tost = "+INVOKEVIRTUAL java/lang/Object.toString"
+ val trim = "INVOKEVIRTUAL java/lang/String.trim"
+
+ for ((insn, index, nullness) <- List(
+ (instof, 1, Unknown), // a after INSTANCEOF
+ (instof, 2, Unknown), // x after INSTANCEOF
+ (tost, 1, NotNull),
+ (tost, 2, NotNull),
+ (trim, 3, NotNull) // receiver at `trim`
+ )) testNullness(a, m, insn, index, nullness)
+ }
}