[FIR] Fix type constraint for type parameter ^KT-45345 Fixed
This commit is contained in:
+1
-1
@@ -390,7 +390,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
|
||||
when (val operation = typeOperatorCall.operation) {
|
||||
FirOperation.IS, FirOperation.NOT_IS -> {
|
||||
val expressionVariable = variableStorage.createSyntheticVariable(typeOperatorCall)
|
||||
val isNotNullCheck = type.nullability == ConeNullability.NOT_NULL
|
||||
val isNotNullCheck = !type.canBeNull
|
||||
val isRegularIs = operation == FirOperation.IS
|
||||
if (operandVariable.isReal()) {
|
||||
val hasTypeInfo = operandVariable typeEq type
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
|
||||
inline fun <T, reified S> foo(x: T?, y: T): T {
|
||||
if (x is S) return x
|
||||
if (x is S) return <!RETURN_TYPE_MISMATCH!>x<!>
|
||||
return y
|
||||
}
|
||||
|
||||
+18
@@ -67,6 +67,24 @@ fun kt4565_2(a: SomeClass?) {
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : SomeClass> kt45345(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
a.data
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : U, U : SomeClass> kt45345_2(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
a.data
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : U, U : SomeClass?> kt45345_3(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
a<!UNSAFE_CALL!>.<!>data
|
||||
}
|
||||
}
|
||||
|
||||
class A(val y: Int)
|
||||
|
||||
fun kt7491_1() {
|
||||
|
||||
+18
@@ -67,6 +67,24 @@ fun kt4565_2(a: SomeClass?) {
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : SomeClass> kt45345(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
<!DEBUG_INFO_SMARTCAST!>a<!>.data
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : U, U : SomeClass> kt45345_2(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
<!DEBUG_INFO_SMARTCAST!>a<!>.data
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T : U, U : SomeClass?> kt45345_3(a: SomeClass?) {
|
||||
if (a?.data is T) {
|
||||
a<!UNSAFE_CALL!>.<!>data
|
||||
}
|
||||
}
|
||||
|
||||
class A(val y: Int)
|
||||
|
||||
fun kt7491_1() {
|
||||
|
||||
+3
@@ -10,6 +10,9 @@ public fun kt11313(/*0*/ arg: HttpExchange?): kotlin.Unit
|
||||
public fun kt1635(/*0*/ s: kotlin.String?): kotlin.Unit
|
||||
public fun kt2127(): kotlin.Unit
|
||||
public fun kt3356(/*0*/ s: kotlin.String?): kotlin.Int
|
||||
public inline fun </*0*/ reified T : SomeClass> kt45345(/*0*/ a: SomeClass?): kotlin.Unit
|
||||
public inline fun </*0*/ reified T : U, /*1*/ U : SomeClass> kt45345_2(/*0*/ a: SomeClass?): kotlin.Unit
|
||||
public inline fun </*0*/ reified T : U, /*1*/ U : SomeClass?> kt45345_3(/*0*/ a: SomeClass?): kotlin.Unit
|
||||
public fun kt4565_1(/*0*/ a: SomeClass?): kotlin.Unit
|
||||
public fun kt4565_2(/*0*/ a: SomeClass?): kotlin.Unit
|
||||
public fun kt6840_1(/*0*/ s: kotlin.String?): kotlin.Unit
|
||||
|
||||
+2
-2
@@ -22,7 +22,7 @@ class Case1<AT>(val x: AT) {
|
||||
|
||||
when (k) {
|
||||
is AT -> {
|
||||
k checkType { <!NONE_APPLICABLE!>check<!><AT>() }
|
||||
k checkType { check<AT>() }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ class Case1<AT>(val x: AT) {
|
||||
val k: AT = x!!
|
||||
|
||||
if (k is AT) {
|
||||
k checkType { <!NONE_APPLICABLE!>check<!><AT>() }
|
||||
k checkType { check<AT>() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
*/
|
||||
inline fun <reified T, reified K> case_1(x: T) {
|
||||
if (x is K) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T & K!! & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T & K!! & T!!")!>x<!>.equals(x)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T & K & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T & K & T")!>x<!><!UNSAFE_CALL!>.<!>equals(x)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,8 +31,8 @@ inline fun <reified T, reified K> case_3() {
|
||||
var x: T? = 10 as T
|
||||
x = null
|
||||
if (x is K) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & kotlin.Nothing")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & kotlin.Nothing? & K")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & kotlin.Nothing? & K")!>x<!>
|
||||
println(1)
|
||||
}
|
||||
}
|
||||
@@ -40,8 +40,8 @@ inline fun <reified T, reified K> case_3() {
|
||||
// TESTCASE NUMBER: 4
|
||||
inline fun <reified T, reified K> case_4(x: T?) {
|
||||
if (x is K) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & K!! & T?!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & K!! & T?!!")!>x<!>.equals(x)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & K & T?")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("T? & K & T?")!>x<!><!UNSAFE_CALL!>.<!>equals(x)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
inline fun <reified T> case_1(x: Any?) {
|
||||
when (x) {
|
||||
is T -> {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
}
|
||||
else -> return
|
||||
}
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
@@ -23,13 +23,13 @@ inline fun <reified T> case_2(x: Any?) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.equals(10)
|
||||
}
|
||||
is T -> {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
}
|
||||
else -> return
|
||||
}
|
||||
<!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)
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
@@ -61,11 +61,11 @@ inline fun <reified T> case_4(x: Any?) {
|
||||
// TESTCASE NUMBER: 5
|
||||
inline fun <reified T> case_5(x: Any?) {
|
||||
if (x is T) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
} else return
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
@@ -81,9 +81,9 @@ inline fun <reified T> case_7(x: Any?) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Any")!>x<!>.equals(10)
|
||||
} else if (x is T) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>.equals(10)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!><!UNSAFE_CALL!>.<!>equals(10)
|
||||
} else return
|
||||
<!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)
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ fun case_11(x: Any?) {
|
||||
inline fun <reified T, reified K>case_12(x: Any?) {
|
||||
if (x is T) {
|
||||
if (<!USELESS_IS_CHECK!>x is T<!> is K) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,7 +127,7 @@ inline fun <reified T, reified K>case_12(x: Any?) {
|
||||
inline fun <reified T, reified K>case_13(x: Any?) {
|
||||
if (x is T) {
|
||||
if (x is K) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!! & K!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T & K")!>x<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ inline fun <reified T, reified K>case_13(x: Any?) {
|
||||
inline fun <reified T, reified K>case_14(x: Any?) {
|
||||
if (x is T) {
|
||||
if (<!USELESS_IS_CHECK!>x !is T<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ inline fun <reified T, reified K>case_14(x: Any?) {
|
||||
inline fun <reified T, reified K>case_15(x: Any?) {
|
||||
if (x !is T) {
|
||||
if (x is T) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T!!")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & T")!>x<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user