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:
@@ -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"
|
||||
}
|
||||
+14
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user