KT-12868: if a property initializer is a complex expression that emits additional statements, emit these statements directly before assignment to the property, not at the beginning of constructor

This commit is contained in:
Alexey Andreev
2016-09-07 14:11:01 +03:00
parent 80361bf2fb
commit 16af7d667f
8 changed files with 67 additions and 44 deletions
@@ -0,0 +1,21 @@
package foo
fun f() {}
class A(selector: Boolean, val y: Int) {
val x = if (selector) { f(); y } else 999
val z = if (selector) { f(); x + 1 } else 999
}
class B(selector: Boolean, val y: Int, val x: Int = if (selector) { f(); y } else { 999 })
fun box(): String {
val a = A(true, 23)
if (a.x != 23) return "fail: wrong evaluation order for property initializer (1): ${a.x}"
if (a.z != 24) return "fail: wrong evaluation order for property initializer (2): ${a.z}"
val b = B(true, 23)
if (b.x != 23) return "fail: wrong evaluation order for default constructor arguments"
return "OK"
}
@@ -0,0 +1,14 @@
package foo
fun f() {}
fun selector() = true
val y = if (selector()) 23 else throw Exception()
val x = if (selector()) { f(); y + 1 } else 999
val z = if (selector()) { f(); x + 1 } else 999
fun box(): String {
if (x != 24) return "fail1: $x"
if (z != 25) return "fail2: $z"
return "OK"
}