[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:
committed by
Mikhail Glukhikh
parent
fe779bf7bd
commit
34e6649d31
@@ -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)
|
||||
}
|
||||
|
||||
+3
-3
@@ -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];
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
+3
-3
@@ -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!!)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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!><!>
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user