Mixing Swift build tool versions (in Xcode)

Our team is preparing to upgrade our CI pipeline from Xcode 15.0.1 to Xcode 16.0 and a question came up about bidirectional compatibility since we have several modules that depend on each other.

To set things up, let's say we have three SDKs:

  • Top 1.15.0
  • Bottom 1.15.0

As their names suggest, Top depends on depends on Bottom and both are built with Xcode 15.0.1 (Swift 5.9).

My understanding of Library Evolution is that we could release Bottom 1.16.0, built on Xcode 16 (Swift 6.0) without releasing new versions of Top, and an app could consume it without issue. (Please correct me if I'm wrong here.)

The question came up, what if I want to create a release, Top 1.15.1, still targeting Xcode 15, but consuming Bottom 1.16.0. Are there any issues that could prevent this from working? This old forum post suggests there could be. the compiler that produced it, 'Ap… | Apple Developer Forums

I conducted a test and observed three things:

  1. My app did indeed handle the mix of the two correctly.
  2. Xcode 15 happily consumed an SDK built on Xcode 16.
  3. There were no obvious ABI issues when comparing nm -jq and no impacts to swiftinterface.

Given the huge jump between Swift 5.9 and 6.0, I'd have expected something to go wrong. Has there been a change in the build tools to allow this kind of development? Were things just very calm between those two releases? Or did I just get lucky?