NI: do type checking for anonymous functions not inside a call

^KT-38890 Fixed
^KT-38439 Fixed
This commit is contained in:
Victor Petukhov
2020-05-19 11:31:15 +03:00
parent 425ce8c3ab
commit eff5f3a242
18 changed files with 174 additions and 25 deletions
@@ -16,6 +16,6 @@ fun test(s: Sub) {
t: Trait -> s
}
foo(<!TYPE_MISMATCH!>fun(<!EXPECTED_PARAMETER_TYPE_MISMATCH!>t: Sub<!>) = s<!>)
foo(<!NI;TYPE_MISMATCH, TYPE_MISMATCH!>fun(<!EXPECTED_PARAMETER_TYPE_MISMATCH!>t: Sub<!>) = s<!>)
foo(<!TYPE_MISMATCH!>fun(t): Super = s<!>)
}
@@ -0,0 +1,40 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER -UNCHECKED_CAST
// Issues: KT-38890, KT-38439
fun foo(x: () -> Int) {}
fun <T>id(x: T) = x
// Before the fix, there wasn't any type mismatch error in NI due to result type not being a subtype of expected type
fun main() {
val x: () -> Int = { "" }
val a0: () -> Int = fun(): String = "1"
val a1: () -> Int = (fun() = "1")
val a2: () -> Unit = (fun() = "1")
val a3: Unit = (fun() = "1")
val a4 = (fun() = "1")
val a5 = (fun(): String = "1")
val a6: () -> Int = (fun() = 1)
val a7: () -> Int = (fun(): String = "1") as () -> Int
val a8: () -> Int = fun(): String = "1"
val a9: () -> () -> () -> Int = fun(): () -> () -> String = fun(): () -> String = fun(): String = "1"
<!INAPPLICABLE_CANDIDATE!>foo<!>(fun(): String = "1")
<!INAPPLICABLE_CANDIDATE!>foo<!>(((fun(): String = "1")))
val a10: Int.(String) -> Int = fun (x: String) = 10
val a11: () -> () -> () -> Int = fun() = fun() = fun(): String = "1"
val a12: Int = fun(): String = "1"
val a13: Int = fun() = fun(): String = "1"
val a14: Int = fun() = fun() = "1"
val a15: Int = fun() = fun() = {}
val a16: Int = fun() = fun() {}
val a17: () -> Unit = fun() {}
val a18: () -> Int = fun() {}
val a19: () -> () -> Int = fun() = fun() {}
val a20: () -> () -> () -> Unit = fun() = fun() = {}
val a21: () -> () -> () -> Int = fun() = fun() = {}
}
@@ -0,0 +1,40 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER -UNCHECKED_CAST
// Issues: KT-38890, KT-38439
fun foo(x: () -> Int) {}
fun <T>id(x: T) = x
// Before the fix, there wasn't any type mismatch error in NI due to result type not being a subtype of expected type
fun main() {
val x: () -> Int = { <!TYPE_MISMATCH!>""<!> }
val a0: () -> Int = <!TYPE_MISMATCH!>fun(): String = "1"<!>
val a1: () -> Int = (<!TYPE_MISMATCH!>fun() = "1"<!>)
val a2: () -> Unit = (<!TYPE_MISMATCH!>fun() = "1"<!>)
val a3: Unit = (<!TYPE_MISMATCH!>fun() = "1"<!>)
val a4 = (fun() = "1")
val a5 = (fun(): String = "1")
val a6: () -> Int = (fun() = 1)
val a7: () -> Int = (fun(): String = "1") as () -> Int
val a8: () -> Int = <!TYPE_MISMATCH!>fun(): String = "1"<!>
val a9: () -> () -> () -> Int = <!TYPE_MISMATCH!>fun(): () -> () -> String = fun(): () -> String = fun(): String = "1"<!>
foo(<!TYPE_MISMATCH!>fun(): String = "1"<!>)
foo(((<!TYPE_MISMATCH!>fun(): String = "1"<!>)))
val a10: Int.(String) -> Int = <!TYPE_MISMATCH!>fun (x: String) = 10<!>
val a11: () -> () -> () -> Int = <!TYPE_MISMATCH!>fun() = fun() = fun(): String = "1"<!>
val a12: Int = <!TYPE_MISMATCH!>fun(): String = "1"<!>
val a13: Int = <!TYPE_MISMATCH!>fun() = fun(): String = "1"<!>
val a14: Int = <!TYPE_MISMATCH!>fun() = fun() = "1"<!>
val a15: Int = <!TYPE_MISMATCH!>fun() = fun() = {}<!>
val a16: Int = <!TYPE_MISMATCH!>fun() = fun() {}<!>
val a17: () -> Unit = fun() {}
val a18: () -> Int = <!TYPE_MISMATCH!>fun() {}<!>
val a19: () -> () -> Int = <!TYPE_MISMATCH!>fun() = fun() {}<!>
val a20: () -> () -> () -> Unit = fun() = fun() = {}
val a21: () -> () -> () -> Int = <!TYPE_MISMATCH!>fun() = fun() = {}<!>
}
@@ -0,0 +1,5 @@
package
public fun foo(/*0*/ x: () -> kotlin.Int): kotlin.Unit
public fun </*0*/ T> id(/*0*/ x: T): T
public fun main(): kotlin.Unit