Properly check expression nullability on attempt to apply == optimizations
#Fix KT-19767
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
fun foo(p: Int?): Boolean {
|
||||
return M<Int>(p)?.nulled() == 1
|
||||
}
|
||||
|
||||
fun foo2(p: Int?): Boolean {
|
||||
return 1 == M<Int>(p)?.nulled()
|
||||
}
|
||||
|
||||
class M<T: Any>(val z: T?) {
|
||||
fun nulled(): T? = z
|
||||
}
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if (foo(null)) return "fail 1"
|
||||
if (!foo(1)) return "fail 2"
|
||||
|
||||
if (foo2(null)) return "fail 1"
|
||||
if (!foo2(1)) return "fail 2"
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
//WITH_RUNTIME
|
||||
|
||||
fun box(): String {
|
||||
val map: Map<String, Boolean>? = mapOf()
|
||||
return if (map?.get("") == true) "fail" else "OK"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
// FILE: M.java
|
||||
|
||||
public class M {
|
||||
private final Integer value;
|
||||
|
||||
public M(Integer value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Integer nulled() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// FILE: Kotlin.kt
|
||||
fun foo(p: Int?): Boolean {
|
||||
return M(p)?.nulled() == 1
|
||||
}
|
||||
|
||||
fun foo2(p: Int?): Boolean {
|
||||
return 1 == M(p)?.nulled()
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (foo(null)) return "fail 1"
|
||||
if (!foo(1)) return "fail 2"
|
||||
|
||||
if (foo2(null)) return "fail 1"
|
||||
if (!foo2(1)) return "fail 2"
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
fun foo(p: Int?): Boolean {
|
||||
return M<Int>(p)?.chain()?.nulled() == 1
|
||||
}
|
||||
|
||||
fun foo2(p: Int?): Boolean {
|
||||
return 1 == M<Int>(p)?.chain()?.nulled()
|
||||
}
|
||||
|
||||
class M<T: Any>(val z: T?) {
|
||||
fun nulled(): T? = z
|
||||
|
||||
fun chain(): M<T>? = this
|
||||
}
|
||||
|
||||
|
||||
fun box(): String {
|
||||
if (foo(null)) return "fail 1"
|
||||
if (!foo(1)) return "fail 2"
|
||||
|
||||
if (foo2(null)) return "fail 1"
|
||||
if (!foo2(1)) return "fail 2"
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user