FIR: support CONDITION_TYPE_MISMATCH diagnostic

We report CONDITION_TYPE_MISMATCH on
- loop conditions
- when branch conditions
- binary logic arguments
This commit is contained in:
Mikhail Glukhikh
2021-05-18 13:26:27 +03:00
parent e85d97b894
commit 3663884db2
27 changed files with 165 additions and 50 deletions
@@ -26,7 +26,7 @@ fun f(): Unit {
<!ARGUMENT_TYPE_MISMATCH!>x<!> in 1..2
val y : Boolean? = true
false || y
y && true
y && 1
false || <!CONDITION_TYPE_MISMATCH!>y<!>
<!CONDITION_TYPE_MISMATCH!>y<!> && true
<!CONDITION_TYPE_MISMATCH!>y<!> && <!CONDITION_TYPE_MISMATCH!>1<!>
}
@@ -82,9 +82,9 @@ fun test(notRange1: NotRange1, notRange2: NotRange2, notRange3: NotRange3, notRa
for (i in <!HAS_NEXT_MISSING, NEXT_MISSING!>notRange2<!>);
for (i in <!NEXT_MISSING!>notRange3<!>);
for (i in <!HAS_NEXT_MISSING!>notRange4<!>);
for (i in notRange5);
<!CONDITION_TYPE_MISMATCH!>for (i in notRange5)<!>;
for (i in notRange6);
for (i in notRange7);
<!CONDITION_TYPE_MISMATCH!>for (i in notRange7)<!>;
for (i in <!HAS_NEXT_MISSING!>notRange8<!>);
for (i in range0);
for (i in range1);
@@ -1,7 +1,7 @@
// !WITH_NEW_INFERENCE
fun foo1(b: Boolean, c: Int) {
if (b && c) {}
if (b || c) {}
if (c && b) {}
if (c || b) {}
if (b && <!CONDITION_TYPE_MISMATCH!>c<!>) {}
if (b || <!CONDITION_TYPE_MISMATCH!>c<!>) {}
if (<!CONDITION_TYPE_MISMATCH!>c<!> && b) {}
if (<!CONDITION_TYPE_MISMATCH!>c<!> || b) {}
}
@@ -7,10 +7,10 @@ fun foo() =
when {
cond1() -> 12
cond2() -> 2
4 -> 34
Pair(1, 2) -> 3
<!CONDITION_TYPE_MISMATCH!>4<!> -> 34
<!CONDITION_TYPE_MISMATCH!>Pair(1, 2)<!> -> 3
in 1..10 -> 34
4 -> 38
<!CONDITION_TYPE_MISMATCH!>4<!> -> 38
is Int -> 33
else -> 34
}
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -TYPE_MISMATCH
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -TYPE_MISMATCH -CONDITION_TYPE_MISMATCH
inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) {
<!USAGE_IS_NOT_INLINABLE!>s<!> && <!USAGE_IS_NOT_INLINABLE!>ext<!>
@@ -23,23 +23,23 @@ fun test() {
val platformJ = J.staticJ
if (platformNN) {}
if (platformN) {}
if (<!CONDITION_TYPE_MISMATCH!>platformN<!>) {}
if (platformJ) {}
while (platformNN) {}
while (platformN) {}
while (<!CONDITION_TYPE_MISMATCH!>platformN<!>) {}
while (platformJ) {}
do {} while (platformNN)
do {} while (platformN)
do {} while (<!CONDITION_TYPE_MISMATCH!>platformN<!>)
do {} while (platformJ)
platformNN && false
platformN && false
<!CONDITION_TYPE_MISMATCH!>platformN<!> && false
platformJ && false
platformNN || false
platformN || false
<!CONDITION_TYPE_MISMATCH!>platformN<!> || false
platformJ || false
!platformNN
@@ -12,7 +12,7 @@ fun isString(x: Any?): Boolean {
}
fun incorrectPartDoesntMatter(x: Any?) {
if (isString(x) && 1) {
if (isString(x) && <!CONDITION_TYPE_MISMATCH!>1<!>) {
x.length
}
else {