[FIR] Harden check of argument type properly

Before this commit, nullable argument could match not null parameter.
Now we require also correct nullability that breaks some cases
This commit is contained in:
simon.ogorodnik
2020-01-28 14:17:24 +03:00
committed by Mikhail Glukhikh
parent fe779bf7bd
commit 34e6649d31
82 changed files with 171 additions and 173 deletions
@@ -5,9 +5,9 @@ fun foo() {
val x: Int? = null
if (x != null && bar(x) == 0) bar(bar(x))
bar(x)
if (x == null || bar(x) == 0) bar(bar(x))
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x == null || bar(x) == 0) bar(<!INAPPLICABLE_CANDIDATE!>bar<!>(x))
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x is Int && bar(x)*bar(x) == bar(x)) bar(x)
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
}
@@ -4,10 +4,10 @@ fun foo() {
val x: Int? = null
val a = Array<Int>(3, {0})
if (x != null) bar(a[x]) else bar(a[x])
if (x != null) bar(a[x]) else bar(<!INAPPLICABLE_CANDIDATE!>a[x]<!>)
bar(a[if (x == null) 0 else x])
bar(a[x])
bar(<!INAPPLICABLE_CANDIDATE!>a[x]<!>)
"123"[x];
<!INAPPLICABLE_CANDIDATE!>"123"[x]<!>;
if (x != null) "123"[x];
}
@@ -6,6 +6,6 @@ fun foo() {
val x: Int? = null
bar(1 + (if (x == null) 0 else x))
bar(if (x == null) x else x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(if (x == null) x else x)
if (x != null) bar(x + x/(x-x*x))
}
@@ -17,14 +17,14 @@ fun foo() {
if (x == null) bar(x) else bar(x)
bar(bar(x))
} else if (x == null) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x != null) {
bar(x)
if (x == null) bar(x)
if (x == null) bar(x) else bar(x)
bar(bar(x) + bar(x))
} else if (x == null) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
}
}
@@ -4,13 +4,13 @@ fun foo() {
val x: Int? = null
do {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
} while (x == null)
bar(x)
val y: Int? = null
do {
bar(y)
<!INAPPLICABLE_CANDIDATE!>bar<!>(y)
} while (y != null)
bar(y)
<!INAPPLICABLE_CANDIDATE!>bar<!>(y)
}
@@ -16,5 +16,5 @@ fun doWhileWithBreak(x: Int?, y0: Int) {
y++
if (y > 0) break
} while (x!! == y)
checkSubtype<Int>(x)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Int>(x)
}
@@ -5,5 +5,5 @@ fun foo() {
bar(x ?: 0)
if (x != null) bar(x ?: x)
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
}
@@ -1,7 +1,7 @@
fun bar(x: Int) = x + 1
fun f1(x: Int?) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x != null) bar(x!!)
if (x == null) bar(x!!)
}
@@ -5,7 +5,7 @@ fun foo() {
val a = Array<Int>(3, {0})
for (p in a) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x == null) continue
bar(x)
for (q in a) {
@@ -15,7 +15,7 @@ fun foo() {
}
for (p in a) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x == null) break
bar(x)
}
@@ -3,7 +3,7 @@ fun bar(x: Int) = x + 1
fun foo() {
val x: Int? = null
fun baz() = bar(x)
fun baz() = <!INAPPLICABLE_CANDIDATE!>bar<!>(x)
fun quux() = if (x != null) bar(x) else baz()
fun quuux() = bar(if (x == null) 0 else x)
}
@@ -25,7 +25,7 @@ fun ifThenElse(x: Int?) {
fun ifIs(x: Int?, cond: Boolean) {
if ((x is Int) == cond) {
checkSubtype<Int>(x)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Int>(x)
}
checkSubtype<Int>(x)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Int>(x)
}
@@ -6,7 +6,7 @@ fun foo() {
bar(if (x == null) 0 else x)
if (x == null) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
return
} else {
bar(x)
@@ -17,14 +17,14 @@ fun foo() {
if (y is Int) {
bar(y)
} else {
bar(y)
<!INAPPLICABLE_CANDIDATE!>bar<!>(y)
return
}
bar(y)
val z: Int? = null
if (z != null) bar(z)
bar(z)
<!INAPPLICABLE_CANDIDATE!>bar<!>(z)
bar(z!!)
if (z != null) bar(z!!)
}
@@ -3,7 +3,7 @@ fun bar(x: Int): Int = x + 1
fun foo() {
val x: Int? = null
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x != 2) {
if (x == null) return
2<!AMBIGUITY!>+<!><!SYNTAX!><!>
@@ -7,7 +7,7 @@ class A {
fun foo() {
val x: Int? = null
A().bar(x)
A().<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x == null) return
A().bar(x)
}
@@ -5,7 +5,7 @@ fun bar(x: Int): Int = x + 1
fun foo(): Int {
val x: Int? = null
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x != null) return x
val y: Int? = null
@@ -8,14 +8,14 @@ class Derived : Base() {
fun foo() {
val x: Int? = null
super.bar(x)
this.baz(x)
super.<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
this.<!INAPPLICABLE_CANDIDATE!>baz<!>(x)
if (x == null) return
super.bar(x)
this.baz(x)
val y: Int? = null
if (y != null) super.bar(this.baz(y))
else this.baz(super.bar(y))
else this.baz(super.<!INAPPLICABLE_CANDIDATE!>bar<!>(y))
}
}
@@ -3,7 +3,7 @@ fun bar(x: Int): RuntimeException = RuntimeException(x.toString())
fun foo() {
val x: Int? = null
if (x == null) throw bar(x)
if (x == null) throw <!INAPPLICABLE_CANDIDATE!>bar<!>(x)
throw bar(x)
throw bar(x)
}
@@ -3,7 +3,7 @@ fun bar(x: Int): Int = x + 1
fun foo() {
val x: Int? = null
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
if (x == null) return
try {
bar(x)
@@ -3,7 +3,7 @@ fun bar(x: Int): Int = x + 1
fun foo() {
val x: Int? = null
while (x == null) {
bar(x)
<!INAPPLICABLE_CANDIDATE!>bar<!>(x)
}
bar(x)
@@ -15,8 +15,8 @@ fun foo() {
val z: Int? = null
while (z == null) {
bar(z)
<!INAPPLICABLE_CANDIDATE!>bar<!>(z)
break
}
bar(z)
<!INAPPLICABLE_CANDIDATE!>bar<!>(z)
}