@@ -63,6 +63,8 @@ __attribute__((swift_attr("release:releaseShared")));
63
63
inline void retainShared (SharedFRT *r) { puts (" retainShared" ); }
64
64
inline void releaseShared (SharedFRT *r) { puts (" releaseShared" ); }
65
65
66
+ inline SharedFRT* createSharedFRT () { return new SharedFRT (); }
67
+
66
68
// --- module.modulemap
67
69
module CxxTest {
68
70
header " header.h"
@@ -89,20 +91,34 @@ public func consumeImmortalFRT(_ x: consuming ImmortalFRT) {
89
91
print (" immortal frt x \(x.x)" )
90
92
}
91
93
92
- public
93
- func consumeSharedFRT (_ x : consuming SharedFRT) {
94
+ public func consumeSharedFRT (_ x : consuming SharedFRT) {
94
95
print (" consume shared frt x \(x.x)" )
95
96
}
96
97
97
- public
98
- func takeSharedFRT (_ x : SharedFRT) { print (" take shared frt x \(x.x)" ) }
98
+ public func takeSharedFRT (_ x : SharedFRT) {
99
+ print (" take shared frt x \(x.x)" )
100
+ }
99
101
100
- public
101
- func returnSharedFRT (_ x : SharedFRT) -> SharedFRT {
102
+ public func returnSharedFRT (_ x : SharedFRT) -> SharedFRT {
102
103
print (" return shared frt x \(x.x)" )
103
104
return x
104
105
}
105
106
107
+ public func returnSharedFRT2 () -> SharedFRT {
108
+ return createSharedFRT ()
109
+ }
110
+
111
+ public struct ValueWrapper {
112
+ let sharedFRT: SharedFRT
113
+ public init (_ x: SharedFRT) {
114
+ self.sharedFRT = x
115
+ }
116
+ }
117
+
118
+ public func consumeValueWrapper (_ x: consuming ValueWrapper) {
119
+ print (" return shared frt x \(x.sharedFRT.x)" )
120
+ }
121
+
106
122
// --- use-swift-cxx-types.cpp
107
123
108
124
#include " header.h"
@@ -160,6 +176,20 @@ int main() {
160
176
SharedFRT *sfrtptr = UseCxx::returnSharedFRT (&sfrt);
161
177
// CHECK-NEXT: retainShared
162
178
// CHECK-NEXT: return shared frt x 2
179
+ SharedFRT *sfrtptr2 = UseCxx::returnSharedFRT2 ();
180
+ // No retain or release here.
181
+ }
182
+ {
183
+ SharedFRT sfrt;
184
+ sfrt.x = 4 ;
185
+ auto wrapper = UseCxx::ValueWrapper::init (&sfrt);
186
+ // consumeValueWrapper creates a defensive copy in the thunk.
187
+ UseCxx::consumeValueWrapper (wrapper);
188
+ // CHECK-NEXT: retainShared
189
+ // CHECK-NEXT: retainShared
190
+ // CHECK-NEXT: releaseShared
191
+ // CHECK-NEXT: return shared frt x 4
192
+ // CHECK-NEXT: releaseShared
163
193
}
164
194
puts (" EndOfTest" );
165
195
// CHECK-NEXT: EndOfTest
0 commit comments