Swift 6.3 report `sending ... risks causing data races` only in Release

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.

I agree it's a bug. FYI, marking flatten as nonisolated might be the simplest workaround in your case.

1 Like