[FIR] Check is for impossibility
^KT-58203 Fixed ^KT-62646
This commit is contained in:
committed by
Space Team
parent
92d8da621e
commit
88ff93df7f
@@ -68,8 +68,8 @@ fun testIs(x: Any) : Int {
|
||||
}
|
||||
}
|
||||
|
||||
fun testIs2(x: lib.FwdStruct) = <!CANNOT_CHECK_FOR_FORWARD_DECLARATION!>x is cnames.structs.FwdStruct<!>
|
||||
fun testIs3(x: lib.FwdObjcClass) = <!CANNOT_CHECK_FOR_FORWARD_DECLARATION!>x is objcnames.classes.FwdObjcClass<!>
|
||||
fun testIs2(x: lib.FwdStruct) = <!CANNOT_CHECK_FOR_FORWARD_DECLARATION, USELESS_IS_CHECK!>x is cnames.structs.FwdStruct<!>
|
||||
fun testIs3(x: lib.FwdObjcClass) = <!CANNOT_CHECK_FOR_FORWARD_DECLARATION, USELESS_IS_CHECK!>x is objcnames.classes.FwdObjcClass<!>
|
||||
fun testIs4(x: lib.FwdProtocol) = <!CANNOT_CHECK_FOR_FORWARD_DECLARATION!>x is objcnames.protocols.FwdProtocol<!>
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
fun test() {
|
||||
if (<!USELESS_IS_CHECK!>1 is Int<!>) {
|
||||
if (1 is Boolean) {
|
||||
if (<!USELESS_IS_CHECK!>1 is Boolean<!>) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ fun main() {
|
||||
<!NO_COMPANION_OBJECT!>System<!>!!
|
||||
java.lang.<!NO_COMPANION_OBJECT, VARIABLE_EXPECTED!>System<!> = <!NULL_FOR_NONNULL_TYPE!>null<!>
|
||||
java.lang.<!NO_COMPANION_OBJECT!>System<!>!!
|
||||
<!NO_COMPANION_OBJECT!>System<!> is Int
|
||||
<!USELESS_IS_CHECK!><!NO_COMPANION_OBJECT!>System<!> is Int<!>
|
||||
<!INVISIBLE_REFERENCE!>System<!>()
|
||||
(<!NO_COMPANION_OBJECT!>System<!>)
|
||||
foo@ <!NO_COMPANION_OBJECT!>System<!>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
class G<T>
|
||||
interface Tr
|
||||
|
||||
fun f(q: Tr) = <!USELESS_IS_CHECK!>q is G<*><!>
|
||||
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
class G<T>
|
||||
interface Tr
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ fun foo() =
|
||||
<!CONDITION_TYPE_MISMATCH, TYPE_MISMATCH!>Pair(1, 2)<!> -> 3
|
||||
<!ARGUMENT_TYPE_MISMATCH, EXPECTED_CONDITION!>in 1..10<!> -> 34
|
||||
<!CONDITION_TYPE_MISMATCH!>4<!> -> 38
|
||||
<!EXPECTED_CONDITION!>is Int<!> -> 33
|
||||
<!EXPECTED_CONDITION, USELESS_IS_CHECK!>is Int<!> -> 33
|
||||
else -> 34
|
||||
}
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -9,7 +9,7 @@ class C() {
|
||||
|
||||
fun test(a : Any?) {
|
||||
if (a is B) {
|
||||
if (a is C) {
|
||||
if (<!USELESS_IS_CHECK!>a is C<!>) {
|
||||
a.bar();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ fun useEn(x: En) = x
|
||||
fun useEn2(x: En2) = x
|
||||
|
||||
fun bar(x: Any) {
|
||||
if (x is En && x is En2) {
|
||||
if (x is En && <!USELESS_IS_CHECK!>x is En2<!>) {
|
||||
when (x) {
|
||||
En.A -> useEn(x)
|
||||
En2.D -> useEn2(x)
|
||||
|
||||
@@ -5,7 +5,7 @@ interface Entity<T>
|
||||
abstract class SecuredEntity<out E>(val entity: E) where E : Entity<Int>, E : SecurityCodeAware<*,*>
|
||||
interface SecurityCodeAware<out E, R : SecuredEntity<E>> where E : Entity<Int>, E : SecurityCodeAware<E, R>
|
||||
fun <E, R : SecuredEntity<E>> SecurityCodeAware<E, R>.secured() : R where E : Entity<Int>, E : SecurityCodeAware<E, R> = <!RETURN_TYPE_MISMATCH!>when(this) {
|
||||
is Order -> SecuredOrder(this)
|
||||
<!USELESS_IS_CHECK!>is Order<!> -> SecuredOrder(this)
|
||||
else -> null!!
|
||||
}<!>
|
||||
class Order : Entity<Int>
|
||||
|
||||
Vendored
+1
-1
@@ -45,7 +45,7 @@ fun test(i: Inv<Nothing>, iUnit: Inv<Unit>) {
|
||||
run<dynamic> { "" }
|
||||
}
|
||||
|
||||
if (iUnit is String) {
|
||||
if (<!USELESS_IS_CHECK!>iUnit is String<!>) {
|
||||
launch {
|
||||
run(A.<!INFERRED_TYPE_VARIABLE_INTO_EMPTY_INTERSECTION_WARNING!>flexible<!>(iUnit)) { 42 }
|
||||
}
|
||||
|
||||
@@ -111,12 +111,12 @@ fun f13(a : A?) {
|
||||
<!UNRESOLVED_REFERENCE!>c<!>.bar()
|
||||
}
|
||||
|
||||
if (!(a is B) || !(a is C)) {
|
||||
if (!(a is B) || !(<!USELESS_IS_CHECK!>a is C<!>)) {
|
||||
}
|
||||
else {
|
||||
}
|
||||
|
||||
if (!(a is B) || !(a is C)) {
|
||||
if (!(a is B) || !(<!USELESS_IS_CHECK!>a is C<!>)) {
|
||||
}
|
||||
|
||||
if (!(a is B)) return
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ class C() {
|
||||
|
||||
fun test(a : Any?) {
|
||||
if (a is B) {
|
||||
if (a is C) {
|
||||
if (<!USELESS_IS_CHECK!>a is C<!>) {
|
||||
a.bar();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
sealed class Sealed(val x: Int) {
|
||||
object First: Sealed(12)
|
||||
open class NonFirst(x: Int, val y: Int): Sealed(x) {
|
||||
object Second: NonFirst(34, 2)
|
||||
object Third: NonFirst(56, 3)
|
||||
}
|
||||
object Last: Sealed(78)
|
||||
}
|
||||
|
||||
fun foo(s: Sealed): Int {
|
||||
return when(s) {
|
||||
!is Sealed.First -> 1
|
||||
<!USELESS_IS_CHECK!>!is Sealed.Last<!> -> 0
|
||||
// no else required
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
sealed class Sealed(val x: Int) {
|
||||
object First: Sealed(12)
|
||||
open class NonFirst(x: Int, val y: Int): Sealed(x) {
|
||||
|
||||
+2
-2
@@ -11,7 +11,7 @@ fun foo(a: A) {
|
||||
if (a is B) {
|
||||
if (a is C) {
|
||||
val t = when (a) {
|
||||
is CC -> "CC"
|
||||
<!USELESS_IS_CHECK!>is CC<!> -> "CC"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ fun foo2(a: A) {
|
||||
if (a is C) {
|
||||
if (a is B) {
|
||||
val t = when (a) {
|
||||
is CC -> "CC"
|
||||
<!USELESS_IS_CHECK!>is CC<!> -> "CC"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ fun test() {
|
||||
b.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
c.length // OK, since `c` is aliased to `a`
|
||||
}
|
||||
if (b is String) {
|
||||
if (<!USELESS_IS_CHECK!>b is String<!>) {
|
||||
a.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
c.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
}
|
||||
@@ -35,11 +35,11 @@ fun test() {
|
||||
}
|
||||
|
||||
a = 2 // break `c` -> `a`
|
||||
if (a is String) {
|
||||
if (<!USELESS_IS_CHECK!>a is String<!>) {
|
||||
b.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
c.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
}
|
||||
if (b is String) {
|
||||
if (<!USELESS_IS_CHECK!>b is String<!>) {
|
||||
a.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
c.<!UNRESOLVED_REFERENCE!>length<!> // error
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ fun checkCannotAccess() {
|
||||
object : InlineCompletionSessionManager() {
|
||||
fun chch() {
|
||||
val b: Proto = Proto()
|
||||
if (b is Proto.Some) return
|
||||
if (<!USELESS_IS_CHECK!>b is Proto.Some<!>) return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ fun foo() : Int {
|
||||
val s = ""
|
||||
val x = 1
|
||||
when (x) {
|
||||
is String -> 1
|
||||
<!USELESS_IS_CHECK!>is String<!> -> 1
|
||||
<!USELESS_IS_CHECK!>!is Int<!> -> 1
|
||||
<!USELESS_IS_CHECK!>is Any?<!> -> 1
|
||||
<!USELESS_IS_CHECK!>is Any<!> -> 1
|
||||
|
||||
+2
-2
@@ -39,8 +39,8 @@ fun testWithSubject_ok(x: Boolean, y: Boolean?, any: Any, z: Boolean) {
|
||||
y ?: x -> {}
|
||||
x in x -> {}
|
||||
x !in x -> {}
|
||||
x is String -> {}
|
||||
x !is String -> {}
|
||||
<!USELESS_IS_CHECK!>x is String<!> -> {}
|
||||
<!USELESS_IS_CHECK!>x !is String<!> -> {}
|
||||
x < x -> {}
|
||||
x > x -> {}
|
||||
x <= x -> {}
|
||||
|
||||
+8
-8
@@ -57,8 +57,8 @@ fun testWithSubject_bad_1(x: A) {
|
||||
when (x) {
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x in x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x !in x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x !is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR, USELESS_IS_CHECK!>x is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR, USELESS_IS_CHECK!>x !is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x < x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x > x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_ERROR!>x <= x<!> -> {}
|
||||
@@ -72,8 +72,8 @@ fun testWithSubject_bad_1(x: A) {
|
||||
when (x) {
|
||||
(x in x) -> {}
|
||||
(x !in x) -> {}
|
||||
(x is String) -> {}
|
||||
(x !is String) -> {}
|
||||
(<!USELESS_IS_CHECK!>x is String<!>) -> {}
|
||||
(<!USELESS_IS_CHECK!>x !is String<!>) -> {}
|
||||
(x < x) -> {}
|
||||
(x > x) -> {}
|
||||
(x <= x) -> {}
|
||||
@@ -161,8 +161,8 @@ fun testWithRange_bad_1(x: A) {
|
||||
when (x) {
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x in x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x !in x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x !is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR, USELESS_IS_CHECK!>x is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR, USELESS_IS_CHECK!>x !is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x < x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x > x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_ERROR!>x <= x<!> -> {}
|
||||
@@ -176,8 +176,8 @@ fun testWithRange_bad_1(x: A) {
|
||||
when (x) {
|
||||
in (x in x) -> {}
|
||||
in (x !in x) -> {}
|
||||
in (x is String) -> {}
|
||||
in (x !is String) -> {}
|
||||
in (<!USELESS_IS_CHECK!>x is String<!>) -> {}
|
||||
in (<!USELESS_IS_CHECK!>x !is String<!>) -> {}
|
||||
in (x < x) -> {}
|
||||
in (x > x) -> {}
|
||||
in (x <= x) -> {}
|
||||
|
||||
+8
-8
@@ -57,8 +57,8 @@ fun testWithSubject_bad_1(x: A) {
|
||||
when (x) {
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x in x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x !in x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x !is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING, USELESS_IS_CHECK!>x is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING, USELESS_IS_CHECK!>x !is String<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x < x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x > x<!> -> {}
|
||||
<!CONFUSING_BRANCH_CONDITION_WARNING!>x <= x<!> -> {}
|
||||
@@ -72,8 +72,8 @@ fun testWithSubject_bad_1(x: A) {
|
||||
when (x) {
|
||||
(x in x) -> {}
|
||||
(x !in x) -> {}
|
||||
(x is String) -> {}
|
||||
(x !is String) -> {}
|
||||
(<!USELESS_IS_CHECK!>x is String<!>) -> {}
|
||||
(<!USELESS_IS_CHECK!>x !is String<!>) -> {}
|
||||
(x < x) -> {}
|
||||
(x > x) -> {}
|
||||
(x <= x) -> {}
|
||||
@@ -161,8 +161,8 @@ fun testWithRange_bad_1(x: A) {
|
||||
when (x) {
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x in x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x !in x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x !is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING, USELESS_IS_CHECK!>x is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING, USELESS_IS_CHECK!>x !is String<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x < x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x > x<!> -> {}
|
||||
in <!CONFUSING_BRANCH_CONDITION_WARNING!>x <= x<!> -> {}
|
||||
@@ -176,8 +176,8 @@ fun testWithRange_bad_1(x: A) {
|
||||
when (x) {
|
||||
in (x in x) -> {}
|
||||
in (x !in x) -> {}
|
||||
in (x is String) -> {}
|
||||
in (x !is String) -> {}
|
||||
in (<!USELESS_IS_CHECK!>x is String<!>) -> {}
|
||||
in (<!USELESS_IS_CHECK!>x !is String<!>) -> {}
|
||||
in (x < x) -> {}
|
||||
in (x > x) -> {}
|
||||
in (x <= x) -> {}
|
||||
|
||||
+12
-12
@@ -14,29 +14,29 @@ fun foo(a: A) {
|
||||
if (a !is B) return
|
||||
|
||||
when (a) {
|
||||
is A.A1 -> ""
|
||||
is A.A2 -> "v"
|
||||
<!USELESS_IS_CHECK!>is A.A1<!> -> ""
|
||||
<!USELESS_IS_CHECK!>is A.A2<!> -> "v"
|
||||
}.length
|
||||
|
||||
when (a) {
|
||||
is A.A1 -> ""
|
||||
is A.A2 -> "v"
|
||||
<!USELESS_IS_CHECK!>is A.A1<!> -> ""
|
||||
<!USELESS_IS_CHECK!>is A.A2<!> -> "v"
|
||||
}.length // OK
|
||||
|
||||
when (a) {
|
||||
is A.A1 -> ""
|
||||
is A.A2 -> "v"
|
||||
is B.B1 -> "..." // should be warning: unreachable code
|
||||
<!USELESS_IS_CHECK!>is A.A1<!> -> ""
|
||||
<!USELESS_IS_CHECK!>is A.A2<!> -> "v"
|
||||
<!USELESS_IS_CHECK!>is B.B1<!> -> "..." // should be warning: unreachable code
|
||||
}.length // OK
|
||||
|
||||
when (a) {
|
||||
is A.A1 -> ""
|
||||
is B.B1 -> "..."
|
||||
is A.A2 -> "v"
|
||||
<!USELESS_IS_CHECK!>is A.A1<!> -> ""
|
||||
<!USELESS_IS_CHECK!>is B.B1<!> -> "..."
|
||||
<!USELESS_IS_CHECK!>is A.A2<!> -> "v"
|
||||
}.length // OK
|
||||
|
||||
<!NO_ELSE_IN_WHEN!>when<!> (a) {
|
||||
is A.A1 -> ""
|
||||
is B.B1 -> "..."
|
||||
<!USELESS_IS_CHECK!>is A.A1<!> -> ""
|
||||
<!USELESS_IS_CHECK!>is B.B1<!> -> "..."
|
||||
}.length
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
// SKIP_TXT
|
||||
// FIR_IDENTICAL
|
||||
// SKIP_TXT
|
||||
// !CHECK_TYPE
|
||||
|
||||
sealed class KtClassifierSymbol
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ fun testSimpleValInWhenSubject() {
|
||||
|
||||
fun testValWithoutInitializerWhenSubject() {
|
||||
when (<!ILLEGAL_DECLARATION_IN_WHEN_SUBJECT!>val y: Any<!>) {
|
||||
<!EXPECTED_CONDITION!>is String<!> -> <!UNINITIALIZED_VARIABLE!>y<!>.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
<!EXPECTED_CONDITION, USELESS_IS_CHECK!>is String<!> -> <!UNINITIALIZED_VARIABLE!>y<!>.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -79,7 +79,7 @@ fun branchedAndNested(x: Any?, y: Any?) {
|
||||
|
||||
|
||||
fun br(y: Any?) {
|
||||
if (myAssert(y is Int) == Unit && myAssert(y is String) == Unit) {
|
||||
if (myAssert(y is Int) == Unit && myAssert(<!USELESS_IS_CHECK!>y is String<!>) == Unit) {
|
||||
y.length
|
||||
y.inc()
|
||||
}
|
||||
@@ -90,7 +90,7 @@ fun branchedAndNestedWithNativeOperators(x: Any?, y: Any?) {
|
||||
equalsTrue(notEqualsNull(nullWhenNotString(x))) // x is String
|
||||
&&
|
||||
(
|
||||
(myAssert(y is Int) == Unit && myAssert(y is String) == Unit) // y is Int, String
|
||||
(myAssert(y is Int) == Unit && myAssert(<!USELESS_IS_CHECK!>y is String<!>) == Unit) // y is Int, String
|
||||
||
|
||||
equalsTrue(isInt(y) && isString(y)) // y is Int, String
|
||||
)
|
||||
|
||||
+2
-2
@@ -45,8 +45,8 @@ fun intersectingInfo2(x: Any?, y: Any?) {
|
||||
// of them is absent in each arg of "||"-operator, so they *shouldn't* lead to smartcast
|
||||
|
||||
if ((isString(x) && !notIsInt(x) && y is String) ||
|
||||
(!notIsString(x) && isString(y) && y is Int) ||
|
||||
(x is String && !notIsInt(y) && x is Int)) {
|
||||
(!notIsString(x) && isString(y) && <!USELESS_IS_CHECK!>y is Int<!>) ||
|
||||
(x is String && !notIsInt(y) && <!USELESS_IS_CHECK!>x is Int<!>)) {
|
||||
x.length
|
||||
x.<!UNRESOLVED_REFERENCE!>inc<!>()
|
||||
y.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
|
||||
Reference in New Issue
Block a user