NI: Approximate captured-for-star-projections to *

^KT-35602 Fixed
This commit is contained in:
Denis Zharkov
2019-12-23 18:03:54 +03:00
parent 7728102a77
commit 0b385cc532
14 changed files with 434 additions and 228 deletions
@@ -0,0 +1,22 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun <X> id(x: X): X = x
fun main() {
bar().x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
id(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
outBar().x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
id(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
}
@@ -0,0 +1,22 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun <X> id(x: X): X = x
fun main() {
bar().x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
id(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
outBar().x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
id(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
}
@@ -0,0 +1,24 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
fun foo(): Self<*>? = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun outFoo(): OutSelf<*>? = TODO()
fun main() {
bar().x.x.x.x.x.x.x.x.x.x.x.x.x // OK
foo()!!.x.x.x.x.x.x // OK
foo()!!.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x // unresolved x in NI
outBar().x.x.x.x.x.x.x.x.x.x.x.x.x // OK
outFoo()!!.x.x.x.x.x.x // OK
outFoo()!!.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x // unresolved x in NI
}
@@ -0,0 +1,24 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
fun foo(): Self<*>? = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun outFoo(): OutSelf<*>? = TODO()
fun main() {
bar().x.x.x.x.x.x.x.x.x.x.x.x.x // OK
foo()!!.x.x.x.x.x.x // OK
foo()!!.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x // unresolved x in NI
outBar().x.x.x.x.x.x.x.x.x.x.x.x.x // OK
outFoo()!!.x.x.x.x.x.x // OK
outFoo()!!.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x // unresolved x in NI
}
@@ -0,0 +1,29 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
// FILE: JavaClass.java
public class JavaClass {
public static <T extends Self<?>> Self<T> id1Inv(T t) { return null; }
public static <T extends Self<?>> T id2Inv(T t) { return null; }
public static <T extends OutSelf<?>> OutSelf<T> id1Out(T t) { return null; }
public static <T extends OutSelf<?>> T id2Out(T t) { return null; }
}
// FILE: main.kt
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun main() {
JavaClass.id1Inv(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id2Inv(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id1Out(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id2Out(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
}
@@ -0,0 +1,29 @@
// SKIP_TXT
// !LANGUAGE: +NewInference
// FILE: JavaClass.java
public class JavaClass {
public static <T extends Self<?>> Self<T> id1Inv(T t) { return null; }
public static <T extends Self<?>> T id2Inv(T t) { return null; }
public static <T extends OutSelf<?>> OutSelf<T> id1Out(T t) { return null; }
public static <T extends OutSelf<?>> T id2Out(T t) { return null; }
}
// FILE: main.kt
interface Self<E : Self<E>> {
val x: E
}
fun bar(): Self<*> = TODO()
interface OutSelf<out E : OutSelf<E>> {
val x: E
}
fun outBar(): OutSelf<*> = TODO()
fun main() {
JavaClass.id1Inv(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id2Inv(bar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id1Out(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
JavaClass.id2Out(outBar()).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
}