@@ -44,6 +44,29 @@ namespace ns {
44
44
struct NonTrivialImplicitMove {
45
45
NonTrivialTemplate< int> member;
46
46
} ;
47
+
48
+ #define IMMORTAL_REF \
49
+ __attribute__( ( swift_attr ( " import_as_ref " ) ) ) \
50
+ __attribute__( ( swift_attr ( " retain:immortal " ) ) ) \
51
+ __attribute__( ( swift_attr ( " release:immortal " ) ) )
52
+ struct IMMORTAL_REF Immortal {
53
+ public:
54
+ } ;
55
+
56
+ inline Immortal * makeNewImmortal( ) {
57
+ return new Immortal;
58
+ }
59
+
60
+ template < class T>
61
+ struct IMMORTAL_REF ImmortalTemplate {
62
+ public:
63
+ } ;
64
+
65
+ inline ImmortalTemplate< int> * makeNewImmortalInt( ) {
66
+ return new ImmortalTemplate< int > ;
67
+ }
68
+
69
+ using ImmortalCInt = ImmortalTemplate < int > ;
47
70
}
48
71
49
72
//--- module.modulemap
@@ -55,6 +78,16 @@ module CxxTest {
55
78
//--- use-cxx-types.swift
56
79
import CxxTest
57
80
81
+ @_expose ( Cxx)
82
+ public func retImmortal( ) -> ns . Immortal {
83
+ return ns. makeNewImmortal ( )
84
+ }
85
+
86
+ @_expose ( Cxx)
87
+ public func retImmortalTemplate( ) -> ns . ImmortalCInt {
88
+ return ns. makeNewImmortalInt ( )
89
+ }
90
+
58
91
@_expose ( Cxx)
59
92
public func retNonTrivial( ) -> ns . NonTrivialTemplate < CInt > {
60
93
return ns . NonTrivialTemplate < CInt > ( )
@@ -80,6 +113,14 @@ public func retTrivial() -> Trivial {
80
113
return Trivial ( )
81
114
}
82
115
116
+ @_expose ( Cxx)
117
+ public func takeImmortal( _ x: ns . Immortal ) {
118
+ }
119
+
120
+ @_expose ( Cxx)
121
+ public func takeImmortalTemplate( _ x: ns . ImmortalCInt ) {
122
+ }
123
+
83
124
@_expose ( Cxx)
84
125
public func takeNonTrivial2( _ x: ns . NonTrivialTemplate < ns . TrivialinNS > ) {
85
126
}
@@ -104,6 +145,14 @@ public func takeTrivialInout(_ x: inout Trivial) {
104
145
// CHECK: SWIFT_EXTERN void $s8UseCxxTy13retNonTrivialSo2nsO02__b18TemplateInstN2ns18efH4IiEEVyF(SWIFT_INDIRECT_RESULT void * _Nonnull) SWIFT_NOEXCEPT SWIFT_CALL; // retNonTrivial()
105
146
// CHECK: SWIFT_EXTERN struct swift_interop_returnStub_UseCxxTy_uint32_t_0_4 $s8UseCxxTy10retTrivialSo0E0VyF(void) SWIFT_NOEXCEPT SWIFT_CALL; // retTrivial()
106
147
148
+ // CHECK: ns::Immortal *_Nonnull retImmortal() noexcept SWIFT_WARN_UNUSED_RESULT {
149
+ // CHECK-NEXT: return _impl::$s8UseCxxTy11retImmortalSo2nsO0E0VyF();
150
+ // CHECK-NEXT: }
151
+
152
+ // CHECK: ns::ImmortalTemplate<int> *_Nonnull retImmortalTemplate() noexcept SWIFT_WARN_UNUSED_RESULT {
153
+ // CHECK-NEXT: return _impl::$s8UseCxxTy19retImmortalTemplateSo2nsO02__bf10InstN2ns16eF4IiEEVyF();
154
+ // CHECK-NEXT: }
155
+
107
156
// CHECK: } // end namespace
108
157
// CHECK-EMPTY:
109
158
// CHECK-NEXT: namespace swift {
@@ -200,6 +249,14 @@ public func takeTrivialInout(_ x: inout Trivial) {
200
249
// CHECK-NEXT: return *storageObjectPtr;
201
250
// CHECK-NEXT: }
202
251
252
+ // CHECK: void takeImmortal(ns::Immortal *_Nonnull x) noexcept {
253
+ // CHECK-NEXT: return _impl::$s8UseCxxTy12takeImmortalyySo2nsO0E0VF(x);
254
+ // CHECK-NEXT: }
255
+
256
+ // CHECK: void takeImmortalTemplate(ns::ImmortalTemplate<int> *_Nonnull x) noexcept {
257
+ // CHECK-NEXT: return _impl::$s8UseCxxTy20takeImmortalTemplateyySo2nsO02__bf10InstN2ns16eF4IiEEVF(x);
258
+ // CHECK-NEXT: }
259
+
203
260
// CHECK: inline void takeNonTrivial2(const ns::NonTrivialTemplate<ns::TrivialinNS>& x) noexcept {
204
261
// CHECK-NEXT: return _impl::$s8UseCxxTy15takeNonTrivial2yySo2nsO02__b18TemplateInstN2ns18e7TrivialH20INS_11TrivialinNSEEEVF(swift::_impl::getOpaquePointer(x));
205
262
// CHECK-NEXT: }
0 commit comments