Closed
Description
Description
Consider this program
@preconcurrency import Glibc
import Foundation
await Task {
_ = fputs("hello\n", stderr)
}.value
compiles and runs just fine:
$ swiftc -swift-version 6 test.swift && echo OK
OK
But running swift-format
(default config) on it, breaks it:
$ swift format --in-place test.swift && swiftc -swift-version 6 test.swift && echo OK
test.swift:5:24: error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
3 |
4 | await Task {
5 | _ = fputs("hello\n", stderr)
| `- error: reference to var 'stderr' is not concurrency-safe because it involves shared mutable state
6 | }.value
7 |
SwiftGlibc.stderr:1:12: note: var declared here
1 | public var stderr: UnsafeMutablePointer<FILE>!
| `- note: var declared here
This is because it changed the order of the imports.
This is probably a Swift bug but you could argue it's a formatter bug too.
Related issues:
- always @preconcurrency import Glibc/Musl/Android/Bionic/WASILibc swift-foundation#1175
- Default swift-format breaks my program (stops compiling) because it reorders imports that are order sensitive swift-format#933
Reproduction
import Foundation
@preconcurrency import Glibc
await Task {
_ = fputs("hello\n", stderr)
}.value
swiftc -swift-version 6 test.swift && echo OK
Expected behavior
compiles fine in language mode 6.
Environment
Swift version 6.0.2 (swift-6.0.2-RELEASE)
Target: aarch64-unknown-linux-gnu
Additional information
No response