Fix codegen box tests for language version 1.4
Since API version 1.4, NullPointerException is thrown for casts of null to any type instead of TypeCastException.
This commit is contained in:
+2
-2
@@ -16,14 +16,14 @@ fun box(): String {
|
||||
try {
|
||||
val i = JImpl().arrayOfNotNull()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i in JImpl().arrayOfNotNull()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+2
-8
@@ -1,14 +1,8 @@
|
||||
// !LANGUAGE: +StrictJavaNullabilityAssertions
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// WITH_RUNTIME
|
||||
|
||||
// Note: This fails on JVM (non-IR) with a NullPointerException in the loop header. The not-null assertion is not generated when
|
||||
// assigning to the loop variable. The root cause seems to be that the loop variable is a KtParameter and
|
||||
// CodegenAnnotatingVisitor/RuntimeAssertionsOnDeclarationBodyChecker do not analyze the need for not-null assertions on KtParameters.
|
||||
// The NPE is due to calling `intValue()` on the null Int; it is expected to be asserted as non-null first.
|
||||
|
||||
// FILE: box.kt
|
||||
import kotlin.test.*
|
||||
|
||||
@@ -17,14 +11,14 @@ fun box(): String {
|
||||
try {
|
||||
val i: Int = J.arrayOfMaybeNullable()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i: Int in J.arrayOfMaybeNullable()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
Vendored
+2
-2
@@ -18,14 +18,14 @@ fun box(): String {
|
||||
try {
|
||||
val i = J.listOfNotNull()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i in J.listOfNotNull()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
Vendored
+2
-2
@@ -16,14 +16,14 @@ fun box(): String {
|
||||
try {
|
||||
val i = JImpl().listOfNotNull()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i in JImpl().listOfNotNull()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+2
-8
@@ -1,14 +1,8 @@
|
||||
// !LANGUAGE: +StrictJavaNullabilityAssertions
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// WITH_RUNTIME
|
||||
|
||||
// Note: This fails on JVM (non-IR) with a NullPointerException in the loop header. The not-null assertion is not generated when
|
||||
// assigning to the loop variable. The root cause seems to be that the loop variable is a KtParameter and
|
||||
// CodegenAnnotatingVisitor/RuntimeAssertionsOnDeclarationBodyChecker do not analyze the need for not-null assertions on KtParameters.
|
||||
// The NPE is due to calling `intValue()` on the null Int; it is expected to be asserted as non-null first.
|
||||
|
||||
// FILE: box.kt
|
||||
import kotlin.test.*
|
||||
|
||||
@@ -17,14 +11,14 @@ fun box(): String {
|
||||
try {
|
||||
val i: Int = J.listOfMaybeNullable()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i: Int in J.listOfMaybeNullable()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
Vendored
+2
-2
@@ -17,14 +17,14 @@ fun box(): String {
|
||||
try {
|
||||
val i = J.listOfNotNull().toTypedArray()[0]
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i in J.listOfNotNull().toTypedArray()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -17,14 +17,14 @@ fun box(): String {
|
||||
try {
|
||||
val i = J.iteratorOfNotNull().next()
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for (i in J.iteratorOfNotNull()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -17,14 +17,14 @@ fun box(): String {
|
||||
try {
|
||||
val (index, i) = JImpl().arrayOfNotNull().withIndex().first()
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for ((index, i) in JImpl().arrayOfNotNull().withIndex()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -18,14 +18,14 @@ fun box(): String {
|
||||
try {
|
||||
val (index, i) = J.listOfNotNull().withIndex().first()
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for ((index, i) in J.listOfNotNull().withIndex()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
compiler/testData/codegen/box/ranges/javaInterop/withIndex/javaIteratorOfNotNullWithIndexFailFast.kt
Vendored
+2
-2
@@ -18,14 +18,14 @@ fun box(): String {
|
||||
try {
|
||||
val (index, i) = J.iteratorOfNotNull().withIndex().next()
|
||||
return "Fail: should throw on get()"
|
||||
} catch (e: IllegalStateException) {}
|
||||
} catch (e: NullPointerException) {}
|
||||
|
||||
try {
|
||||
for ((index, i) in J.iteratorOfNotNull().withIndex()) {
|
||||
return "Fail: should throw on get() in loop header"
|
||||
}
|
||||
}
|
||||
catch (e: IllegalStateException) {}
|
||||
catch (e: NullPointerException) {}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
@@ -12,15 +12,15 @@ fun case1(): Int =
|
||||
null.castTo<Int?, Int>()
|
||||
|
||||
fun box(): String {
|
||||
failTypeCast { case1(); return "failTypeCast 9" }
|
||||
failNPE { case1(); return "Fail" }
|
||||
return "OK"
|
||||
}
|
||||
|
||||
inline fun failTypeCast(s: () -> Unit) {
|
||||
inline fun failNPE(s: () -> Unit) {
|
||||
try {
|
||||
s()
|
||||
}
|
||||
catch (e: TypeCastException) {
|
||||
|
||||
catch (e: NullPointerException) {
|
||||
// OK
|
||||
}
|
||||
}
|
||||
|
||||
+14
-15
@@ -1,5 +1,4 @@
|
||||
// FILE: 1.kt
|
||||
// WITH_RUNTIME
|
||||
package test
|
||||
|
||||
class A
|
||||
@@ -12,34 +11,34 @@ inline fun <reified T> Any?.foo(): T = this as T
|
||||
import test.*
|
||||
|
||||
fun box(): String {
|
||||
failTypeCast { null.foo<Any>(); return "failTypeCast 1" }
|
||||
if (null.foo<Any?>() != null) return "failTypeCast 2"
|
||||
failNPE { null.foo<Any>(); return "Fail 1" }
|
||||
if (null.foo<Any?>() != null) return "Fail 2"
|
||||
|
||||
failTypeCast { null.foo<A>(); return "failTypeCast 3" }
|
||||
if (null.foo<A?>() != null) return "failTypeCast 4"
|
||||
failNPE { null.foo<A>(); return "Fail 3" }
|
||||
if (null.foo<A?>() != null) return "Fail 4"
|
||||
|
||||
val a = A()
|
||||
|
||||
if (a.foo<Any>() != a) return "failTypeCast 5"
|
||||
if (a.foo<Any?>() != a) return "failTypeCast 6"
|
||||
if (a.foo<Any>() != a) return "Fail 5"
|
||||
if (a.foo<Any?>() != a) return "Fail 6"
|
||||
|
||||
if (a.foo<A>() != a) return "failTypeCast 7"
|
||||
if (a.foo<A?>() != a) return "failTypeCast 8"
|
||||
if (a.foo<A>() != a) return "Fail 7"
|
||||
if (a.foo<A?>() != a) return "Fail 8"
|
||||
|
||||
val b = B()
|
||||
|
||||
failClassCast { b.foo<A>(); return "failTypeCast 9" }
|
||||
failClassCast { b.foo<A?>(); return "failTypeCast 10" }
|
||||
failClassCast { b.foo<A>(); return "Fail 9" }
|
||||
failClassCast { b.foo<A?>(); return "Fail 10" }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
inline fun failTypeCast(s: () -> Unit) {
|
||||
inline fun failNPE(s: () -> Unit) {
|
||||
try {
|
||||
s()
|
||||
}
|
||||
catch (e: TypeCastException) {
|
||||
|
||||
catch (e: NullPointerException) {
|
||||
// OK
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +50,6 @@ inline fun failClassCast(s: () -> Unit) {
|
||||
throw e
|
||||
}
|
||||
catch (e: ClassCastException) {
|
||||
|
||||
// OK
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
// !API_VERSION: 1.3
|
||||
// FILE: 1.kt
|
||||
// WITH_RUNTIME
|
||||
package test
|
||||
|
||||
class A
|
||||
class B
|
||||
|
||||
inline fun <reified T> Any?.foo(): T = this as T
|
||||
|
||||
// FILE: 2.kt
|
||||
|
||||
import test.*
|
||||
|
||||
fun box(): String {
|
||||
failTypeCast { null.foo<Any>(); return "Fail 1" }
|
||||
if (null.foo<Any?>() != null) return "Fail 2"
|
||||
|
||||
failTypeCast { null.foo<A>(); return "Fail 3" }
|
||||
if (null.foo<A?>() != null) return "Fail 4"
|
||||
|
||||
val a = A()
|
||||
|
||||
if (a.foo<Any>() != a) return "Fail 5"
|
||||
if (a.foo<Any?>() != a) return "Fail 6"
|
||||
|
||||
if (a.foo<A>() != a) return "Fail 7"
|
||||
if (a.foo<A?>() != a) return "Fail 8"
|
||||
|
||||
val b = B()
|
||||
|
||||
failClassCast { b.foo<A>(); return "Fail 9" }
|
||||
failClassCast { b.foo<A?>(); return "Fail 10" }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
inline fun failTypeCast(s: () -> Unit) {
|
||||
try {
|
||||
s()
|
||||
}
|
||||
catch (e: TypeCastException) {
|
||||
// OK
|
||||
}
|
||||
}
|
||||
|
||||
inline fun failClassCast(s: () -> Unit) {
|
||||
try {
|
||||
s()
|
||||
}
|
||||
catch (e: TypeCastException) {
|
||||
throw e
|
||||
}
|
||||
catch (e: ClassCastException) {
|
||||
// OK
|
||||
}
|
||||
}
|
||||
+5
@@ -2941,6 +2941,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
|
||||
public void testSimpleSafe() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simpleSafe.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("simple_1_3.kt")
|
||||
public void testSimple_1_3() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simple_1_3.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/boxInline/reified/defaultLambda")
|
||||
|
||||
Generated
+5
@@ -2941,6 +2941,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
|
||||
public void testSimpleSafe() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simpleSafe.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("simple_1_3.kt")
|
||||
public void testSimple_1_3() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simple_1_3.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/boxInline/reified/defaultLambda")
|
||||
|
||||
+5
@@ -2941,6 +2941,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
|
||||
public void testSimpleSafe() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simpleSafe.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("simple_1_3.kt")
|
||||
public void testSimple_1_3() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simple_1_3.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/boxInline/reified/defaultLambda")
|
||||
|
||||
Generated
+5
@@ -2941,6 +2941,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
|
||||
public void testSimpleSafe() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simpleSafe.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("simple_1_3.kt")
|
||||
public void testSimple_1_3() throws Exception {
|
||||
runTest("compiler/testData/codegen/boxInline/reified/checkCast/simple_1_3.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/boxInline/reified/defaultLambda")
|
||||
|
||||
Reference in New Issue
Block a user