Move tailrecPhase before defaultArgumentStubPhase

So that default values can be copied to the recursive call sites.
This commit is contained in:
Ting-Yuan Huang
2019-05-20 14:11:29 -07:00
committed by max-kammerer
parent 6addb24e4b
commit bdcd6f73b1
15 changed files with 193 additions and 2 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// DONT_RUN_GENERATED_CODE: JS
tailrec fun test(x : Int = 0, e : Any = "a") {
@@ -0,0 +1,15 @@
// DONT_RUN_GENERATED_CODE: JS
tailrec fun test(x : Int = 0, e : Any = "a") {
if (x < 100000 && !e.equals("a")) {
throw IllegalArgumentException()
}
if (x > 0) {
test(x - 1)
}
}
fun box() : String {
test(100000, "b")
return "OK"
}
@@ -0,0 +1,4 @@
package
public fun box(): kotlin.String
public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ e: kotlin.Any = ...): kotlin.Unit
@@ -0,0 +1,34 @@
// DONT_RUN_GENERATED_CODE: JS
// IGNORE_BACKEND: JVM
var counter = 0
fun inc() = counter++
tailrec fun test(x: Int = 0, y: Int = inc(), z: Int = inc()) {
if (x * 2 != y || z - y != 1)
throw IllegalArgumentException("x=$x y=$y z=$z")
if (x < 100000)
test(x + 1)
}
fun box() : String {
test()
counter = 4
test(x = 1, y = 2, z = 3)
counter = 0
test(-1, -2, -1)
counter = 3
test(1, 2)
counter = 1
test(y = 0)
counter = 2
test(x = 1)
return "OK"
}
@@ -0,0 +1,6 @@
package
public var counter: kotlin.Int
public fun box(): kotlin.String
public fun inc(): kotlin.Int
public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ y: kotlin.Int = ..., /*2*/ z: kotlin.Int = ...): kotlin.Unit
@@ -0,0 +1,22 @@
// DONT_RUN_GENERATED_CODE: JS
var counter = 0
fun inc() = counter++
tailrec fun test(x: Int = 0, y: Int = inc(), z: Int = inc()) {
if (x * 2 != y + 1 || z - y != -1)
throw IllegalArgumentException("x=$x y=$y z=$z")
if (x < 100000)
test(z = inc(), x = (counter - 1)/2 + 1)
}
fun box() : String {
counter = 4
test(1, 1, 0)
counter = 0
test(-1, -3, -4)
return "OK"
}
@@ -0,0 +1,6 @@
package
public var counter: kotlin.Int
public fun box(): kotlin.String
public fun inc(): kotlin.Int
public tailrec fun test(/*0*/ x: kotlin.Int = ..., /*1*/ y: kotlin.Int = ..., /*2*/ z: kotlin.Int = ...): kotlin.Unit