Fix common supertype calculation

Use star-projections instead of 'out Any?' in corner cases

 #KT-11468 Fixed
This commit is contained in:
Denis Zharkov
2016-03-17 14:56:21 +03:00
parent bace881463
commit ce8add2802
9 changed files with 111 additions and 5 deletions
@@ -0,0 +1,8 @@
interface In<in E>
class En<T> : In<T>
class A : In<A>
fun <T> select(x: T, y: T): T = x ?: y
// Return type should be In<*> nor In<out Any?>
fun foobar(e: En<*>) = select(A(), e)
@@ -0,0 +1,24 @@
package
public fun foobar(/*0*/ e: En<*>): In<*>
public fun </*0*/ T> select(/*0*/ x: T, /*1*/ y: T): T
public final class A : In<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 En</*0*/ T> : In<T> {
public constructor En</*0*/ 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 interface In</*0*/ in E> {
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
}
@@ -0,0 +1,7 @@
interface In<in E>
class A : In<A>
class B : In<B>
fun <T> select(x: T, y: T) = x ?: y
// Return type should be In<*> nor In<out Any?>
fun foobar(a: A, b: B) = select(a, b)
@@ -0,0 +1,24 @@
package
public fun foobar(/*0*/ a: A, /*1*/ b: B): In<*>
public fun </*0*/ T> select(/*0*/ x: T, /*1*/ y: T): T
public final class A : In<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 : In<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 interface In</*0*/ in E> {
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
}