FIR DFA: x !is T? => x != null

^KT-22996 tag fixed-in-k2
This commit is contained in:
pyos
2022-11-14 17:18:01 +01:00
committed by teamcity
parent 02fedeb9ed
commit f485413cfd
18 changed files with 118 additions and 53 deletions
@@ -401,10 +401,10 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
if (!type.canBeNull) {
// x is (T & Any) => x != null
flow.addImplication((expressionVariable eq isType) implies (operandVariable notEq null))
} else {
// TODO? (KT-22996) x !is T? => x != null; don't forget to change `approveContractStatement`
// flow.addImplication((expressionVariable eq !isType) implies (operandVariable notEq null))
}
} else if (type.isMarkedNullable) {
// x !is T? => x != null
flow.addImplication((expressionVariable eq !isType) implies (operandVariable notEq null))
} // else probably a type parameter, so which implication is correct depends on instantiation
}
}
}
@@ -418,8 +418,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
} else {
val expressionVariable = variableStorage.createSynthetic(typeOperatorCall)
flow.addImplication((expressionVariable notEq null) implies (operandVariable notEq null))
// TODO? (x as T?) == null => x == null
// flow.addImplication((expressionVariable eq null) implies (operandVariable eq null))
flow.addImplication((expressionVariable eq null) implies (operandVariable eq null))
}
}
@@ -45,9 +45,11 @@ fun <F : Flow> LogicSystem<F>.approveContractStatement(
substitutedType.isAny -> it.processEqNull(!isType)
substitutedType.isNullableNothing -> it.processEqNull(isType)
else -> {
// x is (T & Any) => x != null
// TODO? (KT-22996) x !is T? => x != null: change `&&` to `==`
val fromNullability = if (isType && !type.canBeNull) it.processEqNull(false) else mapOf()
// x is (T & Any) || x !is T? => x != null
val fromNullability = if ((isType && !type.canBeNull) || (!isType && type.isMarkedNullable))
it.processEqNull(false)
else
mapOf()
if (isType && it is RealVariable) {
andForTypeStatements(fromNullability, mapOf(it to (it typeEq substitutedType)))
} else {
@@ -58,7 +58,7 @@ fun f11(a : A?) {
is A -> a.foo()
is Any -> a.foo()
<!USELESS_IS_CHECK!>is Any?<!> -> a.<!UNRESOLVED_REFERENCE!>bar<!>()
else -> a?.foo()
else -> a<!UNNECESSARY_SAFE_CALL!>?.<!>foo()
}
}
@@ -68,8 +68,8 @@ fun f12(a : A?) {
is A -> a.foo()
is Any -> a.foo();
<!USELESS_IS_CHECK!>is Any?<!> -> a.<!UNRESOLVED_REFERENCE!>bar<!>()
is C -> a.bar()
else -> a?.foo()
<!USELESS_IS_CHECK!>is C<!> -> a.bar()
else -> a<!UNNECESSARY_SAFE_CALL!>?.<!>foo()
}
if (<!USELESS_IS_CHECK!>a is Any?<!>) {
@@ -56,5 +56,5 @@ FILE fqName:<root> fileName:/bangbang.kt
then: CALL 'public final fun useString (s: kotlin.String): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
s: CALL 'public final fun CHECK_NOT_NULL <T0> (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=kotlin.String origin=EXCLEXCL
<T0>: kotlin.String
arg0: TYPE_OP type=kotlin.String? origin=IMPLICIT_CAST typeOperand=kotlin.String?
arg0: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String
GET_VAR 'a: X of <root>.test4 declared in <root>.test4' type=X of <root>.test4 origin=null
@@ -24,6 +24,6 @@ fun <X : Any?> test4(a: X) {
a is String? -> CHECK_NOT_NULL<String>(arg0 = a /*as String? */) /*~> Unit */
}
when {
a is String? -> useString(s = CHECK_NOT_NULL<String>(arg0 = a /*as String? */))
a is String? -> useString(s = CHECK_NOT_NULL<String>(arg0 = a /*as String */))
}
}
@@ -0,0 +1,65 @@
// SKIP_TXT
// TESTCASE NUMBER: 1
fun case_1(value_1: Any) = when (value_1) {
is Int -> {}
is Float, is Char, is Boolean -> {}
is String -> {}
else -> {}
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Any?) = when (value_1) {
is Float, is Char, is SealedClass? -> "" // if value is null then this branch will be executed
is Double, is Boolean, is ClassWithCompanionObject.Companion -> ""
else -> ""
}
/*
* TESTCASE NUMBER: 3
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-22996
*/
fun case_3(value_1: Any?) = when (value_1) {
is Float, is Char, is Int? -> "" // if value is null then this branch will be executed
is SealedChild2, is Boolean?, is String -> "" // redundant nullable type check
else -> ""
}
/*
* TESTCASE NUMBER: 4
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-22996
*/
fun case_4(value_1: Any?) = when (value_1) {
is Float, is Char?, is Int? -> "" // double nullable type check in the one branch
is SealedChild1, is Boolean, is String -> ""
else -> ""
}
/*
* TESTCASE NUMBER: 5
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-22996
*/
fun case_5(value_1: Any?): String {
when (value_1) {
is Float, is Char?, is Int -> return ""
is Double, is EmptyObject, is String -> return ""
<!SENSELESS_NULL_IN_WHEN!>null<!> -> return "" // null-check redundant
else -> return ""
}
}
/*
* TESTCASE NUMBER: 6
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-22996
*/
fun case_6(value_1: Any?): String {
when (value_1) {
is Float, is Char?, <!SENSELESS_NULL_IN_WHEN!>null<!>, is Int -> return "" // double nullable type check in the one branch
is Double, is EmptyObject, is String -> return ""
else -> return ""
}
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// SKIP_TXT
/*
@@ -44,6 +44,6 @@ fun case_6(value_1: Any?): String = when (value_1) {
* ISSUES: KT-22996
*/
fun case_7(value_1: Any?): String = when (value_1) {
is Number?, null, !is SealedChild3 -> "" // triple nullable type check in the one branch
is Number?, <!SENSELESS_NULL_IN_WHEN!>null<!>, !is SealedChild3 -> "" // triple nullable type check in the one branch
else -> ""
}
@@ -20,7 +20,7 @@ inline fun case_1(value_1: Int?, block: () -> Unit): Boolean {
// TESTCASE NUMBER: 2
inline fun <T> T?.case_2(value_1: Int?, value_2: Any?, block: () -> Unit): Boolean? {
<!WRONG_IMPLIES_CONDITION, WRONG_IMPLIES_CONDITION!>contract {
<!WRONG_IMPLIES_CONDITION, WRONG_IMPLIES_CONDITION, WRONG_IMPLIES_CONDITION!>contract {
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
returns(true) implies (value_1 == null && this@case_2 == null && value_2 !is Boolean?)
returns(false) implies (value_2 is Boolean?)
@@ -55,7 +55,7 @@ fun case_2(value_1: Int?, value_2: Int?, value_3: Any?) {
val value_4: Int
when (value_1.case_2(value_2, value_3) { value_4 = 10 }) {
true -> {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_3?.<!UNRESOLVED_REFERENCE!>xor<!>(true))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_3<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>xor<!>(true))
println(<!UNINITIALIZED_VARIABLE!>value_4<!>)
println(value_1<!UNSAFE_CALL!>.<!>inv())
println(value_2<!UNSAFE_CALL!>.<!>inv())
@@ -66,7 +66,7 @@ fun case_2(value_1: Int?, value_2: Int?, value_3: Any?) {
println(value_2)
}
null -> {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_3?.<!UNRESOLVED_REFERENCE!>xor<!>(true))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_3<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>xor<!>(true))
println(<!UNINITIALIZED_VARIABLE!>value_4<!>)
println(value_1)
println(value_2)
@@ -235,7 +235,7 @@ fun case_3(value_1: Any?) {
// TESTCASE NUMBER: 4
fun case_4(value_1: Any?) {
case_4_1(value_1)
value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>()
value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>()
case_4_2(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)
value_1.<!UNRESOLVED_REFERENCE!>toByte<!>()
case_4_3(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)
@@ -329,14 +329,14 @@ fun case_7(value_1: Any?) {
// TESTCASE NUMBER: 8
fun case_8(value_1: Any?) {
if (case_8_1(value_1)) {
value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>()
value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>()
if (case_8_2(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) {
value_1.<!UNRESOLVED_REFERENCE!>toByte<!>()
if (case_8_3(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) value_1.<!UNRESOLVED_REFERENCE!>inv<!>()
}
}
if (!case_8_4(value_1)) {
value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>()
value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>()
if (!case_8_5(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) {
value_1.<!UNRESOLVED_REFERENCE!>toByte<!>()
if (!case_8_6(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) value_1.<!UNRESOLVED_REFERENCE!>inv<!>()
@@ -58,7 +58,7 @@ import contracts.*
// TESTCASE NUMBER: 1
fun case_1(value_1: Any?) {
funWithReturns(value_1 !is Number?)
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>())
if (funWithReturnsTrue(value_1 !is Number)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1.<!UNRESOLVED_REFERENCE!>toByte<!>())
if (funWithReturnsNotNull(value_1 is Int) == null) <!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1.<!UNRESOLVED_REFERENCE!>inv<!>())
@@ -68,7 +68,7 @@ fun case_1(value_1: Any?) {
// TESTCASE NUMBER: 2
fun case_2(value_1: Any?) {
if (!funWithReturnsFalse(value_1 !is Number?)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>())
funWithReturns(value_1 !is Number)
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1.<!UNRESOLVED_REFERENCE!>toByte<!>())
if (funWithReturnsNull(value_1 !is Int) == null) <!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_1.<!UNRESOLVED_REFERENCE!>inv<!>())
@@ -78,12 +78,12 @@ fun case_2(value_1: Any?) {
// TESTCASE NUMBER: 3
fun case_3(value_1: Int?, value_2: Any?) {
if (!value_1.case_3(value_1, value_2 is Number?)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_2?.<!UNRESOLVED_REFERENCE!>toByte<!>())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_2<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>())
println(value_1)
} else if (value_1.case_3(value_1, value_2 is Number?)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_2?.<!UNRESOLVED_REFERENCE!>toByte<!>())
} else {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_2?.<!UNRESOLVED_REFERENCE!>toByte<!>())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(value_2<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>())
}
}
@@ -36,12 +36,12 @@ inline fun <reified T> case_3(x: Any?) {
when (x) {
is T? -> return
else -> {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.equals(10)
}
}
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.equals(10)
}
// TESTCASE NUMBER: 4
@@ -70,8 +70,8 @@ inline fun <reified T> case_5(x: Any?) {
// TESTCASE NUMBER: 6
inline fun <reified T> case_6(x: Any?) {
if (x is T?) return
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.equals(10)
}
// TESTCASE NUMBER: 7
@@ -7,8 +7,8 @@
*/
fun case_1(x: Number?): Long? {
if (x is Long?) return x
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number?")!>x<!>
return <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number?")!>x<!><!UNSAFE_CALL!>.<!>toLong()
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number? & kotlin.Number")!>x<!>
return <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number? & kotlin.Number")!>x<!>.toLong()
}
/*
@@ -38,8 +38,8 @@ fun case_4(x: Any) {
fun case_5(x: Any?) {
if (!(x !is Class.NestedClass?) || x is Class.NestedClass? || x !is Class.NestedClass?) {
if (!!(x !is Class.NestedClass?)) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>.<!UNRESOLVED_REFERENCE!>prop_4<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>prop_4<!>
}
}
}
@@ -72,8 +72,8 @@ fun case_8(x: Any?) {
fun case_9(x: Any?) {
if (!!!(x !is TypealiasNullableStringIndirect<!REDUNDANT_NULLABLE!>?<!>)) else {
if (!(x !is TypealiasNullableStringIndirect<!REDUNDANT_NULLABLE!>?<!>)) else {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>?.<!UNRESOLVED_REFERENCE!>get<!>(0)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>get<!>(0)
}
}
}
@@ -93,9 +93,9 @@ fun case_10(x: Any?) {
fun case_11(x: Any?) {
if (x is SealedMixedChildObject1?) else {
if (x is SealedMixedChildObject1?) else {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>?.<!UNRESOLVED_REFERENCE!>prop_1<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>?.<!UNRESOLVED_REFERENCE!>prop_2<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>prop_1<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>prop_2<!>
}
}
}
@@ -46,8 +46,8 @@ fun case_4(x: Any) {
fun case_5(x: Any?) {
if (!(x !is Class.NestedClass?)) {
if (!!(<!USELESS_IS_CHECK!>x !is Class.NestedClass?<!>)) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class.NestedClass?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class.NestedClass?")!>x<!>?.prop_4
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class.NestedClass")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class.NestedClass")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!>prop_4
}
}
}
@@ -76,8 +76,8 @@ fun case_7(x: Any) {
fun case_8(x: Any?) {
if (!!!!(x is Int?)) else {
if (!(x is Int?)) else {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Int?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Int?")!>x<!>?.inv()
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Int")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Int")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!>inv()
}
}
}
@@ -86,8 +86,8 @@ fun case_8(x: Any?) {
fun case_9(x: Any?) {
if (!!!(x !is TypealiasNullableStringIndirect<!REDUNDANT_NULLABLE!>?<!>)) else {
if (!!(x !is TypealiasNullableStringIndirect<!REDUNDANT_NULLABLE!>?<!>)) else {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & TypealiasNullableStringIndirect?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & TypealiasNullableStringIndirect?")!>x<!>?.get(0)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any & TypealiasNullableStringIndirect")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any & TypealiasNullableStringIndirect")!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!>get(0)
}
}
}
@@ -207,7 +207,7 @@ fun case_10(x: Any?) {
if (x is ClassLevel1? && x is ClassLevel2? && x is ClassLevel3?) {
if (x is ClassLevel4?) {
} else if (x is ClassLevel5? && x != null) {
} else if (x is ClassLevel5? && <!SENSELESS_COMPARISON!>x != null<!>) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.equals(null)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.propT
@@ -224,7 +224,7 @@ fun case_10(x: Any?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.test4()
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.test5()
}
} else if (x is ClassLevel4? && x != null && x is ClassLevel5?) {
} else if (x is ClassLevel4? && <!SENSELESS_COMPARISON!>x != null<!> && x is ClassLevel5?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.equals(null)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.propT
@@ -1255,7 +1255,7 @@ fun case_70(x: Any?) {
if (x is ClassLevel1? && x is ClassLevel2? && x is ClassLevel3?) {
if (x is ClassLevel4?) {
} else if (x is ClassLevel5? && x != nullableNothingProperty || x != implicitNullableNothingProperty) {
} else if (x is ClassLevel5? && <!SENSELESS_COMPARISON!>x != nullableNothingProperty<!> || <!SENSELESS_COMPARISON!>x != implicitNullableNothingProperty<!>) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel3")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel3")!>x<!>.equals(null)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel3")!>x<!>.propT
@@ -1267,7 +1267,7 @@ fun case_70(x: Any?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel3")!>x<!>.funNullableT()
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel3")!>x<!>.funNullableAny()
}
} else if (x is ClassLevel4? && x !== nullableNothingProperty && x is ClassLevel5?) {
} else if (x is ClassLevel4? && <!SENSELESS_COMPARISON!>x !== nullableNothingProperty<!> && x is ClassLevel5?) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.equals(null)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & ClassLevel5")!>x<!>.propT
@@ -59,7 +59,7 @@ fun case_7(x: Any?) {
// TESTCASE NUMBER: 8
fun case_8(x: Any?) {
if (x as String? == null) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String?")!>x<!><!UNSAFE_CALL!>.<!>length
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing?")!>x<!><!UNSAFE_CALL!>.<!>length
}
}