K2: Fix generic inference case with !! synthetic call
Result of the `checkNotNull` calls should always be a non-nullable values. The simplest idea how to acheive it is adding not-nullable Any bound to the type parameter declaration. Existing comment stating about impossibility of such bound seems to be not 100% correct because it doesn't take into account presence of definitely-non-nullable X & Any types that allow described case with nullable generic. ^KT-55804 Fixed
This commit is contained in:
committed by
Space Team
parent
352316ba9f
commit
56557fb8ff
@@ -1,3 +1,3 @@
|
||||
fun main() {
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!><!UNSUPPORTED!>[]<!><!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>!!<!>
|
||||
<!UNSUPPORTED!>[]<!><!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!><!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// FIR_DUMP
|
||||
// ISSUE: KT-55804
|
||||
|
||||
fun foo() {
|
||||
val x: String?
|
||||
x = materialize()!! // Should be treated as non-nullable assignment
|
||||
x.length // Should be allowed
|
||||
}
|
||||
|
||||
fun <E> materialize(): E = TODO()
|
||||
|
||||
fun <F> test(f: F) = f!!
|
||||
|
||||
fun main() {
|
||||
test<String>("").length
|
||||
test<String?>(null).length // `.length` should be allowed because return type of "test" should be inferred to `F & Any`
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
FILE: exclExclInference.fir.kt
|
||||
public final fun foo(): R|kotlin/Unit| {
|
||||
lval x: R|kotlin/String?|
|
||||
R|<local>/x| = R|/materialize|<R|kotlin/String?|>()!!
|
||||
R|<local>/x|.R|kotlin/String.length|
|
||||
}
|
||||
public final fun <E> materialize(): R|E| {
|
||||
^materialize R|kotlin/TODO|()
|
||||
}
|
||||
public final fun <F> test(f: R|F|): R|F & Any| {
|
||||
^test R|<local>/f|!!
|
||||
}
|
||||
public final fun main(): R|kotlin/Unit| {
|
||||
R|/test|<R|kotlin/String|>(String()).R|kotlin/String.length|
|
||||
R|/test|<R|kotlin/String?|>(Null(null)).R|kotlin/String.length|
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// FIR_DUMP
|
||||
// ISSUE: KT-55804
|
||||
|
||||
fun foo() {
|
||||
val x: String?
|
||||
x = materialize()!! // Should be treated as non-nullable assignment
|
||||
<!DEBUG_INFO_SMARTCAST!>x<!>.length // Should be allowed
|
||||
}
|
||||
|
||||
fun <E> materialize(): E = TODO()
|
||||
|
||||
fun <F> test(f: F) = f!!
|
||||
|
||||
fun main() {
|
||||
test<String>("").length
|
||||
test<String?>(null).length // `.length` should be allowed because return type of "test" should be inferred to `F & Any`
|
||||
}
|
||||
@@ -4,8 +4,8 @@ import java.lang.Exception
|
||||
fun <K> id(arg: K): K = arg
|
||||
|
||||
fun test() {
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id(<!UNRESOLVED_REFERENCE!>unresolved<!>)!!<!>
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!><!UNRESOLVED_REFERENCE!>unresolved<!>!!!!<!>
|
||||
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)!!
|
||||
<!UNRESOLVED_REFERENCE!>unresolved<!>!!<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>try {
|
||||
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)
|
||||
} catch (e: Exception) {
|
||||
|
||||
Reference in New Issue
Block a user