Environment:
- Xcode 26.4.0
- Swift 6 language mode, default actor isolation: nonisolated
Swift 6.3 reports a concurrency error only in Release (-O, whole-module optimization), but the same code compiles in Debug (-Onone).
import Foundation
class Router {
var subRouter: [Router] = []
var isExpanded: Bool = false
}
@MainActor
class Test {
var routers: [Router] = []
func flattenVisibleRouters() -> [(router: Router, level: Int)] {
var result: [(Router, Int)] = []
func flatten(_ routers: [Router], level: Int) {
for router in routers {
result.append((router, level))
if router.isExpanded && !router.subRouter.isEmpty {
flatten(router.subRouter, level: level + 1)
}
}
}
flatten(routers, level: 0)
return result
}
}
Release error:
error: sending 'router' risks causing data races
note: task-isolated 'router' is captured by a main actor-isolated closure
Debug builds successfully, and Swift 6.2 Debug Release also does not report this.
A trivial rewrite also avoids the error:
let isExpanded = router.isExpanded
let isNotEmpty = !router.subRouter.isEmpty
if isExpanded && isNotEmpty {
flatten(router.subRouter, level: level + 1)
}
This looks like a false positive / regression in Swift 6.3 concurrency analysis.