[NI] Avoid building controversial systems by clipping extra constraints

#KT-23854 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2019-03-01 14:13:56 +03:00
parent 92b40ea9d5
commit 9b3e17f0d7
22 changed files with 155 additions and 34 deletions
@@ -24,7 +24,7 @@ fun foo(): String? {
run {
if (true) {
Obj()
<!IMPLICIT_CAST_TO_ANY!>Obj()<!>
} else
<!INVALID_IF_AS_EXPRESSION!>if<!> (true) return null // Error, coercion to Unit doesn't propagate inside nested lambdas
}
@@ -0,0 +1,20 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
class In<in T>
class Out<out T>
class A
class B
fun <K> select(x: K, y: K): K = x
fun <V> genericIn(x: In<V>) {}
fun <V> genericOut(x: Out<V>) {}
fun test1(a: In<A>, b: In<B>) {
genericIn(select(a, b))
}
fun test2(a: Out<A>, b: Out<B>) {
genericOut(select(a, b))
}
@@ -0,0 +1,35 @@
package
public fun </*0*/ V> genericIn(/*0*/ x: In<V>): kotlin.Unit
public fun </*0*/ V> genericOut(/*0*/ x: Out<V>): kotlin.Unit
public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
public fun test1(/*0*/ a: In<A>, /*1*/ b: In<B>): kotlin.Unit
public fun test2(/*0*/ a: Out<A>, /*1*/ b: Out<B>): kotlin.Unit
public final class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class B {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class In</*0*/ in T> {
public constructor In</*0*/ in T>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Out</*0*/ out T> {
public constructor Out</*0*/ out T>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -10,16 +10,15 @@ fun <K> select(x: K, y: K): K = x
fun <V> generic(x: Inv<V>) {}
fun test1(a: Inv<A>, b: Inv<B>) {
generic(<!TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH!>select(<!TYPE_MISMATCH, TYPE_MISMATCH!>a<!>, b)<!>)
generic(select(a, b))
}
fun test2(a: Inv<*>?, b: Inv<*>) {
generic(<!TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH!>a ?: b<!>)
generic(<!TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH!>if (a != null) <!DEBUG_INFO_SMARTCAST!>a<!> else b<!>)
generic(a ?: b)
generic(if (a != null) <!DEBUG_INFO_SMARTCAST!>a<!> else b)
generic(a!!)
}
fun test3(a: Inv<out Any>, b: Inv<out Any>) {
generic(<!TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH, TYPE_MISMATCH!>select(a, b)<!>)
generic(select(a, b))
}
@@ -0,0 +1,8 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun takeLong(i: Long) {}
fun test() {
takeLong(if (true) 1 else 0)
}
@@ -0,0 +1,4 @@
package
public fun takeLong(/*0*/ i: kotlin.Long): kotlin.Unit
public fun test(): kotlin.Unit