Skip to content

Commit fa041e8

Browse files
authored
Merge pull request #41798 from hyp/swift-c-func-sig
[cxx-interop] use language-agnostic macros for Swift function prototypes in generated header
2 parents 93c4c62 + 6b8108b commit fa041e8

File tree

6 files changed

+23
-13
lines changed

6 files changed

+23
-13
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,12 +843,12 @@ class DeclAndTypePrinter::Implementation
843843
Mangle::ASTMangler mangler;
844844
FuncionSwiftABIInformation funcABI(FD, mangler);
845845

846-
os << "extern \"C\" ";
846+
os << "SWIFT_EXTERN ";
847847
printFunctionDeclAsCFunctionDecl(FD, funcABI.getSymbolName(), resultTy);
848848
// Swift functions can't throw exceptions, we can only
849849
// throw them from C++ when emitting C++ inline thunks for the Swift
850850
// functions.
851-
os << " noexcept";
851+
os << " SWIFT_NOEXCEPT";
852852
if (!funcABI.useCCallingConvention())
853853
os << " SWIFT_CALL";
854854
printAvailability(FD);

lib/PrintAsClang/PrintAsClang.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,12 @@ static void writePrologue(raw_ostream &out, ASTContext &ctx,
272272
out << "#endif\n";
273273
};
274274
emitMacro("SWIFT_CALL", "__attribute__((swiftcall))");
275+
// SWIFT_NOEXCEPT applies 'noexcept' in C++ mode only.
276+
out << "#if defined(__cplusplus)\n";
277+
emitMacro("SWIFT_NOEXCEPT", "noexcept");
278+
out << "#else\n";
279+
emitMacro("SWIFT_NOEXCEPT", "");
280+
out << "#endif\n";
275281
static_assert(SWIFT_MAX_IMPORTED_SIMD_ELEMENTS == 4,
276282
"need to add SIMD typedefs here if max elements is increased");
277283
}

test/Interop/SwiftToCxx/functions/cdecl.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// CHECK-LABEL: namespace CdeclFunctions {
88

99
// CHECK: namespace _impl {
10-
// CHECK: extern "C" int cfuncPassTwo(int x, int y) noexcept;
10+
// CHECK: SWIFT_EXTERN int cfuncPassTwo(int x, int y) SWIFT_NOEXCEPT;
1111
// CHECK: }
1212

1313
@_cdecl("cfuncPassTwo")

test/Interop/SwiftToCxx/functions/function-availability.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
// CHECK-LABEL: namespace _impl {
1010

11-
// CHECK: extern "C" void $s9Functions16alwaysDeprecatedyyF(void) noexcept SWIFT_CALL SWIFT_DEPRECATED; // alwaysDeprecated()
12-
// CHECK: extern "C" void $s9Functions19alwaysDeprecatedTwoyyF(void) noexcept SWIFT_CALL SWIFT_DEPRECATED_MSG("it should not be used"); // alwaysDeprecatedTwo()
13-
// CHECK: extern "C" void $s9Functions17alwaysUnavailableyyF(void) noexcept SWIFT_CALL SWIFT_UNAVAILABLE; // alwaysUnavailable()
14-
// CHECK: extern "C" void $s9Functions24alwaysUnavailableMessageyyF(void) noexcept SWIFT_CALL SWIFT_UNAVAILABLE_MSG("stuff happened"); // alwaysUnavailableMessage()
15-
// CHECK: extern "C" void $s9Functions22singlePlatAvailabilityyyF(void) noexcept SWIFT_CALL SWIFT_AVAILABILITY(macos,introduced=11); // singlePlatAvailability()
11+
// CHECK: SWIFT_EXTERN void $s9Functions16alwaysDeprecatedyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_DEPRECATED; // alwaysDeprecated()
12+
// CHECK: SWIFT_EXTERN void $s9Functions19alwaysDeprecatedTwoyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_DEPRECATED_MSG("it should not be used"); // alwaysDeprecatedTwo()
13+
// CHECK: SWIFT_EXTERN void $s9Functions17alwaysUnavailableyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_UNAVAILABLE; // alwaysUnavailable()
14+
// CHECK: SWIFT_EXTERN void $s9Functions24alwaysUnavailableMessageyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_UNAVAILABLE_MSG("stuff happened"); // alwaysUnavailableMessage()
15+
// CHECK: SWIFT_EXTERN void $s9Functions22singlePlatAvailabilityyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_AVAILABILITY(macos,introduced=11); // singlePlatAvailability()
1616

1717
// CHECK: }
1818

test/Interop/SwiftToCxx/functions/swift-functions-execution.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
#include "functions.h"
1515

1616
int main() {
17+
static_assert(noexcept(Functions::passVoidReturnVoid()), "noexcept function");
18+
static_assert(noexcept(Functions::_impl::$s9Functions014passVoidReturnC0yyF()),
19+
"noexcept function");
20+
1721
Functions::passVoidReturnVoid();
1822
Functions::passIntReturnVoid(-1);
1923
assert(Functions::passTwoIntReturnIntNoArgLabel(1, 2) == 42);

test/Interop/SwiftToCxx/functions/swift-functions.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
// CHECK-LABEL: namespace _impl {
1010

11-
// CHECK: extern "C" void $s9Functions17passIntReturnVoid1xys5Int32V_tF(int x) noexcept SWIFT_CALL; // passIntReturnVoid(x:)
12-
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD01x1ys5Int32VAF_AFtF(int x, int y) noexcept SWIFT_CALL; // passTwoIntReturnInt(x:y:)
13-
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD10NoArgLabelys5Int32VAD_ADtF(int, int) noexcept SWIFT_CALL; // passTwoIntReturnIntNoArgLabel(_:_:)
14-
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD19NoArgLabelParamNameys5Int32VAD_ADtF(int x2, int y2) noexcept SWIFT_CALL; // passTwoIntReturnIntNoArgLabelParamName(_:_:)
15-
// CHECK: extern "C" void $s9Functions014passVoidReturnC0yyF(void) noexcept SWIFT_CALL; // passVoidReturnVoid()
11+
// CHECK: SWIFT_EXTERN void $s9Functions17passIntReturnVoid1xys5Int32V_tF(int x) SWIFT_NOEXCEPT SWIFT_CALL; // passIntReturnVoid(x:)
12+
// CHECK: SWIFT_EXTERN int $s9Functions016passTwoIntReturnD01x1ys5Int32VAF_AFtF(int x, int y) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnInt(x:y:)
13+
// CHECK: SWIFT_EXTERN int $s9Functions016passTwoIntReturnD10NoArgLabelys5Int32VAD_ADtF(int, int) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnIntNoArgLabel(_:_:)
14+
// CHECK: SWIFT_EXTERN int $s9Functions016passTwoIntReturnD19NoArgLabelParamNameys5Int32VAD_ADtF(int x2, int y2) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnIntNoArgLabelParamName(_:_:)
15+
// CHECK: SWIFT_EXTERN void $s9Functions014passVoidReturnC0yyF(void) SWIFT_NOEXCEPT SWIFT_CALL; // passVoidReturnVoid()
1616

1717
// CHECK: }
1818

0 commit comments

Comments
 (0)