15a595749b
The issue here is that OI infers correct types for (k, v) destructing declaration, while NI infers errors for them. That happens because NI resolves iterator() on nullable 'm', but rightfully reports it as unsuccessful, while OI somehow manages to resolve it to success (and thus getting nice expected type, allowing destructing declaration to be resolved in a proper types).
20 lines
786 B
Kotlin
Vendored
20 lines
786 B
Kotlin
Vendored
// !WITH_NEW_INFERENCE
|
|
fun create(): Map<String, String> = null!!
|
|
|
|
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = null!!
|
|
|
|
operator fun <K, V> Map.Entry<K, V>.component1() = key
|
|
|
|
operator fun <K, V> Map.Entry<K, V>.component2() = value
|
|
|
|
class MyClass {
|
|
private var m: Map<String, String>? = null
|
|
fun foo(): Int {
|
|
var res = 0
|
|
m = create()
|
|
// See KT-7428
|
|
for ((k, v) in <!SMARTCAST_IMPOSSIBLE!>m<!>)
|
|
res <!NI;OVERLOAD_RESOLUTION_AMBIGUITY!>+=<!> (<!NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>k<!>.<!NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>length<!> <!NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> <!NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v<!>.<!NI;DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>length<!>)
|
|
return res
|
|
}
|
|
} |