mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Global initializers are executed only once. Therefore it's possible to hoist such an initializer call to a loop pre-header - in case there are no conflicting side-effects in the loop before the call. Also, the call must post-dominate the loop pre-header. Otherwise it would be executed speculatively.
25 lines
490 B
Swift
25 lines
490 B
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift -O %s -o %t/a.out
|
|
// RUN: %target-run %t/a.out | %FileCheck %s
|
|
|
|
// REQUIRES: executable_test
|
|
|
|
struct Teststruct {
|
|
static let s = Teststruct()
|
|
|
|
@inline(never)
|
|
init() {
|
|
let set = Set<String>()
|
|
for _ in set {
|
|
// Check that the global initializer is not hoisted out of this loop,
|
|
// resulting in a dispatch_once re-retrance crash.
|
|
_ = Teststruct.s
|
|
}
|
|
}
|
|
}
|
|
|
|
// CHECK: Teststruct
|
|
print(Teststruct.s)
|
|
|
|
|