Skip to content

Commit 2132cc9

Browse files
committed
[interop][SwiftToCxx] do not use std::move to move the returned C++ value
move needs <utility>, which is not includable in the test SDK.
1 parent 143ce1e commit 2132cc9

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

lib/PrintAsClang/PrintClangFunction.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ class ClangTypeHandler {
146146
os << "return *storageObjectPtr;\n";
147147
return;
148148
}
149-
os << fullQualifiedType << " result(std::move(*storageObjectPtr));\n";
149+
// Force a `std::move` on the resulting object.
150+
os << fullQualifiedType << " result(static_cast<" << fullQualifiedType
151+
<< " &&>(*storageObjectPtr));\n";
150152
os << "storageObjectPtr->~" << typeName << "();\n";
151153
os << "return result;\n";
152154
}

test/Interop/CxxToSwiftToCxx/bridge-cxx-struct-back-to-cxx.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
126126
// CHECK-NEXT: alignas(alignof(ns::NonTrivialTemplate<int>)) char storage[sizeof(ns::NonTrivialTemplate<int>)];
127127
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<ns::NonTrivialTemplate<int> *>(storage);
128128
// CHECK-NEXT: _impl::$s8UseCxxTy13retNonTrivialSo2nsO02__b18TemplateInstN2ns18efH4IiEEVyF(storage);
129-
// CHECK-NEXT: ns::NonTrivialTemplate<int> result(std::move(*storageObjectPtr));
129+
// CHECK-NEXT: ns::NonTrivialTemplate<int> result(static_cast<ns::NonTrivialTemplate<int> &&>(*storageObjectPtr));
130130
// CHECK-NEXT: storageObjectPtr->~NonTrivialTemplate();
131131
// CHECK-NEXT: return result;
132132
// CHECK-NEXT: }
@@ -165,7 +165,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
165165
// CHECK-NEXT: alignas(alignof(ns::NonTrivialTemplate<ns::TrivialinNS>)) char storage[sizeof(ns::NonTrivialTemplate<ns::TrivialinNS>)];
166166
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<ns::NonTrivialTemplate<ns::TrivialinNS> *>(storage);
167167
// CHECK-NEXT: _impl::$s8UseCxxTy14retNonTrivial2So2nsO02__b18TemplateInstN2ns18e7TrivialH20INS_11TrivialinNSEEEVyF(storage);
168-
// CHECK-NEXT: ns::NonTrivialTemplate<ns::TrivialinNS> result(std::move(*storageObjectPtr));
168+
// CHECK-NEXT: ns::NonTrivialTemplate<ns::TrivialinNS> result(static_cast<ns::NonTrivialTemplate<ns::TrivialinNS> &&>(*storageObjectPtr));
169169
// CHECK-NEXT: storageObjectPtr->~NonTrivialTemplate();
170170
// CHECK-NEXT: return result;
171171
// CHECK-NEXT: }
@@ -174,7 +174,7 @@ public func takeTrivialInout(_ x: inout Trivial) {
174174
// CHECK-NEXT: alignas(alignof(ns::NonTrivialImplicitMove)) char storage[sizeof(ns::NonTrivialImplicitMove)];
175175
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<ns::NonTrivialImplicitMove *>(storage);
176176
// CHECK-NEXT: _impl::$s8UseCxxTy25retNonTrivialImplicitMoveSo2nsO0efgH0VyF(storage);
177-
// CHECK-NEXT: ns::NonTrivialImplicitMove result(std::move(*storageObjectPtr));
177+
// CHECK-NEXT: ns::NonTrivialImplicitMove result(static_cast<ns::NonTrivialImplicitMove &&>(*storageObjectPtr));
178178
// CHECK-NEXT: storageObjectPtr->~NonTrivialImplicitMove();
179179
// CHECK-NEXT: return result;
180180
// CHECK-NEXT: }

test/Interop/SwiftToCxx/generics/generic-function-in-cxx.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public func createTestSmallStruct(_ x: UInt32) -> TestSmallStruct {
154154
// CHECK-NEXT: alignas(alignof(T_0_0)) char storage[sizeof(T_0_0)];
155155
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<T_0_0 *>(storage);
156156
// CHECK-NEXT: _impl::$s9Functions10genericRetyxxlF(storage, swift::_impl::getOpaquePointer(x), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
157-
// CHECK-NEXT: T_0_0 result(std::move(*storageObjectPtr));
157+
// CHECK-NEXT: T_0_0 result(static_cast<T_0_0 &&>(*storageObjectPtr));
158158
// CHECK-NEXT: storageObjectPtr->~T_0_0();
159159
// CHECK-NEXT: return result;
160160
// CHECK-NEXT: } else {
@@ -185,7 +185,7 @@ public func createTestSmallStruct(_ x: UInt32) -> TestSmallStruct {
185185
// CHECK-NEXT: alignas(alignof(T_0_0)) char storage[sizeof(T_0_0)];
186186
// CHECK-NEXT: auto * _Nonnull storageObjectPtr = reinterpret_cast<T_0_0 *>(storage);
187187
// CHECK-NEXT: _impl::$s9Functions15TestSmallStructV24genericMethodPassThroughyxxlF(storage, swift::_impl::getOpaquePointer(x), _impl::swift_interop_passDirect_Functions_uint32_t_0_4(_getOpaquePointer()), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata())
188-
// CHECK-NEXT: T_0_0 result(std::move(*storageObjectPtr));
188+
// CHECK-NEXT: T_0_0 result(static_cast<T_0_0 &&>(*storageObjectPtr));
189189
// CHECK-NEXT: storageObjectPtr->~T_0_0();
190190
// CHECK-NEXT: return result;
191191
// CHECK-NEXT: } else {

0 commit comments

Comments
 (0)