[NI] Soften restictions on using Nothing as proper constraint for full call completion
Consider lower `Nothing` constraint non-proper only if there is a dependant not analyzed postponed atom. Early completion to `Nothing` provides data flow info for smart casts. KT-35668 Fixed
This commit is contained in:
+52
@@ -0,0 +1,52 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun <K> id(it: K) = it
|
||||
|
||||
fun <E> smartCast(arg: E?, fn: () -> Any?): E = TODO()
|
||||
fun <E1> noSmartCast1(arg: E1?, fn: () -> E1): E1 = TODO()
|
||||
fun <E2> noSmartCast2(arg: E2?, fn: E2): E2 = TODO()
|
||||
fun <E3, F : E3> noSmartCast3(arg: E3?, fn: () -> F): E3 = TODO()
|
||||
fun <E4, F : E4> noSmartCast4(arg: E4?, fn: F): E4 = TODO()
|
||||
|
||||
|
||||
fun testSmartCast(s: String?) {
|
||||
id(
|
||||
if (s != null) ""
|
||||
else <!IMPLICIT_NOTHING_AS_TYPE_PARAMETER!>smartCast<!>(null) { "" }
|
||||
)
|
||||
<!DEBUG_INFO_SMARTCAST!>s<!>.length
|
||||
}
|
||||
|
||||
fun testNoSmartCast1(s: String?) {
|
||||
id(
|
||||
if (s != null) ""
|
||||
else noSmartCast1(null) { "" }
|
||||
)
|
||||
s<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
|
||||
fun testNoSmartCast2(s: String?) {
|
||||
id(
|
||||
if (s != null) ( {""} )
|
||||
else noSmartCast2(null) { "" }
|
||||
)
|
||||
s<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
|
||||
fun testNoSmartCast3(s: String?) {
|
||||
id(
|
||||
if (s != null) ""
|
||||
else noSmartCast3(null) { "" }
|
||||
)
|
||||
s<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
|
||||
// KT-36069
|
||||
fun testNoSmartCast4(s: String?) {
|
||||
id(
|
||||
if (s != null) ( {""} )
|
||||
else <!IMPLICIT_NOTHING_AS_TYPE_PARAMETER, IMPLICIT_NOTHING_AS_TYPE_PARAMETER!>noSmartCast4<!>(null) <!TYPE_MISMATCH!>{ <!TYPE_MISMATCH!>""<!> }<!>
|
||||
)
|
||||
s<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
Reference in New Issue
Block a user