Don't add LHS type constraint for callable references too early, before the resolution
The constraint depends on a resolution candidate, because it can be Java static or companion object's member (don't need add constraint in this case) ^KT-41978 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
fd2929d2c5
commit
43a83dd07a
+29
@@ -0,0 +1,29 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
|
||||
import kotlin.reflect.KProperty0
|
||||
|
||||
class Sample {
|
||||
companion object {
|
||||
const val maxValue = 1
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::maxValue,
|
||||
{ x -> x == 1 }
|
||||
)
|
||||
}
|
||||
abstract fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KFunction2
|
||||
|
||||
class Sample {
|
||||
companion object {
|
||||
fun max(x: Int, y: Int): Int {
|
||||
return if (x > y) {
|
||||
x
|
||||
} else {
|
||||
y
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::max,
|
||||
{ x, y -> x > y }
|
||||
)
|
||||
}
|
||||
abstract fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
import kotlin.reflect.KProperty0
|
||||
|
||||
class Sample {
|
||||
companion object {
|
||||
val maxValue = 1
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::maxValue,
|
||||
{ x -> x == 1 }
|
||||
)
|
||||
}
|
||||
abstract fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Sample.java
|
||||
public class Sample {
|
||||
static class SS {}
|
||||
}
|
||||
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KFunction0
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::SS,
|
||||
{ x -> x == Any() }
|
||||
)
|
||||
}
|
||||
abstract fun <T1> run(method: KFunction0<T1>, fn: (T1) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1> run(method: KFunction0<T1>, fn: (T1) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KFunction1
|
||||
|
||||
class Sample {
|
||||
inner class SS
|
||||
}
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::SS,
|
||||
{ x, y -> x == Any() && y == Any() }
|
||||
)
|
||||
}
|
||||
abstract fun <T1, T2> run(method: KFunction1<T1, T2>, fn: (T1, T2) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1, T2> run(method: KFunction1<T1, T2>, fn: (T1, T2) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Sample.java
|
||||
public class Sample {
|
||||
static class SS {}
|
||||
}
|
||||
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KFunction0
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::SS,
|
||||
{ x -> x == Any() }
|
||||
)
|
||||
}
|
||||
abstract fun <T1> run(method: KFunction0<T1>, fn: (T1) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1> run(method: KFunction0<T1>, fn: (T1) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KFunction2
|
||||
|
||||
class Sample {
|
||||
object A {
|
||||
fun max(x: Int, y: Int): Int {
|
||||
return if (x > y) {
|
||||
x
|
||||
} else {
|
||||
y
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object A2 {
|
||||
fun max(x: Int, y: Int): Int {
|
||||
return if (x > y) {
|
||||
x
|
||||
} else {
|
||||
y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample.A::max,
|
||||
{ x, y -> x > y }
|
||||
)
|
||||
}
|
||||
fun check2(): String {
|
||||
return run(
|
||||
A2::max,
|
||||
{ x, y -> x > y }
|
||||
)
|
||||
}
|
||||
abstract fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String {
|
||||
return "O"
|
||||
}
|
||||
} ).check()
|
||||
result += ( object : Checker() {
|
||||
override fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String {
|
||||
return "K"
|
||||
}
|
||||
} ).check2()
|
||||
|
||||
return result
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Sample.java
|
||||
public class Sample {
|
||||
public static int max = 1;
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
import kotlin.reflect.KProperty0
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::max,
|
||||
{ x -> x == Any() }
|
||||
)
|
||||
}
|
||||
abstract fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1> run(method: KProperty0<T1>, fn: (T1) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: Sample.java
|
||||
public class Sample {
|
||||
public static int max(int x, int y) {
|
||||
if (x > y) {
|
||||
return x;
|
||||
} else {
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
import kotlin.reflect.KFunction2
|
||||
|
||||
abstract class Checker {
|
||||
fun check(): String {
|
||||
return run(
|
||||
Sample::max,
|
||||
{ x, y -> x > y }
|
||||
)
|
||||
}
|
||||
abstract fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ( object : Checker() {
|
||||
override fun <T1, T2, R> run(method: KFunction2<T1, T2, R>, fn: (T1, T2) -> Boolean): String {
|
||||
return "OK"
|
||||
}
|
||||
} ).check()
|
||||
|
||||
return result
|
||||
}
|
||||
+10
-10
@@ -27,22 +27,22 @@ interface Foo {
|
||||
// CR on property with to receivers are forbidden
|
||||
fun <T: Foo> test() {
|
||||
// with LHS and property
|
||||
bar8<T>(<!TYPE_MISMATCH!>Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x1<!><!>)
|
||||
bar8<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x1<!>)
|
||||
bar8<Foo>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x1<!>)
|
||||
bar8(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x1<!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar8<!>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x1<!>)
|
||||
|
||||
// with LHS and mutable property
|
||||
bar8<T>(<!TYPE_MISMATCH!>Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x2<!><!>)
|
||||
bar8<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x2<!>)
|
||||
bar8<Foo>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x2<!>)
|
||||
bar8(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x2<!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar8<!>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x2<!>)
|
||||
|
||||
// with LHS and propery + mutable property (mixed)
|
||||
bar8<T>(<!TYPE_MISMATCH!>Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!><!>)
|
||||
bar8<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar8<Foo>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar8(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar9<T>(<!TYPE_MISMATCH!>Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!><!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar8<!>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar9<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar9<Foo>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
bar9(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar9<!>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>x3<!>)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,9 +84,9 @@ fun <T : Foo, R: Number, D: Int> main() {
|
||||
bar1(::resolve) // OK
|
||||
|
||||
// with LHS and conflicting projection
|
||||
bar2<T>(<!TYPE_MISMATCH!>Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!><!>)
|
||||
bar2<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!>)
|
||||
bar2<Foo>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!>)
|
||||
bar2(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar2<!>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!>)
|
||||
|
||||
// with LHS and Any? expected type
|
||||
bar3<T>(Foo::<!CALLABLE_REFERENCE_RESOLUTION_AMBIGUITY!>resolve<!>)
|
||||
|
||||
Reference in New Issue
Block a user