FIR Checker: check tailrec

Difference from FE1.0
* KT-4285: calls to virtual method with default argument should be
  reported as not tailrec. FE1.0 is missing such cases.
* KT-48600: calls inside lambda should be reported as not tailrec. FE1.0
  also misses such cases.
This commit is contained in:
Tianyu Geng
2021-09-02 11:00:45 -07:00
committed by TeamCityServer
parent 5df316a129
commit 8525b4932b
55 changed files with 876 additions and 216 deletions
+53
View File
@@ -0,0 +1,53 @@
object Foo {
tailrec fun foo1() {
foo1()
}
tailrec fun foo2() {
this.foo2()
}
tailrec fun foo3() {
Foo.foo3()
}
}
class Bar {
companion object {
tailrec fun bar1() {
bar1()
}
tailrec fun bar2() {
this.bar2()
}
<!NO_TAIL_CALLS_FOUND!>tailrec fun bar3()<!> {
Bar.<!NON_TAIL_RECURSIVE_CALL!>bar3<!>()
}
tailrec fun bar4() {
Bar.Companion.bar4()
}
}
}
enum class E {
A {
override tailrec fun rec() {
rec()
}
},
B {
override tailrec fun rec() {
this.rec()
}
},
C {
<!NO_TAIL_CALLS_FOUND!>override tailrec fun rec()<!> {
C.rec() // resolution goes to `E.rec`. Hence the resolved symbol is considered different from `C.rec`.
}
};
abstract fun rec()
}