Skip to content

Commit 78b0fd7

Browse files
authored
Merge pull request #74654 from swiftlang/gaborh/reenable-exposing-frts
[cxx-interop] Reenable exporting Foreign Reference Types to C++
2 parents f85ce90 + 7b72e8f commit 78b0fd7

File tree

3 files changed

+45
-23
lines changed

3 files changed

+45
-23
lines changed

lib/PrintAsClang/PrintClangFunction.cpp

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -316,25 +316,6 @@ class CFunctionSignatureTypePrinter
316316
os << " __strong";
317317
printInoutTypeModifier();
318318
}
319-
if (isa<clang::CXXRecordDecl>(cd->getClangDecl())) {
320-
if (std::find_if(
321-
cd->getClangDecl()->getAttrs().begin(),
322-
cd->getClangDecl()->getAttrs().end(), [](clang::Attr *attr) {
323-
if (auto *sa = dyn_cast<clang::SwiftAttrAttr>(attr)) {
324-
llvm::StringRef value = sa->getAttribute();
325-
if ((value.starts_with("retain:") ||
326-
value.starts_with("release:")) &&
327-
!value.ends_with(":immortal"))
328-
return true;
329-
}
330-
return false;
331-
}) != cd->getClangDecl()->getAttrs().end()) {
332-
// This is a shared FRT. Do not bridge it back to
333-
// C++ as its ownership is not managed automatically
334-
// in C++ yet.
335-
return ClangRepresentation::unsupported;
336-
}
337-
}
338319
// FIXME: Mark that this is only ObjC representable.
339320
return ClangRepresentation::representable;
340321
}

test/Interop/CxxToSwiftToCxx/disallow-shared-frt-back-to-cxx.swift renamed to test/Interop/CxxToSwiftToCxx/allow-shared-frt-back-to-cxx.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ import CxxTest
2929
public func consumeSharedFRT(_ x: consuming SharedFRT) {}
3030
public func takeSharedFRT(_ x: SharedFRT) {}
3131

32-
// CHECK: Unavailable in C++: Swift global function 'consumeSharedFRT(_:)'.
32+
// CHECK: SWIFT_EXTERN void $s8UseCxxTy16consumeSharedFRTyySo0eF0VnF(SharedFRT *_Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL; // consumeSharedFRT(_:)
3333

34-
// CHECK: Unavailable in C++: Swift global function 'takeSharedFRT(_:)'.
34+
// CHECK: SWIFT_EXTERN void $s8UseCxxTy13takeSharedFRTyySo0eF0VF(SharedFRT *_Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL; // takeSharedFRT(_:)

test/Interop/CxxToSwiftToCxx/consuming-cxx-struct-parameter-back-to-cxx-execution.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ class ImmortalFRT {
5151
__attribute__((swift_attr("retain:immortal")))
5252
__attribute__((swift_attr("release:immortal")));
5353

54+
class SharedFRT {
55+
public:
56+
SharedFRT() {}
57+
SharedFRT(int x) : x(x) {}
58+
int x;
59+
} __attribute__((swift_attr("import_reference")))
60+
__attribute__((swift_attr("retain:retainShared")))
61+
__attribute__((swift_attr("release:releaseShared")));
62+
63+
inline void retainShared(SharedFRT *r) { puts("retainShared"); }
64+
inline void releaseShared(SharedFRT *r) { puts("releaseShared"); }
65+
5466
//--- module.modulemap
5567
module CxxTest {
5668
header "header.h"
@@ -74,7 +86,21 @@ public struct TakesNonTrivial {
7486
}
7587

7688
public func consumeImmortalFRT(_ x: consuming ImmortalFRT) {
77-
print("frt x \(x.x)")
89+
print("immortal frt x \(x.x)")
90+
}
91+
92+
public
93+
func consumeSharedFRT(_ x : consuming SharedFRT) {
94+
print("consume shared frt x \(x.x)")
95+
}
96+
97+
public
98+
func takeSharedFRT(_ x : SharedFRT) { print("take shared frt x \(x.x)") }
99+
100+
public
101+
func returnSharedFRT(_ x : SharedFRT) -> SharedFRT {
102+
print("return shared frt x \(x.x)")
103+
return x
78104
}
79105

80106
//--- use-swift-cxx-types.cpp
@@ -119,7 +145,22 @@ int main() {
119145
frt.x = 2;
120146
UseCxx::consumeImmortalFRT(&frt);
121147
}
122-
// CHECK-NEXT: frt x 2
148+
// CHECK-NEXT: immortal frt x 2
149+
{
150+
SharedFRT sfrt;
151+
sfrt.x = 2;
152+
UseCxx::takeSharedFRT(&sfrt);
153+
// CHECK-NEXT: retainShared
154+
// CHECK-NEXT: releaseShared
155+
// CHECK-NEXT: take shared frt x 2
156+
UseCxx::consumeSharedFRT(&sfrt);
157+
// CHECK-NEXT: retainShared
158+
// CHECK-NEXT: releaseShared
159+
// CHECK-NEXT: consume shared frt x 2
160+
SharedFRT *sfrtptr = UseCxx::returnSharedFRT(&sfrt);
161+
// CHECK-NEXT: retainShared
162+
// CHECK-NEXT: return shared frt x 2
163+
}
123164
puts("EndOfTest");
124165
// CHECK-NEXT: EndOfTest
125166
return 0;

0 commit comments

Comments
 (0)