bd4e2a283c
The null check on the extension receiver of private operator functions is a special case and doesn't extend to value parameters.
63 lines
1.5 KiB
Kotlin
Vendored
63 lines
1.5 KiB
Kotlin
Vendored
// TARGET_BACKEND: JVM
|
|
// WITH_REFLECT
|
|
|
|
var result: String? = "fail"
|
|
|
|
class X
|
|
|
|
class A {
|
|
// There should be a null check on the extension receiver of private
|
|
// operator functions, but no null checks on all other arguments.
|
|
|
|
private operator fun X.get(name: String) = "$name$result"
|
|
|
|
private operator fun X.set(name: String, v: String) {
|
|
result = v
|
|
}
|
|
|
|
private fun getMethod(name: String) =
|
|
A::class.java.getDeclaredMethods().first { it.name == name }
|
|
|
|
fun test(): String {
|
|
val setter = getMethod("set")
|
|
try {
|
|
setter.invoke(this, X(), null, null)
|
|
} catch (e: Throwable) {
|
|
return "Fail 1"
|
|
}
|
|
|
|
try {
|
|
setter.invoke(this, null, null, null)
|
|
return "Fail 2"
|
|
} catch (e: Throwable) {
|
|
// expected
|
|
if (e.cause !is NullPointerException) {
|
|
return "Fail 3"
|
|
}
|
|
}
|
|
|
|
val getter = getMethod("get")
|
|
val s = try {
|
|
getter.invoke(this, X(), null) as String
|
|
} catch (e: Throwable) {
|
|
return "Fail 4"
|
|
}
|
|
|
|
try {
|
|
getter.invoke(this, null, null)
|
|
return "Fail 5"
|
|
} catch (e: Throwable) {
|
|
// expected
|
|
if (e.cause !is NullPointerException) {
|
|
return "Fail 6"
|
|
}
|
|
}
|
|
|
|
return if (s == "nullnull") "OK" else "Fail 7"
|
|
}
|
|
}
|
|
|
|
fun box(): String {
|
|
return A().test()
|
|
}
|