Skip to content

Commit afd463d

Browse files
committed
Act on experimental C++ interoperability flags
- Pass appropriate options to fronend jobs. - Use `clang++` as the linker driver when in experimental C++ interoperability mode
1 parent 308dd13 commit afd463d

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

Sources/SwiftDriver/Jobs/DarwinToolchain+LinkerSupport.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ extension DarwinToolchain {
303303
commandLine.appendFlag("-application_extension")
304304
}
305305

306+
// On Darwin, we only support libc++.
307+
if parsedOptions.contains(.enableExperimentalCxxInterop) {
308+
commandLine.appendFlag("-lc++")
309+
}
310+
306311
// inputs LinkFileList
307312
if shouldUseInputFileList {
308313
commandLine.appendFlag(.filelist)

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,15 @@ extension Driver {
9191
commandLine.appendFlag(.disableObjcInterop)
9292
}
9393

94+
// Add flags for C++ interop
95+
if parsedOptions.hasArgument(.enableExperimentalCxxInterop) {
96+
commandLine.appendFlag(.enableCxxInterop)
97+
}
98+
if let stdlibVariant = parsedOptions.getLastArgument(.experimentalCxxStdlib)?.asSingle {
99+
commandLine.appendFlag("-Xcc")
100+
commandLine.appendFlag("-stdlib=\(stdlibVariant)")
101+
}
102+
94103
// Handle the CPU and its preferences.
95104
try commandLine.appendLast(.targetCpu, from: &parsedOptions)
96105

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3017,6 +3017,33 @@ final class SwiftDriverTests: XCTestCase {
30173017
}
30183018
}
30193019

3020+
func testCXXInteropOptions() throws {
3021+
do {
3022+
var driver = try Driver(args: ["swiftc", "-enable-experimental-cxx-interop", "foo.swift"])
3023+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
3024+
XCTAssertEqual(plannedJobs.count, 2)
3025+
let compileJob = plannedJobs[0]
3026+
let linkJob = plannedJobs[1]
3027+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-enable-cxx-interop")))
3028+
if driver.targetTriple.isDarwin {
3029+
XCTAssertTrue(linkJob.commandLine.contains(.flag("-lc++")))
3030+
}
3031+
}
3032+
do {
3033+
var driver = try Driver(args: ["swiftc", "-enable-experimental-cxx-interop",
3034+
"-experimental-cxx-stdlib", "libc++", "foo.swift"])
3035+
let plannedJobs = try driver.planBuild().removingAutolinkExtractJobs()
3036+
XCTAssertEqual(plannedJobs.count, 2)
3037+
let compileJob = plannedJobs[0]
3038+
let linkJob = plannedJobs[1]
3039+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-enable-cxx-interop")))
3040+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-stdlib=libc++")))
3041+
if driver.targetTriple.isDarwin {
3042+
XCTAssertTrue(linkJob.commandLine.contains(.flag("-lc++")))
3043+
}
3044+
}
3045+
}
3046+
30203047
func testVFSOverlay() throws {
30213048
do {
30223049
var driver = try Driver(args: ["swiftc", "-c", "-vfsoverlay", "overlay.yaml", "foo.swift"])

0 commit comments

Comments
 (0)