KT-10460: use unsubstituted descriptors
while comparing overloaded generic functions for specificity.
This commit is contained in:
@@ -20,7 +20,7 @@ class Inv<T>() {
|
||||
fun testInOut() {
|
||||
In<String>().f("1");
|
||||
(null <!CAST_NEVER_SUCCEEDS!>as<!> In<<!REDUNDANT_PROJECTION!>in<!> String>).f("1")
|
||||
(null <!CAST_NEVER_SUCCEEDS!>as<!> In<*>).f(<!TYPE_MISMATCH!>"1"<!>) // Wrong Arg
|
||||
(null <!CAST_NEVER_SUCCEEDS!>as<!> In<*>).<!NONE_APPLICABLE!>f<!>("1") // Wrong Arg
|
||||
|
||||
In<String>().f(1);
|
||||
(null <!CAST_NEVER_SUCCEEDS!>as<!> In<<!REDUNDANT_PROJECTION!>in<!> String>).f(1)
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -REDUNDANT_PROJECTION
|
||||
|
||||
class In<in T>() {
|
||||
fun f(t : T) {}
|
||||
fun f(t : Int) = t
|
||||
}
|
||||
|
||||
fun test1(x: In<String>): Unit = x.f("1")
|
||||
fun test2(x: In<in String>): Unit = x.f("1")
|
||||
fun test3(x: In<<!CONFLICTING_PROJECTION!>out<!> String>): Unit = x.<!NONE_APPLICABLE!>f<!>("1")
|
||||
fun test4(x: In<*>): Unit = x.<!NONE_APPLICABLE!>f<!>("1")
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package
|
||||
|
||||
public fun test1(/*0*/ x: In<kotlin.String>): kotlin.Unit
|
||||
public fun test2(/*0*/ x: In<in kotlin.String>): kotlin.Unit
|
||||
public fun test3(/*0*/ x: In<out kotlin.String>): kotlin.Unit
|
||||
public fun test4(/*0*/ x: In<*>): kotlin.Unit
|
||||
|
||||
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 final fun f(/*0*/ t: T): kotlin.Unit
|
||||
public final fun f(/*0*/ t: kotlin.Int): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
interface AutoCloseable
|
||||
interface Closeable : AutoCloseable
|
||||
|
||||
fun <T1 : AutoCloseable, R1> T1.myUse(f: (T1) -> R1): R1 = f(this)
|
||||
fun <T2 : Closeable, R2> T2.myUse(f: (T2) -> R2): R2 = f(this)
|
||||
|
||||
fun test1(x: Closeable) = x.myUse { 42 }
|
||||
fun test2(x: Closeable) = x.myUse<Closeable, Int> { 42 }
|
||||
fun test3(x: Closeable) = x.myUse<<!UPPER_BOUND_VIOLATED!>AutoCloseable<!>, Int> { 42 } // TODO KT-10681
|
||||
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public fun test1(/*0*/ x: Closeable): kotlin.Int
|
||||
public fun test2(/*0*/ x: Closeable): kotlin.Int
|
||||
public fun test3(/*0*/ x: Closeable): kotlin.Int
|
||||
public fun </*0*/ T1 : AutoCloseable, /*1*/ R1> T1.myUse(/*0*/ f: (T1) -> R1): R1
|
||||
public fun </*0*/ T2 : Closeable, /*1*/ R2> T2.myUse(/*0*/ f: (T2) -> R2): R2
|
||||
|
||||
public interface AutoCloseable {
|
||||
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 Closeable : AutoCloseable {
|
||||
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
|
||||
}
|
||||
+2
-2
@@ -17,8 +17,8 @@ val y2: B<Int> = B("")
|
||||
val y3: B<Int> = B<Int>(1)
|
||||
val y4: B<Int> = B<Int>("")
|
||||
|
||||
val y5: B<String> = <!NONE_APPLICABLE!>B<!><String>(1)
|
||||
val y6: B<String> = <!OVERLOAD_RESOLUTION_AMBIGUITY!>B<!><String>("") // TODO: doesn't work here but ok on y8
|
||||
val y5: B<String> = B<String>(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
|
||||
val y6: B<String> = B<String>("")
|
||||
val y7: B<String> = <!TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>B(1)<!>
|
||||
val y8: B<String> = B("")
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ class A0<T1, T2> {
|
||||
|
||||
constructor(x: T1, y: T2, z: T2): this(x, 1) // ok, delegates to constructor(x: T1, y: Int)
|
||||
|
||||
constructor(x: T1, y: Int): <!NONE_APPLICABLE!>this<!>(x, "")
|
||||
constructor(x: T1, y: Int): this(x, <!TYPE_MISMATCH!>""<!>)
|
||||
constructor(x: T1): this(x, 1)
|
||||
constructor(x: T1, y: T2, z: String): <!NONE_APPLICABLE!>this<!>(y, x)
|
||||
constructor(x: T1, y: T2, z: String): this(<!TYPE_MISMATCH!>y<!>, <!TYPE_MISMATCH!>x<!>)
|
||||
}
|
||||
|
||||
class A1<T1, T2> : B<T1, T2> {
|
||||
|
||||
+2
-2
@@ -18,8 +18,8 @@ class Inv<T>() {
|
||||
fun testInOut() {
|
||||
In<String>().`In.f:T->Unit`f("1");
|
||||
(return as In<in String>).`In.f:T->Unit`f("1");
|
||||
(return as In<out String>).`In.f:T->Unit`f("1")
|
||||
(return as In<*>).`In.f:T->Unit`f("1");
|
||||
(return as In<out String>).`!null`f("1")
|
||||
(return as In<*>).`!null`f("1");
|
||||
|
||||
In<String>().`In.f:Int->Int`f(1);
|
||||
(return as In<in String>).`In.f:Int->Int`f(1);
|
||||
|
||||
Reference in New Issue
Block a user