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:
Victor Petukhov
2021-09-29 19:13:03 +03:00
committed by TeamCityServer
parent fd2929d2c5
commit 43a83dd07a
21 changed files with 642 additions and 45 deletions
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}