[NI] Disable SAM-conversions for Kotlin functions by default

#KT-30661 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2019-04-12 16:19:39 +03:00
parent c6f29cbf38
commit 705a8a2234
11 changed files with 76 additions and 20 deletions
@@ -16,14 +16,14 @@ fun <T> bar(s: T) {}
fun <T> complex(t: T, f: (T) -> Unit) {}
fun test1() {
foo(1, <!NI;TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
foo(1, A::invokeLater) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
foo(1, ::bar)
complex(1, ::bar)
}
fun <R> test2(x: R) {
foo(x, <!NI;TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
foo(x, A::invokeLater) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
foo(x, ::bar)
complex(x, ::bar)
@@ -0,0 +1,31 @@
// !LANGUAGE: +NewInference
// FILE: Runnable.java
public interface Runnable {
void run();
}
// FILE: 1.kt
interface K {
fun foo1(r: Runnable)
fun foo2(r1: Runnable, r2: Runnable)
fun foo3(r1: Runnable, r2: Runnable, r3: Runnable)
}
fun test(k: K, r: Runnable) {
k.foo1(r)
k.foo1(<!TYPE_MISMATCH!>{}<!>)
k.foo2(r, r)
k.foo2(<!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>)
k.foo2(r, <!TYPE_MISMATCH!>{}<!>)
k.foo2(<!TYPE_MISMATCH!>{}<!>, r)
k.foo3(r, r, r)
k.foo3(r, r, <!TYPE_MISMATCH!>{}<!>)
k.foo3(r, <!TYPE_MISMATCH!>{}<!>, r)
k.foo3(r, <!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>)
k.foo3(<!TYPE_MISMATCH!>{}<!>, r, r)
k.foo3(<!TYPE_MISMATCH!>{}<!>, r, <!TYPE_MISMATCH!>{}<!>)
k.foo3(<!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>, r)
k.foo3(<!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>, <!TYPE_MISMATCH!>{}<!>)
}
@@ -0,0 +1,19 @@
package
public fun test(/*0*/ k: K, /*1*/ r: Runnable): kotlin.Unit
public interface K {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo1(/*0*/ r: Runnable): kotlin.Unit
public abstract fun foo2(/*0*/ r1: Runnable, /*1*/ r2: Runnable): kotlin.Unit
public abstract fun foo3(/*0*/ r1: Runnable, /*1*/ r2: Runnable, /*2*/ r3: Runnable): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Runnable {
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 abstract fun run(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -21,7 +21,7 @@ class B : A() {
}
if (d.x is B) {
<!OI;SMARTCAST_IMPOSSIBLE!>d.x<!>.<!NI;INVISIBLE_MEMBER!>foo<!> {}
<!SMARTCAST_IMPOSSIBLE!>d.x<!>.<!NI;INVISIBLE_MEMBER!>foo<!> {}
}
}
}