KT-6803 Subtyping breaks on star-projections for recursive generics

Star-projections have upper bounds of the form "parameter's bound where all parameter of the same class are substituted with their star-projections"

  #KT-6803 Fixed
This commit is contained in:
Andrey Breslav
2015-03-03 18:26:47 +03:00
parent 11b693c3be
commit e0b7e4efca
15 changed files with 127 additions and 17 deletions
@@ -9,10 +9,10 @@ fun main(args : Array<String>) {
val <!UNUSED_VARIABLE!>a<!> : C<Int> = C();
val <!UNUSED_VARIABLE!>x<!> : C<in String> = C()
val <!UNUSED_VARIABLE!>y<!> : C<out String> = C()
val <!UNUSED_VARIABLE!>z<!> : C<*> = C()
val <!UNUSED_VARIABLE!>z<!> : C<*> = <!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>C<!>()
val <!UNUSED_VARIABLE!>ba<!> : C<Int> = bar();
val <!UNUSED_VARIABLE!>bx<!> : C<in String> = bar()
val <!UNUSED_VARIABLE!>by<!> : C<out String> = bar()
val <!UNUSED_VARIABLE!>bz<!> : C<*> = bar()
}
val <!UNUSED_VARIABLE!>bz<!> : C<*> = <!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>()
}
@@ -0,0 +1,24 @@
// !CHECK_TYPE
trait A<R, T: A<R, T>> {
fun r(): R
fun t(): T
}
fun testA(a: A<*, *>) {
a.r().checkType { it : _<Any?> }
a.t().checkType { it : _<A<*, *>> }
}
trait B<R, T: B<List<R>, <!UPPER_BOUND_VIOLATED!>T<!>>> {
fun r(): R
fun t(): T
}
fun testB(b: B<*, *>) {
b.r().checkType { it : _<Any?> }
b.t().checkType { it : _<B<List<*>, *>> }
b.t().r().size()
}
@@ -0,0 +1,20 @@
package
internal fun testA(/*0*/ a: A<*, *>): kotlin.Unit
internal fun testB(/*0*/ b: B<*, *>): kotlin.Unit
internal trait A</*0*/ R, /*1*/ T : A<R, 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
internal abstract fun r(): R
internal abstract fun t(): T
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal trait B</*0*/ R, /*1*/ T : B<kotlin.List<R>, 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
internal abstract fun r(): R
internal abstract fun t(): T
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}