Type<*> is inferred now if Type<A> and Type<B> common supertype is Type<X> and X is not within parameter upper bound. #KT-7585 Fixed. #EA-68943 Fixed.
It provides also a fix for KT-7585 (empty type intersection assertion). A set of relevant tests, one fixed test
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package
|
||||
|
||||
internal val x: kotlin.Enum<out kotlin.Enum<out kotlin.Enum<out kotlin.Enum<out kotlin.Enum<out kotlin.Any?>>>>>
|
||||
internal val x: kotlin.Enum<*>
|
||||
|
||||
internal final enum class A : kotlin.Enum<A> {
|
||||
enum entry A
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
open class A
|
||||
|
||||
class E
|
||||
|
||||
abstract class Wrapper<T: A>(protected val t: T)
|
||||
|
||||
class MyWrapper(a: A): Wrapper<A>(a)
|
||||
|
||||
// This wrapper is not legal
|
||||
class TheirWrapper(e: E): Wrapper<<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>E<!>>(e)
|
||||
|
||||
data class Pair<out T>(val a: T, val b: T)
|
||||
|
||||
fun foo(): String {
|
||||
val matrix: Pair<Wrapper<*>>
|
||||
// It's not legal to do such a thing because E is not derived from A
|
||||
// But we should not have assertion errors because of it!
|
||||
matrix = Pair(MyWrapper(A()), TheirWrapper(E()))
|
||||
return matrix.toString()
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package
|
||||
|
||||
internal fun foo(): kotlin.String
|
||||
|
||||
internal open 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
|
||||
}
|
||||
|
||||
internal final class E {
|
||||
public constructor 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
|
||||
}
|
||||
|
||||
internal final class MyWrapper : Wrapper<A> {
|
||||
public constructor MyWrapper(/*0*/ a: A)
|
||||
protected final override /*1*/ /*fake_override*/ val t: 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
|
||||
}
|
||||
|
||||
kotlin.data() internal final class Pair</*0*/ out T> {
|
||||
public constructor Pair</*0*/ out T>(/*0*/ a: T, /*1*/ b: T)
|
||||
internal final val a: T
|
||||
internal final val b: T
|
||||
internal final /*synthesized*/ fun component1(): T
|
||||
internal final /*synthesized*/ fun component2(): T
|
||||
public final /*synthesized*/ fun copy(/*0*/ a: T = ..., /*1*/ b: T = ...): Pair<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
|
||||
}
|
||||
|
||||
internal final class TheirWrapper : Wrapper<E> {
|
||||
public constructor TheirWrapper(/*0*/ e: E)
|
||||
protected final override /*1*/ /*fake_override*/ val t: 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
|
||||
}
|
||||
|
||||
internal abstract class Wrapper</*0*/ T : A> {
|
||||
public constructor Wrapper</*0*/ T : A>(/*0*/ t: T)
|
||||
protected final val t: 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
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// FILE: A.java
|
||||
|
||||
class A {}
|
||||
|
||||
// FILE: Wrapper.java
|
||||
|
||||
abstract class Wrapper<T extends A> {
|
||||
protected T t;
|
||||
|
||||
Wrapper(T t) { this.t = t; }
|
||||
}
|
||||
|
||||
// FILE: kt7585.kt
|
||||
|
||||
class E
|
||||
|
||||
class MyWrapper(a: A): Wrapper<A>(a)
|
||||
|
||||
// This wrapper is not legal
|
||||
class TheirWrapper(e: E): Wrapper<<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>E<!>>(e)
|
||||
|
||||
data class Pair<out T>(val a: T, val b: T)
|
||||
|
||||
fun foo(): String {
|
||||
val matrix: Pair<Wrapper<*>>
|
||||
// It's not legal to do such a thing because E is not derived from A
|
||||
// But we should not have assertion errors because of it!
|
||||
matrix = Pair(MyWrapper(A()), TheirWrapper(E()))
|
||||
return matrix.toString()
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package
|
||||
|
||||
internal fun foo(): kotlin.String
|
||||
|
||||
public/*package*/ open class A {
|
||||
public/*package*/ 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
|
||||
}
|
||||
|
||||
internal final class E {
|
||||
public constructor 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
|
||||
}
|
||||
|
||||
internal final class MyWrapper : Wrapper<A> {
|
||||
public constructor MyWrapper(/*0*/ a: A)
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var t: 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
|
||||
}
|
||||
|
||||
kotlin.data() internal final class Pair</*0*/ out T> {
|
||||
public constructor Pair</*0*/ out T>(/*0*/ a: T, /*1*/ b: T)
|
||||
internal final val a: T
|
||||
internal final val b: T
|
||||
internal final /*synthesized*/ fun component1(): T
|
||||
internal final /*synthesized*/ fun component2(): T
|
||||
public final /*synthesized*/ fun copy(/*0*/ a: T = ..., /*1*/ b: T = ...): Pair<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
|
||||
}
|
||||
|
||||
internal final class TheirWrapper : Wrapper<E> {
|
||||
public constructor TheirWrapper(/*0*/ e: E)
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var t: 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
|
||||
}
|
||||
|
||||
public/*package*/ abstract class Wrapper</*0*/ T : A!> {
|
||||
public/*package*/ constructor Wrapper</*0*/ T : A!>(/*0*/ t: T!)
|
||||
protected/*protected and package*/ final var t: 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
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
interface X {
|
||||
fun foo(): Int = 42
|
||||
}
|
||||
|
||||
interface Y
|
||||
|
||||
class A: X, Y
|
||||
|
||||
class B: X, Y
|
||||
|
||||
class Out<out T: X>(val x: T)
|
||||
|
||||
fun bar(a: Out<A>, b: Out<B>, f: Boolean): Int {
|
||||
val x = if (f) a else b
|
||||
return x.x.foo()
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package
|
||||
|
||||
internal fun bar(/*0*/ a: Out<A>, /*1*/ b: Out<B>, /*2*/ f: kotlin.Boolean): kotlin.Int
|
||||
|
||||
internal final class A : X, Y {
|
||||
public constructor A()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ /*fake_override*/ fun foo(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class B : X, Y {
|
||||
public constructor B()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ /*fake_override*/ fun foo(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class Out</*0*/ out T : X> {
|
||||
public constructor Out</*0*/ out T : X>(/*0*/ x: T)
|
||||
internal final val x: 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
|
||||
}
|
||||
|
||||
internal interface X {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface Y {
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user