Maintain bounds evaluation order in intrinsics for 'reversed'

Makes sense for 'rangeTo', 'downTo', and 'until' with non-const bounds.
This commit is contained in:
Dmitry Petrov
2017-12-13 14:00:14 +03:00
parent 9fa9a8748b
commit 65b5cdbb8d
11 changed files with 206 additions and 10 deletions
@@ -0,0 +1,20 @@
// WITH_RUNTIME
import kotlin.test.*
val log = StringBuilder()
fun logged(message: String, value: Int) =
value.also { log.append(message) }
fun box(): String {
var s = 0
for (i in (logged("start;", 2) downTo logged("end;", 1)).reversed()) {
s += i
}
assertEquals(3, s)
assertEquals("start;end;", log.toString())
return "OK"
}
@@ -0,0 +1,20 @@
// WITH_RUNTIME
import kotlin.test.*
val log = StringBuilder()
fun logged(message: String, value: Int) =
value.also { log.append(message) }
fun box(): String {
var s = 0
for (i in (logged("start;", 1) .. logged("end;", 2)).reversed()) {
s += i
}
assertEquals(3, s)
assertEquals("start;end;", log.toString())
return "OK"
}
@@ -0,0 +1,20 @@
// WITH_RUNTIME
import kotlin.test.*
val log = StringBuilder()
fun logged(message: String, value: Int) =
value.also { log.append(message) }
fun box(): String {
var s = 0
for (i in (logged("start;", 1) until logged("end;", 3)).reversed()) {
s += i
}
assertEquals(3, s)
assertEquals("start;end;", log.toString())
return "OK"
}