Skip to content

Commit 858a847

Browse files
committed
[cxx-interop] use SWIFT_NOEXCEPT for Swift function prototypes
This will allow these functions to be used from C. Also add a static_assert to verify that noexcept is actually used.
1 parent 2c2fa56 commit 858a847

File tree

6 files changed

+22
-12
lines changed

6 files changed

+22
-12
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ class DeclAndTypePrinter::Implementation
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: extern "C" 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: extern "C" void $s9Functions16alwaysDeprecatedyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_DEPRECATED; // alwaysDeprecated()
12+
// CHECK: extern "C" void $s9Functions19alwaysDeprecatedTwoyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_DEPRECATED_MSG("it should not be used"); // alwaysDeprecatedTwo()
13+
// CHECK: extern "C" void $s9Functions17alwaysUnavailableyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_UNAVAILABLE; // alwaysUnavailable()
14+
// CHECK: extern "C" void $s9Functions24alwaysUnavailableMessageyyF(void) SWIFT_NOEXCEPT SWIFT_CALL SWIFT_UNAVAILABLE_MSG("stuff happened"); // alwaysUnavailableMessage()
15+
// CHECK: extern "C" 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: extern "C" void $s9Functions17passIntReturnVoid1xys5Int32V_tF(int x) SWIFT_NOEXCEPT SWIFT_CALL; // passIntReturnVoid(x:)
12+
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD01x1ys5Int32VAF_AFtF(int x, int y) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnInt(x:y:)
13+
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD10NoArgLabelys5Int32VAD_ADtF(int, int) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnIntNoArgLabel(_:_:)
14+
// CHECK: extern "C" int $s9Functions016passTwoIntReturnD19NoArgLabelParamNameys5Int32VAD_ADtF(int x2, int y2) SWIFT_NOEXCEPT SWIFT_CALL; // passTwoIntReturnIntNoArgLabelParamName(_:_:)
15+
// CHECK: extern "C" void $s9Functions014passVoidReturnC0yyF(void) SWIFT_NOEXCEPT SWIFT_CALL; // passVoidReturnVoid()
1616

1717
// CHECK: }
1818

0 commit comments

Comments
 (0)