From 5116931378b5bae97d8b207f62da5f93eafe43f1 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Mon, 24 Nov 2025 08:57:57 +0800 Subject: [PATCH 1/6] [TEST-ONLY] Fix test leaking file into source directory --- Tests/SwiftDriverTests/JobExecutorTests.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/SwiftDriverTests/JobExecutorTests.swift b/Tests/SwiftDriverTests/JobExecutorTests.swift index 44c63e089..c6156e81d 100644 --- a/Tests/SwiftDriverTests/JobExecutorTests.swift +++ b/Tests/SwiftDriverTests/JobExecutorTests.swift @@ -528,6 +528,8 @@ final class JobExecutorTests: XCTestCase { let outputPath = path.appending(component: "finalOutput") var driver = try Driver(args: ["swiftc", main.pathString, "-save-temps", + "-sil-output-dir", path.pathString, + "-ir-output-dir", path.pathString, "-driver-filelist-threshold", "0", "-o", outputPath.pathString] + getHostToolchainSdkArg(executor), envBlock: ProcessEnv.block, From 6575f37b75e83b08e792df1d51142d4eea89fb50 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Mon, 24 Nov 2025 09:03:06 +0800 Subject: [PATCH 2/6] [TEST-ONLY] Fix emit-clang-header-min-access test Fix the test for older swift-frontend and eliminate the warning. --- Tests/SwiftDriverTests/SwiftDriverTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 2d6ba8be6..cc80106dd 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -7994,7 +7994,7 @@ final class SwiftDriverTests: XCTestCase { } let jobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(jobs.count, 2) - try XCTAssertJobInvocationMatches(jobs[0], .flag("-emit-clang-header-min-access"), .flag("public")) + XCTAssertJobInvocationMatches(jobs[0], .flag("-emit-clang-header-min-access"), .flag("public")) } func testGccToolchainFlags() throws { From 3ced1a30c141a82c4e255d6497acc610a408a831 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Mon, 24 Nov 2025 16:11:14 +0800 Subject: [PATCH 3/6] Fix windows explicit module planning jobs --- .../ExplicitModuleBuildTests.swift | 59 +++++++++++++++---- Tests/SwiftDriverTests/SwiftDriverTests.swift | 10 ++++ 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index 029b66e9f..ad2990086 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -485,16 +485,18 @@ final class ExplicitModuleBuildTests: XCTestCase { let linkJob = try jobs.findJob(.link) if driver.targetTriple.isDarwin { - XCTAssertTrue(linkJob.commandLine.contains("-possible-lswiftCore")) - XCTAssertTrue(linkJob.commandLine.contains("-possible-lswift_StringProcessing")) - XCTAssertTrue(linkJob.commandLine.contains("-possible-lobjc")) - XCTAssertTrue(linkJob.commandLine.contains("-possible-lswift_Concurrency")) - XCTAssertTrue(linkJob.commandLine.contains("-possible-lswiftSwiftOnoneSupport")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-possible-lswiftCore")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-possible-lswift_StringProcessing")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-possible-lobjc")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-possible-lswift_Concurrency")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-possible-lswiftSwiftOnoneSupport")) + } else if driver.targetTriple.isWindows { + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-lswiftCore")) } else { - XCTAssertTrue(linkJob.commandLine.contains("-lswiftCore")) - XCTAssertTrue(linkJob.commandLine.contains("-lswift_StringProcessing")) - XCTAssertTrue(linkJob.commandLine.contains("-lswift_Concurrency")) - XCTAssertTrue(linkJob.commandLine.contains("-lswiftSwiftOnoneSupport")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-lswiftCore")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-lswift_StringProcessing")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-lswift_Concurrency")) + XCTAssertCommandLineContains(linkJob.commandLine, .flag("-lswiftSwiftOnoneSupport")) } } } @@ -610,6 +612,10 @@ final class ExplicitModuleBuildTests: XCTestCase { let dependencyGraph = try XCTUnwrap(driver.intermoduleDependencyGraph) let checkForLinkLibrary = { (info: ModuleInfo, linkName: String, isFramework: Bool, shouldForceLoad: Bool) in + if driver.targetTriple.isWindows && linkName != "swiftCore" { + // Windows only links swiftCore. + return + } let linkLibraries = try XCTUnwrap(info.linkLibraries) let linkLibrary = try XCTUnwrap(linkLibraries.first { $0.linkName == linkName }) XCTAssertEqual(linkLibrary.isFramework, isFramework) @@ -773,6 +779,12 @@ final class ExplicitModuleBuildTests: XCTestCase { } else if relativeOutputPathFileName.starts(with: "_Builtin_stdint-") { try checkExplicitModuleBuildJob(job: job, moduleId: .clang("_Builtin_stdint"), dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "vcruntime-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("vcruntime"), + dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "SAL-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("SAL"), + dependencyGraph: dependencyGraph) } else if hostTriple.isMacOSX, hostTriple.version(for: .macOS) < Triple.Version(11, 0, 0), relativeOutputPathFileName.starts(with: "X-") { @@ -1135,6 +1147,12 @@ final class ExplicitModuleBuildTests: XCTestCase { } else if relativeOutputPathFileName.starts(with: "_Builtin_stdint-") { try checkExplicitModuleBuildJob(job: job, moduleId: .clang("_Builtin_stdint"), dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "vcruntime-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("vcruntime"), + dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "SAL-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("SAL"), + dependencyGraph: dependencyGraph) } else { XCTFail("Unexpected module dependency build job output: \(outputFilePath)") } @@ -1280,6 +1298,12 @@ final class ExplicitModuleBuildTests: XCTestCase { } else if relativeOutputPathFileName.starts(with: "_Builtin_stdint-") { try checkExplicitModuleBuildJob(job: job, moduleId: .clang("_Builtin_stdint"), dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "vcruntime-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("vcruntime"), + dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "SAL-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("SAL"), + dependencyGraph: dependencyGraph) } else { XCTFail("Unexpected module dependency build job output: \(outputFilePath)") } @@ -1400,6 +1424,12 @@ final class ExplicitModuleBuildTests: XCTestCase { } else if relativeOutputPathFileName.starts(with: "_Builtin_stdint-") { try checkExplicitModuleBuildJob(job: job, moduleId: .clang("_Builtin_stdint"), dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "vcruntime-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("vcruntime"), + dependencyGraph: dependencyGraph) + } else if relativeOutputPathFileName.starts(with: "SAL-") { + try checkExplicitModuleBuildJob(job: job, moduleId: .clang("SAL"), + dependencyGraph: dependencyGraph) } else { XCTFail("Unexpected module dependency build job output: \(outputFilePath)") } @@ -2689,6 +2719,9 @@ final class ExplicitModuleBuildTests: XCTestCase { func testTraceDependency() throws { try withTemporaryDirectory { path in +#if os(Windows) + throw XCTSkip("generatePCM error on windows") +#endif try localFileSystem.changeCurrentWorkingDirectory(to: path) let moduleCachePath = path.appending(component: "ModuleCache") try localFileSystem.createDirectory(moduleCachePath) @@ -2826,7 +2859,7 @@ final class ExplicitModuleBuildTests: XCTestCase { main.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() let emitModuleJob = try XCTUnwrap(plannedJobs.findJobs(.emitModule).spm_only) - XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-sdk"), .path(.absolute(mockSDKPath))])) + XCTAssertCommandLineContains(emitModuleJob.commandLine, .flag("-sdk")) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target"), .flag("x86_64-apple-macosx10.15")])) } } @@ -2856,7 +2889,7 @@ final class ExplicitModuleBuildTests: XCTestCase { main.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() let emitModuleJob = try XCTUnwrap(plannedJobs.findJobs(.emitModule).spm_only) - XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-sdk"), .path(.absolute(mockSDKPath))])) + XCTAssertCommandLineContains(emitModuleJob.commandLine, .flag("-sdk")) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target"), .flag("x86_64-apple-macosx10.12")])) } } @@ -2887,7 +2920,7 @@ final class ExplicitModuleBuildTests: XCTestCase { main.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() let emitModuleJob = try XCTUnwrap(plannedJobs.findJobs(.emitModule).spm_only) - XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-sdk"), .path(.absolute(mockSDKPath))])) + XCTAssertCommandLineContains(emitModuleJob.commandLine, .flag("-sdk")) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target"), .flag("x86_64-apple-macosx10.15")])) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target-variant"), .flag("x86_64-apple-ios13.1-macabi")])) } @@ -2920,7 +2953,7 @@ final class ExplicitModuleBuildTests: XCTestCase { main.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() let emitModuleJob = try XCTUnwrap(plannedJobs.findJobs(.emitModule).spm_only) - XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-sdk"), .path(.absolute(mockSDKPath))])) + XCTAssertCommandLineContains(emitModuleJob.commandLine, .flag("-sdk")) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target"), .flag("x86_64-apple-macosx10.12")])) XCTAssertTrue(emitModuleJob.commandLine.contains(subsequence: [.flag("-clang-target-variant"), .flag("x86_64-apple-ios14.0-macabi")])) } diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index cc80106dd..db309aa2c 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3043,6 +3043,16 @@ final class SwiftDriverTests: XCTestCase { let commonArgs = [ "swiftc", "foo.swift", "bar.swift", "-emit-executable", "-module-name", "Test", "-use-ld=lld" ] + #if os(Windows) + do { + var driver = try Driver(args: commonArgs + ["-sanitize=address"]) + try XCTSkipUnless(driver.toolchain.runtimeLibraryExists(for: .address, + targetInfo: driver.frontendTargetInfo, + parsedOptions: &driver.parsedOptions, + isShared: false), + "sanitizer not supported in this windows environment") + } + #endif #if os(macOS) || os(Windows) do { From c0818d907ac667df7833baeebeae752be67b8413 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Mon, 24 Nov 2025 16:26:30 +0800 Subject: [PATCH 4/6] Disable incremental test suite on windows --- .../SwiftDriverTests/ExplicitModuleBuildTests.swift | 3 --- .../IncrementalCompilationTests.swift | 13 +++++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index ad2990086..ebea03bd0 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -2719,9 +2719,6 @@ final class ExplicitModuleBuildTests: XCTestCase { func testTraceDependency() throws { try withTemporaryDirectory { path in -#if os(Windows) - throw XCTSkip("generatePCM error on windows") -#endif try localFileSystem.changeCurrentWorkingDirectory(to: path) let moduleCachePath = path.appending(component: "ModuleCache") try localFileSystem.createDirectory(moduleCachePath) diff --git a/Tests/SwiftDriverTests/IncrementalCompilationTests.swift b/Tests/SwiftDriverTests/IncrementalCompilationTests.swift index e6d1a495c..24c4b95e3 100644 --- a/Tests/SwiftDriverTests/IncrementalCompilationTests.swift +++ b/Tests/SwiftDriverTests/IncrementalCompilationTests.swift @@ -116,7 +116,9 @@ final class IncrementalCompilationTests: XCTestCase { } var extraExplicitBuildArgs: [String] = [] - override func setUp() { + override func setUpWithError() throws { + try super.setUpWithError() + self.tempDir = try! withTemporaryDirectory(removeTreeOnDeinit: false) {$0} try! localFileSystem.createDirectory(explicitModuleCacheDir) try! localFileSystem.createDirectory(derivedDataPath) @@ -154,6 +156,9 @@ final class IncrementalCompilationTests: XCTestCase { if driver.isFrontendArgSupported(.moduleLoadMode) { self.extraExplicitBuildArgs = ["-Xfrontend", "-module-load-mode", "-Xfrontend", "prefer-interface"] } + + // Disable incremental tests on windows due to very different module setup. + try XCTSkipIf(driver.targetTriple.isWindows, "https://github.com/swiftlang/swift-driver/issues/2029") } deinit { @@ -360,7 +365,7 @@ extension IncrementalCompilationTests { XCTAssertFalse(mandatoryJobInputs.contains("other.swift")) } - // External deps timestamp updated but contents are the same, and file-hashing is explicitly disabled + // External deps timestamp updated but contents are the same, and file-hashing is explicitly disabled func testExplicitIncrementalBuildExternalDepsWithoutHashing() throws { replace(contentsOf: "other", with: "import E;let bar = foo") try buildInitialState(extraArguments: ["-disable-incremental-file-hashing"], explicitModuleBuild: true) @@ -372,7 +377,7 @@ extension IncrementalCompilationTests { XCTAssertTrue(mandatoryJobInputs.contains("main.swift")) } - // Source file timestamps updated but contents are the same, and file-hashing is explicitly disabled + // Source file timestamps updated but contents are the same, and file-hashing is explicitly disabled func testExplicitIncrementalBuildSourceFilesWithoutHashing() throws { try buildInitialState(extraArguments: ["-disable-incremental-file-hashing"], explicitModuleBuild: true) touch("main") @@ -1043,7 +1048,7 @@ extension IncrementalCompilationTests { } private func testRemoval(_ options: RemovalTestOptions) throws { - setUp() // clear derived data, restore output file map + try setUpWithError() // clear derived data, restore output file map print("\n*** testRemoval \(options) ***", to: &stderrStream); stderrStream.flush() let newInput = "another" From 66446577f88e15f912864d68a8bb074659886a6d Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Thu, 27 Nov 2025 09:37:20 +0800 Subject: [PATCH 5/6] Fix ExplicitModuleBuildTests.testDependencyScanning() on windows --- Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index ebea03bd0..a70669e13 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -835,7 +835,7 @@ final class ExplicitModuleBuildTests: XCTestCase { try testInputsPath.appending(component: "ExplicitModuleBuilds") .appending(component: "Swift") let sdkArgumentsForTesting = (try? Driver.sdkArgumentsForTesting()) ?? [] - + var driver = try Driver(args: ["swiftc", "-I", cHeadersPath.nativePathString(escaped: true), "-I", swiftModuleInterfacesPath.nativePathString(escaped: true), @@ -2282,7 +2282,7 @@ final class ExplicitModuleBuildTests: XCTestCase { hostTriple.version(for: .macOS) < Triple.Version(11, 0, 0) { expectedNumberOfDependencies = 13 } else if driver.targetTriple.isWindows { - expectedNumberOfDependencies = 13 + expectedNumberOfDependencies = 14 } else { expectedNumberOfDependencies = 12 } From b56ca4d394f3e4bd8aac8547bb37ef94147b6716 Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Thu, 27 Nov 2025 11:12:33 +0800 Subject: [PATCH 6/6] Don't use `withTemporaryFile` in module build test withTemporaryFile leads to permission errors when creating a temporary file directly in the system temp directory. Using temporary directories for testing instead. --- Tests/SwiftDriverTests/SwiftDriverTests.swift | 198 ++++++++++-------- 1 file changed, 112 insertions(+), 86 deletions(-) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index db309aa2c..c4e81b672 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -485,7 +485,8 @@ final class SwiftDriverTests: XCTestCase { } func testIndexMultipleFilesInSingleCommandLineInvocation() throws { - try withTemporaryFile { outputFileMap in + try withTemporaryDirectory { dir in + let outputFileMap = dir.appending(component: "output-filelist") let outputMapContents = ByteString(""" { "first.swift": { @@ -496,14 +497,14 @@ final class SwiftDriverTests: XCTestCase { } } """.utf8) - try localFileSystem.writeFileContents(outputFileMap.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(outputFileMap, bytes: outputMapContents) try assertNoDriverDiagnostics(args: "swiftc", "-index-file", "first.swift", "second.swift", "third.swift", "-index-file-path", "first.swift", "-index-file-path", "second.swift", "-index-store-path", "/tmp/idx", - "-output-file-map", outputFileMap.path.pathString + "-output-file-map", outputFileMap.pathString ) { driver in let jobs = try driver.planBuild() XCTAssertEqual(jobs.count, 1) @@ -648,7 +649,8 @@ final class SwiftDriverTests: XCTestCase { } // Test SIL and IR output file maps in WMO mode - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -661,10 +663,10 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-object", "-wmo", - "-output-file-map", fileMapFile.path.pathString]) + "-output-file-map", fileMapFile.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) @@ -677,7 +679,8 @@ final class SwiftDriverTests: XCTestCase { } // Test single-file compilation with file maps - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -690,10 +693,10 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-object", - "-output-file-map", fileMapFile.path.pathString]) + "-output-file-map", fileMapFile.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 2) @@ -709,7 +712,8 @@ final class SwiftDriverTests: XCTestCase { } // Test partial file map (only some files have SIL/IR entries) - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -720,10 +724,10 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-object", "-wmo", - "-output-file-map", fileMapFile.path.pathString]) + "-output-file-map", fileMapFile.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) @@ -734,7 +738,8 @@ final class SwiftDriverTests: XCTestCase { } // Test that file maps work alongside directory options (file maps should take precedence) - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -743,12 +748,12 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-object", "-wmo", "-sil-output-dir", "/tmp/dir-output", "-ir-output-dir", "/tmp/dir-output", - "-output-file-map", fileMapFile.path.pathString]) + "-output-file-map", fileMapFile.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) @@ -763,7 +768,8 @@ final class SwiftDriverTests: XCTestCase { } // Ensure file maps without SIL/IR entries don't generate spurious flags - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -774,10 +780,10 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-object", "-wmo", - "-output-file-map", fileMapFile.path.pathString]) + "-output-file-map", fileMapFile.pathString]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 1) XCTAssertEqual(plannedJobs[0].kind, .compile) @@ -1193,7 +1199,8 @@ final class SwiftDriverTests: XCTestCase { } func testEmitModuleSeparatelyDiagnosticPath() throws { - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "": { @@ -1205,11 +1212,11 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) // Plain (batch/single-file) compile do { - var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-output-file-map", fileMapFile.path.pathString, + var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-output-file-map", fileMapFile.pathString, "-emit-library", "-module-name", "Test", "-serialize-diagnostics"]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -1223,7 +1230,7 @@ final class SwiftDriverTests: XCTestCase { // WMO do { var driver = try Driver(args: ["swiftc", "foo.swift", "-whole-module-optimization", "-emit-module", - "-output-file-map", fileMapFile.path.pathString, "-disable-cmo", + "-output-file-map", fileMapFile.pathString, "-disable-cmo", "-emit-library", "-module-name", "Test", "-serialize-diagnostics"]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -1237,7 +1244,8 @@ final class SwiftDriverTests: XCTestCase { } func testEmitModuleSeparatelyDependenciesPath() throws { - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "": { @@ -1249,11 +1257,11 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) // Plain (batch/single-file) compile do { - var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-output-file-map", fileMapFile.path.pathString, + var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-output-file-map", fileMapFile.pathString, "-emit-library", "-module-name", "Test", "-emit-dependencies"]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -1267,7 +1275,7 @@ final class SwiftDriverTests: XCTestCase { // WMO do { var driver = try Driver(args: ["swiftc", "foo.swift", "-whole-module-optimization", "-emit-module", - "-output-file-map", fileMapFile.path.pathString, "-disable-cmo", + "-output-file-map", fileMapFile.pathString, "-disable-cmo", "-emit-library", "-module-name", "Test", "-emit-dependencies"]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -1298,10 +1306,11 @@ final class SwiftDriverTests: XCTestCase { } """.utf8) - try withTemporaryFile { file in + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") try assertNoDiagnostics { diags in - try localFileSystem.writeFileContents(file.path, bytes: contents) - let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file.path), diagnosticEngine: diags) + try localFileSystem.writeFileContents(file, bytes: contents) + let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file), diagnosticEngine: diags) let object = try outputFileMap.getOutput(inputFile: VirtualPath.intern(path: "/tmp/foo/Sources/foo/foo.swift"), outputType: .object) XCTAssertEqual(VirtualPath.lookup(object).name, objroot.appending(components: "foo.swift.o").pathString) @@ -1332,10 +1341,11 @@ final class SwiftDriverTests: XCTestCase { } """.utf8 ) - try withTemporaryFile { file in + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") try assertNoDiagnostics { diags in - try localFileSystem.writeFileContents(file.path, bytes: contents) - let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file.path), diagnosticEngine: diags) + try localFileSystem.writeFileContents(file, bytes: contents) + let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file), diagnosticEngine: diags) let obj = try outputFileMap.getOutput(inputFile: VirtualPath.intern(path: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.swift.bc"), outputType: .object) XCTAssertEqual(VirtualPath.lookup(obj).name, objroot.appending(components: "foo.swift.o").pathString) @@ -1363,10 +1373,11 @@ final class SwiftDriverTests: XCTestCase { """.utf8 ) - try withTemporaryFile { file in + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") try assertNoDiagnostics { diags in - try localFileSystem.writeFileContents(file.path, bytes: contents) - let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file.path), diagnosticEngine: diags) + try localFileSystem.writeFileContents(file, bytes: contents) + let outputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file), diagnosticEngine: diags) let doc = try outputFileMap.getOutput(inputFile: VirtualPath.intern(path: "/tmp/foo/Sources/foo/foo.swift"), outputType: .swiftDocumentation) XCTAssertEqual(VirtualPath.lookup(doc).name, objroot.appending(components: "foo~partial.swiftdoc").pathString) @@ -1407,15 +1418,16 @@ final class SwiftDriverTests: XCTestCase { return inputs } - try withTemporaryFile { file in + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") try assertNoDiagnostics { diags in - try localFileSystem.writeFileContents(file.path, bytes: contents) + try localFileSystem.writeFileContents(file, bytes: contents) // 1. Incremental mode (single primary file) // a) without filelists var driver = try Driver(args: [ "swiftc", "-c", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) var jobs = try driver.planBuild() @@ -1429,7 +1441,7 @@ final class SwiftDriverTests: XCTestCase { // b) with filelists driver = try Driver(args: [ "swiftc", "-c", "-driver-filelist-threshold=0", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() @@ -1446,7 +1458,7 @@ final class SwiftDriverTests: XCTestCase { // a) without filelists driver = try Driver(args: [ "swiftc", "-c", "-enable-batch-mode", "-driver-batch-count", "1", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() @@ -1461,7 +1473,7 @@ final class SwiftDriverTests: XCTestCase { driver = try Driver(args: [ "swiftc", "-c", "-driver-filelist-threshold=0", "-enable-batch-mode", "-driver-batch-count", "1", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() @@ -1474,7 +1486,7 @@ final class SwiftDriverTests: XCTestCase { // a) without filelists driver = try Driver(args: [ "swiftc", "-c", "-whole-module-optimization", "-num-threads", "2", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() @@ -1489,7 +1501,7 @@ final class SwiftDriverTests: XCTestCase { driver = try Driver(args: [ "swiftc", "-c", "-driver-filelist-threshold=0", "-whole-module-optimization", "-num-threads", "2", - "-output-file-map", file.path.pathString, + "-output-file-map", file.pathString, "-module-name", "test", "/tmp/second.swift", "/tmp/main.swift" ]) jobs = try driver.planBuild() @@ -1589,7 +1601,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[2].kind, .link) } - try withTemporaryFile { fileMapFile in // Batch with output-file-map + try withTemporaryDirectory { dir in // Batch with output-file-map + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "foo.swift": { @@ -1606,11 +1619,11 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift", "-enable-batch-mode","-driver-batch-size-limit", "2", "-module-name", "Foo", "-emit-const-values", - "-output-file-map", fileMapFile.path.description]) + "-output-file-map", fileMapFile.description]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -1639,7 +1652,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs[1].kind, .link) } - try withTemporaryFile { fileMapFile in // WMO with output-file-map + try withTemporaryDirectory { dir in // WMO with output-file-map + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "": { @@ -1659,11 +1673,11 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift", "-whole-module-optimization", "-module-name", "Foo", "-emit-const-values", - "-output-file-map", fileMapFile.path.description]) + "-output-file-map", fileMapFile.description]) let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 2) XCTAssertEqual(plannedJobs[0].kind, .compile) @@ -1770,11 +1784,12 @@ final class SwiftDriverTests: XCTestCase { )}) let sampleOutputFileMap = OutputFileMap(entries: pathyEntries) - try withTemporaryFile { file in - try sampleOutputFileMap.store(fileSystem: localFileSystem, file: file.path) - let contentsForDebugging = try localFileSystem.readFileContents(file.path).cString + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try sampleOutputFileMap.store(fileSystem: localFileSystem, file: file) + let contentsForDebugging = try localFileSystem.readFileContents(file).cString _ = contentsForDebugging - let recoveredOutputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file.path), diagnosticEngine: DiagnosticsEngine()) + let recoveredOutputFileMap = try OutputFileMap.load(fileSystem: localFileSystem, file: .absolute(file), diagnosticEngine: DiagnosticsEngine()) XCTAssertEqual(sampleOutputFileMap, recoveredOutputFileMap) } } @@ -3661,12 +3676,13 @@ final class SwiftDriverTests: XCTestCase { """.utf8 ) - try withTemporaryFile { file in + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") try assertNoDiagnostics { diags in - try localFileSystem.writeFileContents(file.path, bytes: contents) + try localFileSystem.writeFileContents(file, bytes: contents) var driver1 = try Driver(args: [ "swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test", - "-num-threads", "4", "-output-file-map", file.path.pathString, "-emit-module-interface" + "-num-threads", "4", "-output-file-map", file.pathString, "-emit-module-interface" ]) let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 3) @@ -7578,7 +7594,8 @@ final class SwiftDriverTests: XCTestCase { XCTAssertJobInvocationMatches(compileJob, .flag("-sdk"), .path(.absolute(workingDirectory.appending(component: "relsdkpath")))) } - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = """ { "": { @@ -7590,20 +7607,21 @@ final class SwiftDriverTests: XCTestCase { } } """ - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) // Inputs with relative paths should be found in output file maps var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-ios13.1", "foo.swift", - "-output-file-map", fileMapFile.path.description]) + "-output-file-map", fileMapFile.description]) let plannedJobs = try driver.planBuild() let compileJob = plannedJobs[0] XCTAssertEqual(compileJob.kind, .compile) try XCTAssertJobInvocationMatches(compileJob, .flag("-o"), .path(.absolute(.init(validating: "/tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.o")))) } - try withTemporaryFile { fileMapFile in + try withTemporaryDirectory { dir in + let fileMapFile = dir.appending(component: "file-map-file") let outputMapContents: ByteString = .init(encodingAsUTF8: """ { "": { @@ -7615,14 +7633,14 @@ final class SwiftDriverTests: XCTestCase { } } """) - try localFileSystem.writeFileContents(fileMapFile.path, bytes: outputMapContents) + try localFileSystem.writeFileContents(fileMapFile, bytes: outputMapContents) // Inputs with relative paths and working-dir should use absolute paths in output file maps var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-ios13.1", "foo.swift", "-working-directory", try AbsolutePath(validating: "/some/workingdir").nativePathString(escaped: false), - "-output-file-map", fileMapFile.path.description]) + "-output-file-map", fileMapFile.description]) let plannedJobs = try driver.planBuild() let compileJob = plannedJobs[0] XCTAssertEqual(compileJob.kind, .compile) @@ -7682,19 +7700,22 @@ final class SwiftDriverTests: XCTestCase { } func testIsIosMacInterface() throws { - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: "// swift-module-flags: -target x86_64-apple-ios15.0-macabi") - XCTAssertTrue(try isIosMacInterface(VirtualPath.absolute(file.path))) + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: "// swift-module-flags: -target x86_64-apple-ios15.0-macabi") + XCTAssertTrue(try isIosMacInterface(VirtualPath.absolute(file))) } - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: "// swift-module-flags: -target arm64e-apple-macos12.0") - XCTAssertFalse(try isIosMacInterface(VirtualPath.absolute(file.path))) + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: "// swift-module-flags: -target arm64e-apple-macos12.0") + XCTAssertFalse(try isIosMacInterface(VirtualPath.absolute(file))) } } func testAdopterConfigFile() throws { - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: #""" [ { @@ -7704,7 +7725,7 @@ final class SwiftDriverTests: XCTestCase { ] """# ) - let configs = Driver.parseAdopterConfigs(file.path) + let configs = Driver.parseAdopterConfigs(file) XCTAssertEqual(configs.count, 1) XCTAssertEqual(configs[0].key, "SkipFeature1") XCTAssertEqual(configs[0].moduleNames, ["foo", "bar"]) @@ -7713,9 +7734,10 @@ final class SwiftDriverTests: XCTestCase { XCTAssertTrue(modules.contains("bar")) XCTAssertTrue(Driver.getAllConfiguredModules(withKey: "SkipFeature2", configs).isEmpty) } - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: "][ malformed }{") - let configs = Driver.parseAdopterConfigs(file.path) + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: "][ malformed }{") + let configs = Driver.parseAdopterConfigs(file) XCTAssertEqual(configs.count, 0) } do { @@ -7725,15 +7747,16 @@ final class SwiftDriverTests: XCTestCase { } func testExtractPackageName() throws { - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: """ // swift-module-flags: -target arm64e-apple-macos12.0 // swift-module-flags-ignorable: -library-level api\ // swift-module-flags-ignorable-private: -package-name myPkg """ ) - let flags = try getAllModuleFlags(VirtualPath.absolute(file.path)) + let flags = try getAllModuleFlags(VirtualPath.absolute(file)) let idx = flags.firstIndex(of: "-package-name") XCTAssertNotNil(idx) XCTAssert(idx! + 1 < flags.count) @@ -7742,26 +7765,29 @@ final class SwiftDriverTests: XCTestCase { } func testExtractLibraryLevel() throws { - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: "// swift-module-flags: -library-level api") - let flags = try getAllModuleFlags(VirtualPath.absolute(file.path)) + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: "// swift-module-flags: -library-level api") + let flags = try getAllModuleFlags(VirtualPath.absolute(file)) XCTAssertEqual(try getLibraryLevel(flags), .api) } - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: """ // swift-module-flags: -target arm64e-apple-macos12.0 // swift-module-flags-ignorable: -library-level spi """ ) - let flags = try getAllModuleFlags(VirtualPath.absolute(file.path)) + let flags = try getAllModuleFlags(VirtualPath.absolute(file)) XCTAssertEqual(try getLibraryLevel(flags), .spi) } - try withTemporaryFile { file in - try localFileSystem.writeFileContents(file.path, bytes: + try withTemporaryDirectory { dir in + let file = dir.appending(component: "file") + try localFileSystem.writeFileContents(file, bytes: "// swift-module-flags: -target arm64e-apple-macos12.0" ) - let flags = try getAllModuleFlags(VirtualPath.absolute(file.path)) + let flags = try getAllModuleFlags(VirtualPath.absolute(file)) XCTAssertEqual(try getLibraryLevel(flags), .unspecified) } }