blob: d89ee9926c62e9143a508daafe44ef4fcdf05364 [file]
// LANGUAGE: +CompanionBlocksAndExtensions
var initOrder = ""
open class Parent {
companion {
val parentProp1: String = run { initOrder += "P1 "; "parent1" }
val parentProp2: String = run { initOrder += "P2 "; "parent2" }
}
}
class Child : Parent() {
companion {
val childProp1: String = run { initOrder += "C1 "; "child1" }
val childProp2: String = run { initOrder += "C2 "; "child2" }
}
}
fun box(): String {
// Accessing a child companion member triggers companion initialization.
// §3.3: companion initialization of a class triggers companion initialization
// of its parent classes first.
// §3.2: initialization respects program order within each class.
val c1 = Child.childProp1
// Parent properties must be initialized (static initializer was called)
if (Parent.parentProp1 != "parent1") return "FAIL: parentProp1=${Parent.parentProp1}"
if (Parent.parentProp2 != "parent2") return "FAIL: parentProp2=${Parent.parentProp2}"
// Child properties must be initialized
if (c1 != "child1") return "FAIL: childProp1=$c1"
if (Child.childProp2 != "child2") return "FAIL: childProp2=${Child.childProp2}"
// Parent initializers run before child initializers, both in program order
if (initOrder != "P1 P2 C1 C2 ") return "FAIL: initOrder=$initOrder"
return "OK"
}