Skip to content

Commit 7704534

Browse files
authored
Merge pull request #77754 from swiftlang/egorzhdan/swiftinterface-no-cxx-flag
[cxx-interop] Do not emit C++ interop flag in textual interfaces
2 parents 01aa141 + 7ae2beb commit 7704534

File tree

4 files changed

+25
-18
lines changed

4 files changed

+25
-18
lines changed

include/swift/Option/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,12 +794,12 @@ def enable_experimental_concise_pound_file : Flag<["-"],
794794

795795
def enable_experimental_cxx_interop :
796796
Flag<["-"], "enable-experimental-cxx-interop">,
797-
Flags<[NoDriverOption, FrontendOption, HelpHidden, ModuleInterfaceOption]>,
797+
Flags<[NoDriverOption, FrontendOption, HelpHidden]>,
798798
HelpText<"Enable experimental C++ interop code generation and config directives">;
799799

800800
def cxx_interoperability_mode :
801801
Joined<["-"], "cxx-interoperability-mode=">,
802-
Flags<[FrontendOption, ModuleInterfaceOption, SwiftSymbolGraphExtractOption,
802+
Flags<[FrontendOption, SwiftSymbolGraphExtractOption,
803803
SwiftSynthesizeInterfaceOption]>,
804804
HelpText<"Enables C++ interoperability; pass 'default' to enable or 'off' to disable">;
805805

lib/Frontend/ModuleInterfaceLoader.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2014,12 +2014,8 @@ InterfaceSubContextDelegateImpl::InterfaceSubContextDelegateImpl(
20142014
GenericArgs.push_back(blocklist);
20152015
}
20162016

2017-
// For now, we only inherit the C++ interoperability mode in
2018-
// Explicit Module Builds.
2019-
if (langOpts.EnableCXXInterop &&
2020-
(frontendOpts.DisableImplicitModules ||
2021-
LoaderOpts.requestedAction ==
2022-
FrontendOptions::ActionType::ScanDependencies)) {
2017+
// Inherit the C++ interoperability mode.
2018+
if (langOpts.EnableCXXInterop) {
20232019
// Modelled after a reverse of validateCxxInteropCompatibilityMode
20242020
genericSubInvocation.getLangOptions().EnableCXXInterop = true;
20252021
genericSubInvocation.getLangOptions().cxxInteropCompatVersion =
@@ -2208,6 +2204,19 @@ InterfaceSubContextDelegateImpl::runInSubCompilerInstance(StringRef moduleName,
22082204
BuildArgs.push_back("-module-name");
22092205
BuildArgs.push_back(moduleName);
22102206

2207+
// FIXME: Hack for Darwin.swiftmodule, which cannot be rebuilt with C++
2208+
// interop enabled by the Swift CI because it uses an old host SDK.
2209+
if (moduleName == "Darwin") {
2210+
subInvocation.getLangOptions().EnableCXXInterop = false;
2211+
subInvocation.getLangOptions().cxxInteropCompatVersion = {};
2212+
BuildArgs.erase(llvm::remove_if(BuildArgs,
2213+
[](StringRef arg) -> bool {
2214+
return arg.starts_with(
2215+
"-cxx-interoperability-mode=");
2216+
}),
2217+
BuildArgs.end());
2218+
}
2219+
22112220
// Calculate output path of the module.
22122221
llvm::SmallString<256> buffer;
22132222
StringRef CacheHash;

test/Interop/Cxx/modules/emit-module-interface.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
// Check if fragile Swift interface with struct
44
// extensions can be reparsed:
55
// RUN: %target-swift-frontend -swift-version 5 -typecheck -emit-module-interface-path %t/UsesCxxStruct.swiftinterface %s -I %S/Inputs -swift-version 5 -enable-experimental-cxx-interop %S/Inputs/namespace-extension-lib.swift
6-
// RUN: %target-swift-frontend -swift-version 5 -typecheck-module-from-interface %t/UsesCxxStruct.swiftinterface -I %S/Inputs
6+
// RUN: %target-swift-frontend -swift-version 5 -typecheck-module-from-interface %t/UsesCxxStruct.swiftinterface -I %S/Inputs -enable-experimental-cxx-interop
77
// RUN: %FileCheck --input-file=%t/UsesCxxStruct.swiftinterface %s
8-
// CHECK: -enable-experimental-cxx-interop
8+
9+
// The textual module interface should not contain the C++ interop flag.
10+
// CHECK-NOT: -enable-experimental-cxx-interop
11+
// CHECK-NOT: -cxx-interoperability-mode
912

1013

1114
// Check if resilient Swift interface with builtin
1215
// type extensions can be reparsed:
1316
// RUN: %target-swift-emit-module-interface(%t/ResilientStruct.swiftinterface) %s -I %S/Inputs -enable-library-evolution -swift-version 5 -enable-experimental-cxx-interop %S/Inputs/namespace-extension-lib.swift -DRESILIENT
14-
// RUN: %target-swift-typecheck-module-from-interface(%t/ResilientStruct.swiftinterface) -I %S/Inputs -DRESILIENT
17+
// RUN: %target-swift-typecheck-module-from-interface(%t/ResilientStruct.swiftinterface) -I %S/Inputs -DRESILIENT -enable-experimental-cxx-interop
1518
// RUN: %FileCheck --input-file=%t/ResilientStruct.swiftinterface %s
1619

1720
import Namespaces

validation-test/ParseableInterface/verify_all_overlays.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,11 @@
4646
"DifferentiationUnittest",
4747
"Swift",
4848
"SwiftLang",
49-
"std", # swiftstd uses `-module-interface-preserve-types-as-written`
49+
# swiftCxxStdlib uses `-module-interface-preserve-types-as-written`
50+
"CxxStdlib",
5051
]:
5152
continue
5253

53-
# Cxx and CxxStdlib are built without library evolution and don't have a
54-
# .swiftinterface file
55-
if module_name in ["Cxx", "CxxStdlib"]:
56-
if not os.path.exists(interface_file):
57-
continue
58-
5954
# swift -build-module-from-parseable-interface
6055
output_path = os.path.join(output_dir, module_name + ".swiftmodule")
6156
compiler_args = ["-o", output_path, "-module-name", module_name,

0 commit comments

Comments
 (0)