[NI] Fix unit coercion

Consider following case:

fun foo(): Unit = run { "hello" }

Previously, NI would analyze lambda body without expected type, because
it is a type variable 'R' from 'run', which hasn't been fixed yet. This
leads to treating "hello" as lambda-return argument and adding bogus
'String' constraint on 'R', and, consequently, type mismatch.

Now, we peek into current constraint system and check if return-type of
lambda is type variable with upper-Unit constraint (which is exactly
condition for its body to be Unit-coerced). If so, then we provide
expected Unit-type for body explicitly, and the rest will be done
automatically (in particular, in aforementioned example "hello" wouldn't
be treated as lambda return argument).
This commit is contained in:
Dmitry Savvinov
2018-01-17 19:03:11 +03:00
parent b3eeb2f735
commit 44920f42d8
14 changed files with 257 additions and 3 deletions
@@ -0,0 +1,6 @@
package
public fun noCoercionBlockHasExplicitReturn(): kotlin.Unit
public fun noCoercionBlockHasExplicitType(): kotlin.Unit
public fun noCoercionInExpressionBody(): kotlin.Unit
public fun noCoercionLastExpressionUsedAsReturnArgument(): kotlin.Unit