Skip to content

Commit 86d081f

Browse files
committed
Prohibit IR Generation for 32bit watchos when deployment target > 9.0
watchOS 9 doesn't support 32bit architectures, however we should still allow the compiler to generate swift modules for these target triples for back deployment support.
1 parent 0d9a0bf commit 86d081f

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

Sources/SwiftDriver/Toolchains/DarwinToolchain.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,17 @@ public final class DarwinToolchain: Toolchain {
235235
ToolchainValidationError
236236
.invalidDeploymentTargetForIR("iOS 11", targetTriple.archName)
237237
}
238-
} else if targetTriple.isWatchOS,
239-
targetTriple.version(for: .watchOS(.device)) < Triple.Version(2, 0, 0) {
240-
throw ToolchainValidationError.osVersionBelowMinimumDeploymentTarget("watchOS 2.0")
238+
} else if targetTriple.isWatchOS {
239+
if targetTriple.version(for: .watchOS(.device)) < Triple.Version(2, 0, 0) {
240+
throw ToolchainValidationError.osVersionBelowMinimumDeploymentTarget("watchOS 2.0")
241+
}
242+
if targetTriple.arch?.is32Bit == true,
243+
targetTriple.version(for: .watchOS(.device)) >= Triple.Version(8, 7, 0),
244+
compilerOutputType != .swiftModule {
245+
throw
246+
ToolchainValidationError
247+
.invalidDeploymentTargetForIR("watchOS 8.7", targetTriple.archName)
248+
}
241249
}
242250
}
243251

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3362,7 +3362,7 @@ final class SwiftDriverTests: XCTestCase {
33623362
}
33633363
}
33643364

3365-
func testValidDeprecatedTargets() throws {
3365+
func testValidDeprecatedTargetiOS() throws {
33663366
var driver = try Driver(args: ["swiftc", "-emit-module", "-target", "armv7-apple-ios13.0", "foo.swift"])
33673367
let plannedJobs = try driver.planBuild()
33683368
let emitModuleJob = plannedJobs.first(where: {$0.kind == .emitModule})
@@ -3371,6 +3371,16 @@ final class SwiftDriverTests: XCTestCase {
33713371
XCTAssert(currentJob.commandLine.contains(.flag("-target")))
33723372
XCTAssert(currentJob.commandLine.contains(.flag("armv7-apple-ios13.0")))
33733373
}
3374+
3375+
func testValidDeprecatedTargetWatchOS() throws {
3376+
var driver = try Driver(args: ["swiftc", "-emit-module", "-target", "armv7k-apple-watchos10.0", "foo.swift"])
3377+
let plannedJobs = try driver.planBuild()
3378+
let emitModuleJob = plannedJobs.first(where: {$0.kind == .emitModule})
3379+
XCTAssertNotNil(emitModuleJob)
3380+
let currentJob = emitModuleJob!
3381+
XCTAssert(currentJob.commandLine.contains(.flag("-target")))
3382+
XCTAssert(currentJob.commandLine.contains(.flag("armv7k-apple-watchos10.0")))
3383+
}
33743384

33753385
func testClangTargetForExplicitModule() throws {
33763386
#if os(macOS)
@@ -3476,11 +3486,19 @@ final class SwiftDriverTests: XCTestCase {
34763486

34773487
XCTAssertThrowsError(try Driver(args: ["swiftc", "-emit-module", "-c", "-target",
34783488
"armv7s-apple-ios12.0", "foo.swift"])) { error in
3479-
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11", "armv7s") = error else {
3480-
XCTFail()
3481-
return
3482-
}
3489+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("iOS 11", "armv7s") = error else {
3490+
XCTFail()
3491+
return
34833492
}
3493+
}
3494+
3495+
XCTAssertThrowsError(try Driver(args: ["swiftc", "-emit-module", "-c", "-target",
3496+
"armv7k-apple-watchos12.0", "foo.swift"])) { error in
3497+
guard case DarwinToolchain.ToolchainValidationError.invalidDeploymentTargetForIR("watchOS 8.7", "armv7k") = error else {
3498+
XCTFail()
3499+
return
3500+
}
3501+
}
34843502

34853503
XCTAssertThrowsError(try Driver(args: ["swiftc", "-c", "-target", "x86_64-apple-ios13.0",
34863504
"-target-variant", "x86_64-apple-macosx10.14",

0 commit comments

Comments
 (0)