[NI] Remove lambda coersion to Unit in case of error return type(s)

Coersion to Unit from error type leads to misleading type mismatches:
"expected <expected lambda return type> found Unit", despite no user-provided Unit / empty lambda.
These diagnostics were collected, but not reported before, and that had been disguising the issue for a while.

KT-34729 Fixed
This commit is contained in:
Pavel Kirpichenkov
2020-01-20 19:25:35 +03:00
parent 3a98c84105
commit c5893913f3
39 changed files with 263 additions and 46 deletions
@@ -0,0 +1,74 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
fun takeFnToAny(fn: () -> Any) {}
fun takeFnToUnit(fn: () -> Unit) {}
fun <P> takeFnToParameter(fn: () -> P) {}
fun testAny() {
takeFnToAny { }
takeFnToAny { Unit }
takeFnToAny { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny(fun() = Unit)
takeFnToAny(fun() {})
takeFnToAny(fun() { return })
takeFnToAny(fun() { return Unit })
takeFnToAny(fun(): Unit {})
takeFnToAny(fun(): Unit { return })
takeFnToAny(fun(): Unit { return Unit })
takeFnToAny(fun() { if (true) return })
takeFnToAny(fun() { if (true) return Unit })
takeFnToAny(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToAny(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
fun testUnit() {
takeFnToUnit { }
takeFnToUnit { Unit }
takeFnToUnit { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit(fun() = Unit)
takeFnToUnit(fun() {})
takeFnToUnit(fun() { return })
takeFnToUnit(fun() { return Unit })
takeFnToUnit(fun(): Unit {})
takeFnToUnit(fun(): Unit { return })
takeFnToUnit(fun(): Unit { return Unit })
takeFnToUnit(fun() { if (true) return })
takeFnToUnit(fun() { if (true) return Unit })
takeFnToUnit(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToUnit(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
fun testParameter() {
takeFnToParameter { }
takeFnToParameter { Unit }
takeFnToParameter { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToParameter { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToParameter {
if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>()
}
takeFnToParameter(fun() = Unit)
takeFnToParameter(fun() {})
takeFnToParameter(fun() { return })
takeFnToParameter(fun() { return Unit })
takeFnToParameter(fun(): Unit {})
takeFnToParameter(fun(): Unit { return })
takeFnToParameter(fun(): Unit { return Unit })
takeFnToParameter(fun() { if (true) return })
takeFnToParameter(fun() { if (true) return Unit })
takeFnToParameter(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToParameter(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
@@ -0,0 +1,74 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
fun takeFnToAny(fn: () -> Any) {}
fun takeFnToUnit(fn: () -> Unit) {}
fun <P> takeFnToParameter(fn: () -> P) {}
fun testAny() {
takeFnToAny { }
takeFnToAny { Unit }
takeFnToAny { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToAny(fun() = Unit)
takeFnToAny(fun() {})
takeFnToAny(fun() { return })
takeFnToAny(fun() { return Unit })
takeFnToAny(fun(): Unit {})
takeFnToAny(fun(): Unit { return })
takeFnToAny(fun(): Unit { return Unit })
takeFnToAny(fun() { if (true) return })
takeFnToAny(fun() { if (true) return Unit })
takeFnToAny(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToAny(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToAny(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
fun testUnit() {
takeFnToUnit { }
takeFnToUnit { Unit }
takeFnToUnit { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToUnit(fun() = Unit)
takeFnToUnit(fun() {})
takeFnToUnit(fun() { return })
takeFnToUnit(fun() { return Unit })
takeFnToUnit(fun(): Unit {})
takeFnToUnit(fun(): Unit { return })
takeFnToUnit(fun(): Unit { return Unit })
takeFnToUnit(fun() { if (true) return })
takeFnToUnit(fun() { if (true) return Unit })
takeFnToUnit(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToUnit(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToUnit(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
fun testParameter() {
takeFnToParameter { }
takeFnToParameter { Unit }
<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>takeFnToParameter<!> { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToParameter { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>takeFnToParameter<!> {
if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>()
}
takeFnToParameter(fun() = Unit)
takeFnToParameter(fun() {})
takeFnToParameter(fun() { return })
takeFnToParameter(fun() { return Unit })
takeFnToParameter(fun(): Unit {})
takeFnToParameter(fun(): Unit { return })
takeFnToParameter(fun(): Unit { return Unit })
takeFnToParameter(fun() { if (true) return })
takeFnToParameter(fun() { if (true) return Unit })
<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>takeFnToParameter<!>(fun() = <!UNRESOLVED_REFERENCE!>unresolved<!>())
takeFnToParameter(fun() { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun(): Unit { <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun() { return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
takeFnToParameter(fun() { if (true ) return <!UNRESOLVED_REFERENCE!>unresolved<!>() })
}
@@ -0,0 +1,8 @@
package
public fun takeFnToAny(/*0*/ fn: () -> kotlin.Any): kotlin.Unit
public fun </*0*/ P> takeFnToParameter(/*0*/ fn: () -> P): kotlin.Unit
public fun takeFnToUnit(/*0*/ fn: () -> kotlin.Unit): kotlin.Unit
public fun testAny(): kotlin.Unit
public fun testParameter(): kotlin.Unit
public fun testUnit(): kotlin.Unit