@@ -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,38 @@ 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
+ }
101
+
102
+ public func genericConsumingFunc<T>(_ p: consuming T) {
103
+ print (" generic consuming function" )
104
+ }
99
105
100
- public
101
- func returnSharedFRT (_ x : SharedFRT) -> SharedFRT {
106
+ public func returnSharedFRT (_ x : SharedFRT) -> SharedFRT {
102
107
print (" return shared frt x \(x.x)" )
103
108
return x
104
109
}
105
110
111
+ public func returnSharedFRT2 () -> SharedFRT {
112
+ return createSharedFRT ()
113
+ }
114
+
115
+ public struct ValueWrapper {
116
+ let sharedFRT: SharedFRT
117
+ public init (_ x: SharedFRT) {
118
+ self.sharedFRT = x
119
+ }
120
+ }
121
+
122
+ public func consumeValueWrapper (_ x: consuming ValueWrapper) {
123
+ print (" return shared frt x \(x.sharedFRT.x)" )
124
+ }
125
+
106
126
// --- use-swift-cxx-types.cpp
107
127
108
128
#include " header.h"
@@ -160,6 +180,31 @@ int main() {
160
180
SharedFRT *sfrtptr = UseCxx::returnSharedFRT (&sfrt);
161
181
// CHECK-NEXT: retainShared
162
182
// CHECK-NEXT: return shared frt x 2
183
+ SharedFRT *sfrtptr2 = UseCxx::returnSharedFRT2 ();
184
+ // No retain or release here.
185
+ }
186
+ {
187
+ SharedFRT sfrt;
188
+ sfrt.x = 4 ;
189
+ auto wrapper = UseCxx::ValueWrapper::init (&sfrt);
190
+ // consumeValueWrapper creates a defensive copy in the thunk.
191
+ UseCxx::consumeValueWrapper (wrapper);
192
+ // CHECK-NEXT: retainShared
193
+ // CHECK-NEXT: retainShared
194
+ // CHECK-NEXT: releaseShared
195
+ // CHECK-NEXT: return shared frt x 4
196
+ // CHECK-NEXT: releaseShared
197
+ }
198
+ {
199
+ SharedFRT sfrt;
200
+ sfrt.x = 4 ;
201
+ auto wrapper = UseCxx::ValueWrapper::init (&sfrt);
202
+ UseCxx::genericConsumingFunc (wrapper);
203
+ // CHECK-NEXT: retainShared
204
+ // CHECK-NEXT: retainShared
205
+ // CHECK-DAG: releaseShared
206
+ // CHECK-DAG: generic consuming function
207
+ // CHECK-NEXT: releaseShared
163
208
}
164
209
puts (" EndOfTest" );
165
210
// CHECK-NEXT: EndOfTest
0 commit comments