Do subtyping with stub types properly
1) Return stub type if we are calculating super type between two same stub types 2) Return nullable Any if those stub types are different
This commit is contained in:
compiler/testData/diagnostics/tests/inference/builderInference/specialCallsWithCallableReferences.kt
Vendored
+3
-3
@@ -39,7 +39,7 @@ fun <R> select(vararg x: R) = x[0]
|
||||
fun poll0(): Flow<String> {
|
||||
return flow {
|
||||
val inv = select(<!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!><!>, <!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!><!>)
|
||||
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>inv<!>()
|
||||
inv()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ fun poll17(flag: Boolean): Flow<String> {
|
||||
fun poll2(flag: Boolean): Flow<String> {
|
||||
return flow {
|
||||
val inv = when (flag) { true -> <!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!><!> else -> <!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!><!> }
|
||||
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>inv<!>()
|
||||
inv()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ fun poll26(flag: Boolean): Flow<String> {
|
||||
fun poll3(flag: Boolean): Flow<String> {
|
||||
return flow {
|
||||
val inv = when (flag) { true -> <!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!><!> false -> <!TYPE_INFERENCE_POSTPONED_VARIABLE_IN_RECEIVER_TYPE!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!><!> }
|
||||
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>inv<!>()
|
||||
inv()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vendored
+44
@@ -0,0 +1,44 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -UNCHECKED_CAST -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
fun getOut(): Inv<out R>
|
||||
fun getIn(): Inv<in R>
|
||||
}
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun <K> captureOut(x: Inv<out K>): K = null as K
|
||||
fun <K> captureIn(x: Inv<out K>): K = null as K
|
||||
fun <K> capture(x: Inv<K>): K = null as K
|
||||
|
||||
fun main() {
|
||||
build {
|
||||
emit("")
|
||||
getInv()
|
||||
captureOut(getInv())
|
||||
captureIn(getInv())
|
||||
|
||||
// K is fixed into CapturedType(out NotFixed: TypeVariable(R))
|
||||
capture(getOut())
|
||||
""
|
||||
}
|
||||
build {
|
||||
emit("")
|
||||
// K is fixed into CapturedType(in NotFixed: TypeVariable(R))
|
||||
capture(getIn())
|
||||
""
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -UNCHECKED_CAST -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
fun getOut(): Inv<out R>
|
||||
fun getIn(): Inv<in R>
|
||||
}
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun <K> captureOut(x: Inv<out K>): K = null as K
|
||||
fun <K> captureIn(x: Inv<out K>): K = null as K
|
||||
fun <K> capture(x: Inv<K>): K = null as K
|
||||
|
||||
fun main() {
|
||||
build {
|
||||
emit("")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>")!>getInv()<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>captureOut(<!DEBUG_INFO_EXPRESSION_TYPE("Inv<kotlin.String>")!>getInv()<!>)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>captureIn(<!DEBUG_INFO_EXPRESSION_TYPE("Inv<kotlin.String>")!>getInv()<!>)<!>
|
||||
|
||||
// K is fixed into CapturedType(out NotFixed: TypeVariable(R))
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>capture(<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.String>")!>getOut()<!>)<!>
|
||||
""
|
||||
}
|
||||
build {
|
||||
emit("")
|
||||
// K is fixed into CapturedType(in NotFixed: TypeVariable(R))
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>capture(<!DEBUG_INFO_EXPRESSION_TYPE("Inv<in kotlin.Any?>")!>getIn()<!>)<!>
|
||||
""
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
public fun </*0*/ K> capture(/*0*/ x: Inv<K>): K
|
||||
public fun </*0*/ K> captureIn(/*0*/ x: Inv<out K>): K
|
||||
public fun </*0*/ K> captureOut(/*0*/ x: Inv<out K>): K
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public final class Inv</*0*/ T> {
|
||||
public constructor Inv</*0*/ 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
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getIn(): Inv<in R>
|
||||
public abstract fun getInv(): Inv<R>
|
||||
public abstract fun getOut(): Inv<out R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+56
@@ -0,0 +1,56 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U) = x
|
||||
fun <E> select(vararg x: E) = x[0]
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
Test.foo(get())
|
||||
Test.foo(getInv())
|
||||
id(get())
|
||||
select(get(), get())
|
||||
select(Test.foo(get()), Test.foo(get()))
|
||||
select(Test.foo(get()), get())
|
||||
select(getInv(), getInv())
|
||||
select(Test.foo(getInv()), Test.foo(getInv()))
|
||||
select(Test.foo(getInv()), getInv())
|
||||
select(getInv(), Test.foo(getInv()))
|
||||
select(id(get()), id(get()))
|
||||
build2 {
|
||||
emit(1)
|
||||
select(this@build.get(), get())
|
||||
select(Test.foo(this@build.get()), Test.foo(get()))
|
||||
select(this@build.getInv(), getInv())
|
||||
select(Test.foo(this@build.getInv()), Test.foo(getInv()))
|
||||
select(Test.foo(this@build.getInv()), getInv())
|
||||
select(id(this@build.get()), id(get()))
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
Vendored
+56
@@ -0,0 +1,56 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U) = x
|
||||
fun <E> select(vararg x: E) = x[0]
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R)..TypeVariable(R)?)")!>Test.foo(get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<TypeVariable(R)>..Inv<TypeVariable(R)>?)")!>Test.foo(getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>id(get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>select(get(), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R)..TypeVariable(R)?)")!>select(Test.foo(get()), Test.foo(get()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R)..TypeVariable(R)?)")!>select(Test.foo(get()), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>")!>select(getInv(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<TypeVariable(R)>..Inv<TypeVariable(R)>?)")!>select(Test.foo(getInv()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<TypeVariable(R)>..Inv<TypeVariable(R)>?)")!>select(Test.foo(getInv()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<TypeVariable(R)>..Inv<TypeVariable(R)>?)")!>select(getInv(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)")!>select(id(get()), id(get()))<!>
|
||||
build2 {
|
||||
emit(1)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(this@build.get(), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(Test.foo(this@build.get()), Test.foo(get()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>")!>select(this@build.getInv(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<out kotlin.Any?>..Inv<out kotlin.Any?>?)")!>select(Test.foo(this@build.getInv()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(Inv<out kotlin.Any?>..Inv<out kotlin.Any?>?)")!>select(Test.foo(this@build.getInv()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(id(this@build.get()), id(get()))<!>
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U
|
||||
public fun </*0*/ E> select(/*0*/ vararg x: E /*kotlin.Array<out E>*/): E
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class Inv</*0*/ K> {
|
||||
public constructor Inv</*0*/ K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T!
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getInv(): Inv<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class In<in K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getIn(): In<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: In<E>): E? = x
|
||||
fun <E> select2(x: E, y: In<E?>): E = x
|
||||
fun <E> select3(x: E?, y: In<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: In<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
select1(get(), getIn())
|
||||
select1(get(), Test.foo(getIn()))
|
||||
select1(Test.foo(get()), Test.foo(getIn()))
|
||||
select1(Test.foo(get()), getIn())
|
||||
select4(get(), getIn())
|
||||
select4(get(), Test.foo(getIn()))
|
||||
select4(Test.foo(get()), Test.foo(getIn()))
|
||||
select4(Test.foo(get()), getIn())
|
||||
|
||||
select4(id(Test.foo(get())), getIn())
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select1(this@build.get(), getIn())
|
||||
select1(get(), Test.foo(this@build.getIn()))
|
||||
select1(Test.foo(this@build.get()), Test.foo(getIn()))
|
||||
select1(Test.foo(get()), this@build.getIn())
|
||||
select2(this@build.get(), getIn())
|
||||
select2(get(), Test.foo(this@build.getIn()))
|
||||
select2(Test.foo(this@build.get()), Test.foo(getIn()))
|
||||
select2(Test.foo(get()), this@build.getIn())
|
||||
select3(this@build.get(), getIn())
|
||||
select3(get(), Test.foo(this@build.getIn()))
|
||||
select3(Test.foo(this@build.get()), Test.foo(getIn()))
|
||||
select3(Test.foo(get()), this@build.getIn())
|
||||
select4(this@build.get(), getIn())
|
||||
select4(get(), Test.foo(this@build.getIn()))
|
||||
select4(Test.foo(this@build.get()), Test.foo(getIn()))
|
||||
select4(Test.foo(get()), this@build.getIn())
|
||||
|
||||
select4(id(Test.foo(this@build.get())), getIn())
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
val ret2 = build {
|
||||
emit(if (true) "" else null)
|
||||
select2(get(), getIn())
|
||||
select2(get(), Test.foo(getIn()))
|
||||
select2(Test.foo(get()), Test.foo(getIn()))
|
||||
select2(Test.foo(get()), getIn())
|
||||
select3(get(), getIn())
|
||||
select3(get(), Test.foo(getIn()))
|
||||
select3(Test.foo(get()), Test.foo(getIn()))
|
||||
select3(Test.foo(get()), getIn())
|
||||
""
|
||||
}
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class In<in K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getIn(): In<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: In<E>): E? = x
|
||||
fun <E> select2(x: E, y: In<E?>): E = x
|
||||
fun <E> select3(x: E?, y: In<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: In<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), getIn())<!>
|
||||
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(id(Test.foo(get())), getIn())<!>
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select1(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getIn()<!>)
|
||||
select1(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getIn())<!>)
|
||||
select1(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)!")!>Test.foo(getIn())<!>)
|
||||
select1(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)!")!>this@build.getIn()<!>)
|
||||
select2(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getIn()<!>)
|
||||
select2(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getIn())<!>)
|
||||
select2(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)!")!>Test.foo(getIn())<!>)
|
||||
select2(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)!")!>this@build.getIn()<!>)
|
||||
select3(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getIn()<!>)
|
||||
select3(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getIn())<!>)
|
||||
select3(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>Test.foo(getIn())<!>)
|
||||
select3(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>this@build.getIn()<!>)
|
||||
select4(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getIn()<!>)
|
||||
select4(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getIn())<!>)
|
||||
select4(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>Test.foo(getIn())<!>)
|
||||
select4(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>this@build.getIn()<!>)
|
||||
|
||||
select4(id(Test.foo(this@build.get())), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getIn()<!>)
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
val ret2 = build {
|
||||
emit(if (true) "" else null)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R1)..TypeVariable(R1)?)")!>select2(Test.foo(get()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R1)..TypeVariable(R1)?)")!>select2(Test.foo(get()), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), getIn())<!>
|
||||
""
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R1> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R1>.() -> kotlin.Unit): R1
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R2> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R2>.() -> kotlin.Unit): R2
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U?
|
||||
public fun </*0*/ E> select1(/*0*/ x: E, /*1*/ y: In<E>): E?
|
||||
public fun </*0*/ E> select2(/*0*/ x: E, /*1*/ y: In<E?>): E
|
||||
public fun </*0*/ E> select3(/*0*/ x: E?, /*1*/ y: In<E?>): E
|
||||
public fun </*0*/ E> select4(/*0*/ x: E?, /*1*/ y: In<E>): E
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class In</*0*/ in K> {
|
||||
public constructor In</*0*/ in K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T!
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getIn(): In<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class Out<out K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getOut(): Out<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: Out<E>): E? = x
|
||||
fun <E> select2(x: E, y: Out<E?>): E = x
|
||||
fun <E> select3(x: E?, y: Out<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: Out<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
select1(get(), getOut())
|
||||
select1(get(), Test.foo(getOut()))
|
||||
select1(Test.foo(get()), Test.foo(getOut()))
|
||||
select1(Test.foo(get()), getOut())
|
||||
select2(get(), getOut())
|
||||
select2(get(), Test.foo(getOut()))
|
||||
select2(Test.foo(get()), Test.foo(getOut()))
|
||||
select2(Test.foo(get()), getOut())
|
||||
select3(get(), getOut())
|
||||
select3(get(), Test.foo(getOut()))
|
||||
select3(Test.foo(get()), Test.foo(getOut()))
|
||||
select3(Test.foo(get()), getOut())
|
||||
select4(get(), getOut())
|
||||
select4(get(), Test.foo(getOut()))
|
||||
select4(Test.foo(get()), Test.foo(getOut()))
|
||||
select4(Test.foo(get()), getOut())
|
||||
|
||||
select4(id(Test.foo(get())), getOut())
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select1(this@build.get(), getOut())
|
||||
select1(get(), Test.foo(this@build.getOut()))
|
||||
select1(Test.foo(this@build.get()), Test.foo(getOut()))
|
||||
select1(Test.foo(get()), this@build.getOut())
|
||||
select2(this@build.get(), getOut())
|
||||
select2(get(), Test.foo(this@build.getOut()))
|
||||
select2(Test.foo(this@build.get()), Test.foo(getOut()))
|
||||
select2(Test.foo(get()), this@build.getOut())
|
||||
select3(this@build.get(), getOut())
|
||||
select3(get(), Test.foo(this@build.getOut()))
|
||||
select3(Test.foo(this@build.get()), Test.foo(getOut()))
|
||||
select3(Test.foo(get()), this@build.getOut())
|
||||
select4(this@build.get(), getOut())
|
||||
select4(get(), Test.foo(this@build.getOut()))
|
||||
select4(Test.foo(this@build.get()), Test.foo(getOut()))
|
||||
select4(Test.foo(get()), this@build.getOut())
|
||||
|
||||
select4(id(Test.foo(this@build.get())), getOut())
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeCovariant.kt
Vendored
+79
@@ -0,0 +1,79 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class Out<out K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getOut(): Out<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: Out<E>): E? = x
|
||||
fun <E> select2(x: E, y: Out<E?>): E = x
|
||||
fun <E> select3(x: E?, y: Out<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: Out<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R1)..TypeVariable(R1)?)")!>select2(Test.foo(get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(TypeVariable(R1)..TypeVariable(R1)?)")!>select2(Test.foo(get()), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), getOut())<!>
|
||||
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(id(Test.foo(get())), getOut())<!>
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select1(this@build.get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select1(get(), Test.foo(this@build.getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select1(Test.foo(this@build.get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select1(Test.foo(get()), this@build.getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select2(this@build.get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select2(get(), Test.foo(this@build.getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select2(Test.foo(this@build.get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select2(Test.foo(get()), this@build.getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select3(this@build.get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select3(get(), Test.foo(this@build.getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select3(Test.foo(this@build.get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select3(Test.foo(get()), this@build.getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select4(this@build.get(), getOut())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select4(get(), Test.foo(this@build.getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select4(Test.foo(this@build.get()), Test.foo(getOut()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select4(Test.foo(get()), this@build.getOut())<!>
|
||||
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select4(id(Test.foo(this@build.get())), getOut())<!>
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R1> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R1>.() -> kotlin.Unit): R1
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R2> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R2>.() -> kotlin.Unit): R2
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U?
|
||||
public fun </*0*/ E> select1(/*0*/ x: E, /*1*/ y: Out<E>): E?
|
||||
public fun </*0*/ E> select2(/*0*/ x: E, /*1*/ y: Out<E?>): E
|
||||
public fun </*0*/ E> select3(/*0*/ x: E?, /*1*/ y: Out<E?>): E
|
||||
public fun </*0*/ E> select4(/*0*/ x: E?, /*1*/ y: Out<E>): E
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class Out</*0*/ out K> {
|
||||
public constructor Out</*0*/ out K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T!
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getOut(): Out<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: Inv<E>): E? = x
|
||||
fun <E> select2(x: E, y: Inv<E?>): E = x
|
||||
fun <E> select3(x: E?, y: Inv<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: Inv<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret1 = build {
|
||||
emit("1")
|
||||
select1(get(), getInv())
|
||||
select1(get(), Test.foo(getInv()))
|
||||
select1(Test.foo(get()), Test.foo(getInv()))
|
||||
select1(Test.foo(get()), getInv())
|
||||
select4(get(), getInv())
|
||||
select4(get(), Test.foo(getInv()))
|
||||
select4(Test.foo(get()), Test.foo(getInv()))
|
||||
select4(Test.foo(get()), getInv())
|
||||
|
||||
select4(id(Test.foo(get())), getInv())
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select1(this@build.get(), getInv())
|
||||
select1(get(), Test.foo(this@build.getInv()))
|
||||
select1(Test.foo(this@build.get()), Test.foo(getInv()))
|
||||
select1(Test.foo(get()), this@build.getInv())
|
||||
select4(this@build.get(), getInv())
|
||||
select4(get(), Test.foo(this@build.getInv()))
|
||||
select4(Test.foo(this@build.get()), Test.foo(getInv()))
|
||||
select4(Test.foo(get()), this@build.getInv())
|
||||
|
||||
select4(id(Test.foo(this@build.get())), getInv())
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
|
||||
val ret2 = build {
|
||||
emit(if (true) "1" else null)
|
||||
select2(get(), getInv())
|
||||
select2(get(), Test.foo(getInv()))
|
||||
select2(Test.foo(get()), Test.foo(getInv()))
|
||||
select2(Test.foo(get()), getInv())
|
||||
select3(get(), getInv())
|
||||
select3(get(), Test.foo(getInv()))
|
||||
select3(Test.foo(get()), Test.foo(getInv()))
|
||||
select3(Test.foo(get()), getInv())
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select2(this@build.get(), getInv())
|
||||
select2(get(), Test.foo(this@build.getInv()))
|
||||
select2(Test.foo(this@build.get()), Test.foo(getInv()))
|
||||
select2(Test.foo(get()), this@build.getInv())
|
||||
select3(this@build.get(), getInv())
|
||||
select3(get(), Test.foo(this@build.getInv()))
|
||||
select3(Test.foo(this@build.get()), Test.foo(getInv()))
|
||||
select3(Test.foo(get()), this@build.getInv())
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeInvariant.kt
Vendored
+89
@@ -0,0 +1,89 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select1(x: E, y: Inv<E>): E? = x
|
||||
fun <E> select2(x: E, y: Inv<E?>): E = x
|
||||
fun <E> select3(x: E?, y: Inv<E?>): E = x!!
|
||||
fun <E> select4(x: E?, y: Inv<E>): E = x!!
|
||||
|
||||
fun test() {
|
||||
val ret1 = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(get(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)?")!>select1(Test.foo(get()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(get(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(Test.foo(get()), getInv())<!>
|
||||
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select4(id(Test.foo(get())), getInv())<!>
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select1(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getInv()<!>)
|
||||
select1(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getInv())<!>)
|
||||
select1(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)!")!>Test.foo(getInv())<!>)
|
||||
select1(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)!")!>this@build.getInv()<!>)
|
||||
select4(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getInv()<!>)
|
||||
select4(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getInv())<!>)
|
||||
select4(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>Test.foo(getInv())<!>)
|
||||
select4(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>this@build.getInv()<!>)
|
||||
|
||||
select4(id(Test.foo(this@build.get())), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getInv()<!>)
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
|
||||
val ret2 = build {
|
||||
emit(if (true) "1" else null)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(get(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(Test.foo(get()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select2(Test.foo(get()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(get(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>select3(Test.foo(get()), getInv())<!>
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
select2(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getInv()<!>)
|
||||
select2(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getInv())<!>)
|
||||
select2(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)!")!>Test.foo(getInv())<!>)
|
||||
select2(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)!")!>this@build.getInv()<!>)
|
||||
select3(this@build.get(), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>getInv()<!>)
|
||||
select3(get(), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>Test.foo(this@build.getInv())<!>)
|
||||
select3(Test.foo(this@build.get()), <!TYPE_MISMATCH("TypeVariable(R2); TypeVariable(R1)")!>Test.foo(getInv())<!>)
|
||||
select3(Test.foo(get()), <!TYPE_MISMATCH("TypeVariable(R1); TypeVariable(R2)")!>this@build.getInv()<!>)
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R1> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R1>.() -> kotlin.Unit): R1
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R2> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R2>.() -> kotlin.Unit): R2
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U?
|
||||
public fun </*0*/ E> select1(/*0*/ x: E, /*1*/ y: Inv<E>): E?
|
||||
public fun </*0*/ E> select2(/*0*/ x: E, /*1*/ y: Inv<E?>): E
|
||||
public fun </*0*/ E> select3(/*0*/ x: E?, /*1*/ y: Inv<E?>): E
|
||||
public fun </*0*/ E> select4(/*0*/ x: E?, /*1*/ y: Inv<E>): E
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class Inv</*0*/ K> {
|
||||
public constructor Inv</*0*/ K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T!
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getInv(): Inv<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
import org.jetbrains.annotations.*
|
||||
|
||||
class Test {
|
||||
@Nullable
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select(vararg x: E): E? = x[0]
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
Test.foo(get())
|
||||
Test.foo(getInv())
|
||||
id(get())
|
||||
select(get(), get())
|
||||
select(Test.foo(get()), Test.foo(get()))
|
||||
select(Test.foo(get()), get())
|
||||
select(getInv(), getInv())
|
||||
select(Test.foo(getInv()), Test.foo(getInv()))
|
||||
select(Test.foo(getInv()), getInv())
|
||||
select(getInv(), Test.foo(getInv()))
|
||||
select(id(get()), id(get()))
|
||||
build2 {
|
||||
emit(1)
|
||||
select(this@build.get(), get())
|
||||
select(Test.foo(this@build.get()), Test.foo(get()))
|
||||
select(this@build.getInv(), getInv())
|
||||
select(Test.foo(this@build.getInv()), Test.foo(getInv()))
|
||||
select(Test.foo(this@build.getInv()), getInv())
|
||||
select(id(this@build.get()), id(get()))
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
val ret2 = build {
|
||||
emit("1")
|
||||
select(get(), null)
|
||||
select(Test.foo(null), Test.foo(get()))
|
||||
select(Test.foo(get()), null)
|
||||
select(null, getInv())
|
||||
select(Test.foo(getInv()), Test.foo(null))
|
||||
select(Test.foo(null), getInv())
|
||||
select(getInv(), Test.foo(null))
|
||||
select(id(null), id(get()))
|
||||
build2 {
|
||||
emit(1)
|
||||
select(this@build.get(), get(), null)
|
||||
select(Test.foo(this@build.get()), Test.foo(get()), null)
|
||||
select(this@build.getInv(), getInv(), null)
|
||||
select(Test.foo(this@build.getInv()), Test.foo(getInv()), null)
|
||||
select(Test.foo(this@build.getInv()), getInv(), null)
|
||||
select(id(this@build.get()), id(get()), null)
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
Vendored
+81
@@ -0,0 +1,81 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
import org.jetbrains.annotations.*
|
||||
|
||||
class Test {
|
||||
@Nullable
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R> build2(@BuilderInference block: TestInterface<R>.() -> Unit): R = TODO()
|
||||
|
||||
class Inv<K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U): U? = x
|
||||
fun <E> select(vararg x: E): E? = x[0]
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>Test.foo(get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>Test.foo(getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>id(get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(get(), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(Test.foo(get()), Test.foo(get()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(Test.foo(get()), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(getInv(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(Test.foo(getInv()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(Test.foo(getInv()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(getInv(), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(id(get()), id(get()))<!>
|
||||
build2 {
|
||||
emit(1)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(this@build.get(), get())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(Test.foo(this@build.get()), Test.foo(get()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(this@build.getInv(), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(Test.foo(this@build.getInv()), Test.foo(getInv()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(Test.foo(this@build.getInv()), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(id(this@build.get()), id(get()))<!>
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
val ret2 = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(get(), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(Test.<!IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION!>foo<!>(null), Test.foo(get()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(Test.foo(get()), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(null, getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(Test.foo(getInv()), Test.<!IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION!>foo<!>(null))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(Test.<!IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION!>foo<!>(null), getInv())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<TypeVariable(R)>?")!>select(getInv(), Test.<!IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION!>foo<!>(null))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R)?")!>select(<!IMPLICIT_NOTHING_TYPE_ARGUMENT_IN_RETURN_POSITION!>id<!>(null), id(get()))<!>
|
||||
build2 {
|
||||
emit(1)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(this@build.get(), get(), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(Test.foo(this@build.get()), Test.foo(get()), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(this@build.getInv(), getInv(), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(Test.foo(this@build.getInv()), Test.foo(getInv()), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("Inv<out kotlin.Any?>?")!>select(Test.foo(this@build.getInv()), getInv(), null)<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>select(id(this@build.get()), id(get()), null)<!>
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeNullable.txt
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R>.() -> kotlin.Unit): R
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U?
|
||||
public fun </*0*/ E> select(/*0*/ vararg x: E /*kotlin.Array<out E>*/): E?
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class Inv</*0*/ K> {
|
||||
public constructor Inv</*0*/ K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
@org.jetbrains.annotations.Nullable public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T?
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getInv(): Inv<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNCHECKED_CAST -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class In<in K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getIn(): In<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U) = x
|
||||
fun <E> intersect(vararg x: In<E>): E = null as E
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
intersect(getIn(), getIn())
|
||||
intersect(getIn(), Test.foo(getIn()))
|
||||
intersect(Test.foo(getIn()), Test.foo(getIn()))
|
||||
intersect(Test.foo(getIn()), getIn())
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
intersect(this@build.getIn(), getIn())
|
||||
intersect(getIn(), Test.foo(this@build.getIn()))
|
||||
intersect(Test.foo(this@build.getIn()), Test.foo(getIn()))
|
||||
intersect(Test.foo(getIn()), this@build.getIn())
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNCHECKED_CAST -DEPRECATION -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Test.java
|
||||
|
||||
class Test {
|
||||
static <T> T foo(T x) { return x; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.experimental.ExperimentalTypeInference
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R1> build(@BuilderInference block: TestInterface<R1>.() -> Unit): R1 = TODO()
|
||||
|
||||
@UseExperimental(ExperimentalTypeInference::class)
|
||||
fun <R2> build2(@BuilderInference block: TestInterface<R2>.() -> Unit): R2 = TODO()
|
||||
|
||||
class In<in K>
|
||||
|
||||
interface TestInterface<R> {
|
||||
fun emit(r: R)
|
||||
fun get(): R
|
||||
fun getIn(): In<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U) = x
|
||||
fun <E> intersect(vararg x: In<E>): E = null as E
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit("1")
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>intersect(getIn(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>intersect(getIn(), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>intersect(Test.foo(getIn()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("TypeVariable(R1)")!>intersect(Test.foo(getIn()), getIn())<!>
|
||||
|
||||
build2 {
|
||||
emit(1)
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("{TypeVariable(R1) & TypeVariable(R2)}")!>intersect(this@build.getIn(), getIn())<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("{TypeVariable(R1) & TypeVariable(R2)}")!>intersect(getIn(), Test.foo(this@build.getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("{TypeVariable(R1) & TypeVariable(R2)}")!>intersect(Test.foo(this@build.getIn()), Test.foo(getIn()))<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("{TypeVariable(R1) & TypeVariable(R2)}")!>intersect(Test.foo(getIn()), this@build.getIn())<!>
|
||||
""
|
||||
}
|
||||
""
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R1> build(/*0*/ @kotlin.BuilderInference block: TestInterface<R1>.() -> kotlin.Unit): R1
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ R2> build2(/*0*/ @kotlin.BuilderInference block: TestInterface<R2>.() -> kotlin.Unit): R2
|
||||
public fun </*0*/ U> id(/*0*/ x: U): U
|
||||
public fun </*0*/ E> intersect(/*0*/ vararg x: In<E> /*kotlin.Array<out In<E>>*/): E
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class In</*0*/ in K> {
|
||||
public constructor In</*0*/ in K>()
|
||||
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*/ open class Test {
|
||||
public/*package*/ constructor Test()
|
||||
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
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: T!): T!
|
||||
}
|
||||
|
||||
public interface TestInterface</*0*/ R> {
|
||||
public abstract fun emit(/*0*/ r: R): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun get(): R
|
||||
public abstract fun getIn(): In<R>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+4
-1
@@ -16,10 +16,13 @@ interface TestInterface<R> {
|
||||
fun getInv(): Inv<R>
|
||||
}
|
||||
|
||||
fun <U> id(x: U) = x
|
||||
|
||||
fun test() {
|
||||
val ret = build {
|
||||
emit(1)
|
||||
emit("1")
|
||||
get()
|
||||
getInv()
|
||||
""
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user