Approximate captured types in contravariant positions properly
^KT-43802 Fixed
This commit is contained in:
+60
@@ -0,0 +1,60 @@
|
||||
class Foo<T : Number>(var x: T) {
|
||||
fun setX1(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
}
|
||||
|
||||
fun <T : Number> Foo<T>.setX(y: T): T {
|
||||
return y
|
||||
}
|
||||
|
||||
class Foo2<T>(var x: T) {
|
||||
fun setX1(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> Foo2<T>.setX(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
|
||||
fun Float.bar() {}
|
||||
|
||||
fun test1() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("Type is unknown"), UNRESOLVED_REFERENCE!>Foo<*>::setX<!>
|
||||
val foo = Foo<Float>(1f)
|
||||
|
||||
fooSetRef.<!UNRESOLVED_REFERENCE!>invoke<!>(foo, 1)
|
||||
|
||||
foo.x.bar()
|
||||
}
|
||||
|
||||
fun test2() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo<*>, CapturedType(*), CapturedType(*)>")!>Foo<*>::setX1<!>
|
||||
val foo = Foo<Float>(1f)
|
||||
|
||||
fooSetRef.<!INAPPLICABLE_CANDIDATE!>invoke<!>(foo, 1)
|
||||
|
||||
foo.x.bar()
|
||||
}
|
||||
|
||||
fun test3() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("Type is unknown"), UNRESOLVED_REFERENCE!>Foo2<*>::setX<!>
|
||||
val foo = Foo2<Int>(1)
|
||||
|
||||
fooSetRef.<!UNRESOLVED_REFERENCE!>invoke<!>(foo, "")
|
||||
|
||||
foo.x.<!INAPPLICABLE_CANDIDATE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test4() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo2<*>, CapturedType(*), CapturedType(*)>")!>Foo2<*>::setX1<!>
|
||||
val foo = Foo2<Int>(1)
|
||||
|
||||
fooSetRef.<!INAPPLICABLE_CANDIDATE!>invoke<!>(foo, "")
|
||||
|
||||
foo.x.<!INAPPLICABLE_CANDIDATE!>bar<!>()
|
||||
}
|
||||
compiler/testData/diagnostics/tests/inference/capturedTypes/approximateContravariantCapturedTypes.kt
Vendored
+60
@@ -0,0 +1,60 @@
|
||||
class Foo<T : Number>(var x: T) {
|
||||
fun setX1(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
}
|
||||
|
||||
fun <T : Number> Foo<T>.setX(y: T): T {
|
||||
return y
|
||||
}
|
||||
|
||||
class Foo2<T>(var x: T) {
|
||||
fun setX1(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> Foo2<T>.setX(y: T): T {
|
||||
this.x = y
|
||||
return y
|
||||
}
|
||||
|
||||
fun Float.bar() {}
|
||||
|
||||
fun test1() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo<*>, kotlin.Nothing, kotlin.Number>")!>Foo<*>::<!TYPE_MISMATCH("Nothing; Foo<*>")!>setX<!><!>
|
||||
val foo = Foo<Float>(1f)
|
||||
|
||||
fooSetRef.invoke(foo, <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
|
||||
|
||||
foo.x.bar()
|
||||
}
|
||||
|
||||
fun test2() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo<*>, kotlin.Nothing, kotlin.Number>")!>Foo<*>::setX1<!>
|
||||
val foo = Foo<Float>(1f)
|
||||
|
||||
fooSetRef.invoke(foo, <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
|
||||
|
||||
foo.x.bar()
|
||||
}
|
||||
|
||||
fun test3() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo2<*>, kotlin.Nothing, kotlin.Any?>")!>Foo2<*>::<!TYPE_MISMATCH("Nothing; Foo2<*>")!>setX<!><!>
|
||||
val foo = Foo2<Int>(1)
|
||||
|
||||
fooSetRef.invoke(foo, <!TYPE_MISMATCH!>""<!>)
|
||||
|
||||
foo.x.<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>bar<!>()
|
||||
}
|
||||
|
||||
fun test4() {
|
||||
val fooSetRef = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<Foo2<*>, kotlin.Nothing, kotlin.Any?>")!>Foo2<*>::setX1<!>
|
||||
val foo = Foo2<Int>(1)
|
||||
|
||||
fooSetRef.invoke(foo, <!TYPE_MISMATCH!>""<!>)
|
||||
|
||||
foo.x.<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>bar<!>()
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package
|
||||
|
||||
public fun test1(): kotlin.Unit
|
||||
public fun test2(): kotlin.Unit
|
||||
public fun test3(): kotlin.Unit
|
||||
public fun test4(): kotlin.Unit
|
||||
public fun kotlin.Float.bar(): kotlin.Unit
|
||||
public fun </*0*/ T> Foo2<T>.setX(/*0*/ y: T): T
|
||||
public fun </*0*/ T : kotlin.Number> Foo<T>.setX(/*0*/ y: T): T
|
||||
|
||||
public final class Foo</*0*/ T : kotlin.Number> {
|
||||
public constructor Foo</*0*/ T : kotlin.Number>(/*0*/ x: T)
|
||||
public final var 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 final fun setX1(/*0*/ y: T): T
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class Foo2</*0*/ T> {
|
||||
public constructor Foo2</*0*/ T>(/*0*/ x: T)
|
||||
public final var 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 final fun setX1(/*0*/ y: T): T
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user