diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 078199704d8..9bded1790b3 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -3165,7 +3165,8 @@ tasks.register("vararg_of_literals", KonanLocalTest) { } standaloneTest('tailrec') { - disabled = isAggressiveGC // TODO: Investigate why too slow + disabled = isAggressiveGC || // TODO: Investigate why too slow + isK2(project) // KT-56269 useGoldenData = true source = "lower/tailrec.kt" flags = ['-XXLanguage:-ProhibitTailrecOnVirtualMember', '-e', 'lower.tailrec.main'] diff --git a/kotlin-native/backend.native/tests/lower/tailrec.kt b/kotlin-native/backend.native/tests/lower/tailrec.kt index de9f201a43a..bd8194474b7 100644 --- a/kotlin-native/backend.native/tests/lower/tailrec.kt +++ b/kotlin-native/backend.native/tests/lower/tailrec.kt @@ -18,6 +18,12 @@ fun main() { println(listOf(1, 2, 3).indexOf(3)) println(listOf(1, 2, 3).indexOf(4)) + + println(Integer(5).isLessOrEqualThan(7)) + println(Integer(42).isLessOrEqualThan(1)) + + println(DefaultArgGetter().foo("non-default")) + println(EitherDelegatedOrNot(NotDelegated()).get42()) } tailrec fun add(x: Int, y: Int): Int = if (x > 0) add(x - 1, y + 1) else y @@ -55,3 +61,37 @@ tailrec fun List.indexOf(x: T, startIndex: Int = 0): Int { return startIndex } + +open class Integer(val value: Int) { + open tailrec fun isLessOrEqualThan(value: Int): Boolean { + if (this.value == value) { + return true + } else if (value > 0) { + return this.isLessOrEqualThan(value - 1) + } else { + return false + } + } +} + +open class DefaultArgHolder { + open fun foo(s: String = "default") = s +} + +class DefaultArgGetter : DefaultArgHolder() { + override tailrec fun foo(s: String): String { + return if (s == "default") s else foo() + } +} + +open class EitherDelegatedOrNot(val delegate: EitherDelegatedOrNot?) { + open tailrec fun get42(): Int = if (delegate != null) { + delegate.get42() + } else { + throw Error() + } +} + +class NotDelegated : EitherDelegatedOrNot(null) { + override fun get42() = 42 +} \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/lower/tailrec.out b/kotlin-native/backend.native/tests/lower/tailrec.out index 56f7fa5a1a2..8e46f90da7c 100644 --- a/kotlin-native/backend.native/tests/lower/tailrec.out +++ b/kotlin-native/backend.native/tests/lower/tailrec.out @@ -8,3 +8,7 @@ ready! 2 -1 +true +false +default +42