Files
swift-mirror/test/Interop/Cxx/stdlib/Inputs/std-span.h
Gabor Horvath 11593329ea [cxx-interop] Fix transforming spans that are not behind type aliases
While we expect our users to use type aliases for template
instantiations, there are some contexts when we import instantiations
without aliases. Unfortunately, in case of C++ span we generated a name
for the instantiation that cannot be a syntactically valid Swift type
due to unary negation appearing in the type name. This PR replaces the
unary negation with "Neg" in the type name and also fixed a bug that
ended up printing certain unsigned values as signed. Moreover, this PR
also fixes some other fallouts in the SwiftifyImport macro.

rdar://146833480
2025-03-14 17:59:09 +00:00

130 lines
3.7 KiB
C++

#ifndef TEST_INTEROP_CXX_STDLIB_INPUTS_STD_SPAN_H
#define TEST_INTEROP_CXX_STDLIB_INPUTS_STD_SPAN_H
#include <cstddef>
#include <span>
#include <string>
#include <vector>
#ifndef __counted_by // cstddef already imports ptrcheck.h on apple platforms
#if defined(__has_feature) && __has_feature(bounds_safety_attributes)
#define __counted_by(x) __attribute__((__counted_by__(x)))
#else
#define __counted_by(x)
#endif
#endif
using ConstSpanOfInt = std::span<const int>;
using SpanOfInt = std::span<int>;
using ConstSpanOfString = std::span<const std::string>;
using SpanOfString = std::span<std::string>;
using VecOfInt = std::vector<int>;
static int iarray[]{1, 2, 3};
static std::string sarray[]{"", "ab", "abc"};
static ConstSpanOfInt icspan = {iarray};
static SpanOfInt ispan = {iarray};
static ConstSpanOfString scspan = {sarray};
static SpanOfString sspan = {sarray};
struct SpanBox {
ConstSpanOfInt icspan;
SpanOfInt ispan;
ConstSpanOfString scspan;
SpanOfString sspan;
};
class CppApi {
public:
ConstSpanOfInt getConstSpan();
SpanOfInt getSpan();
};
ConstSpanOfInt CppApi::getConstSpan() {
ConstSpanOfInt sp{new int[2], 2};
return sp;
}
SpanOfInt CppApi::getSpan() {
SpanOfInt sp{new int[2], 2};
return sp;
}
inline ConstSpanOfInt initConstSpan() {
return ConstSpanOfInt(iarray);
}
inline SpanOfInt initSpan() {
return SpanOfInt(iarray);
}
inline SpanOfInt initSpan(int arr[], size_t size) {
return SpanOfInt(arr, size);
}
struct DependsOnSelf {
std::vector<int> v;
__attribute__((swift_name("get()")))
ConstSpanOfInt get() const [[clang::lifetimebound]] { return ConstSpanOfInt(v.data(), v.size()); }
};
inline struct SpanBox getStructSpanBox() { return {iarray, iarray, sarray, sarray}; }
struct CaptureByReference {
void set(const std::vector<int>& x [[clang::lifetime_capture_by(this)]]) {
this->x = ConstSpanOfInt(x.data(), x.size());
};
ConstSpanOfInt x;
};
inline void funcWithSafeWrapper(ConstSpanOfInt s [[clang::noescape]]) {}
inline ConstSpanOfInt funcWithSafeWrapper2(ConstSpanOfInt s
[[clang::lifetimebound]]) {
return s;
}
inline ConstSpanOfInt funcWithSafeWrapper3(const VecOfInt &v
[[clang::lifetimebound]]) {
return ConstSpanOfInt(v.data(), v.size());
}
struct X {
inline void methodWithSafeWrapper(ConstSpanOfInt s [[clang::noescape]]) {}
};
inline ConstSpanOfInt mixedFuncWithSafeWrapper1(const int * __counted_by(len) p
[[clang::lifetimebound]], int len) {
return ConstSpanOfInt(p, len);
}
inline const int * __counted_by(len) mixedFuncWithSafeWrapper2(const VecOfInt &v
[[clang::lifetimebound]], int len) {
if (v.size() <= len)
return v.data();
return nullptr;
}
inline void mixedFuncWithSafeWrapper3(ConstSpanOfInt s [[clang::noescape]],
int * __counted_by(len) p, int len) {}
inline void mixedFuncWithSafeWrapper4(ConstSpanOfInt s [[clang::noescape]],
const int * __counted_by(len) p [[clang::noescape]], int len) {}
inline void mixedFuncWithSafeWrapper5(ConstSpanOfInt s,
const int * __counted_by(len) p [[clang::noescape]], int len) {}
inline void mixedFuncWithSafeWrapper6(ConstSpanOfInt s,
int * __counted_by(len) p, int len) {}
inline ConstSpanOfInt mixedFuncWithSafeWrapper7(const int * __counted_by(len) p, int len) {
return ConstSpanOfInt(p, len);
}
struct SpanWithoutTypeAlias {
std::span<const int> bar() [[clang::lifetimebound]];
void foo(std::span<const int> s [[clang::noescape]]);
};
#endif // TEST_INTEROP_CXX_STDLIB_INPUTS_STD_SPAN_H