mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
571 lines
12 KiB
C++
571 lines
12 KiB
C++
#ifndef TEST_INTEROP_CXX_OPERATORS_INPUTS_MEMBER_INLINE_H
|
|
#define TEST_INTEROP_CXX_OPERATORS_INPUTS_MEMBER_INLINE_H
|
|
|
|
struct LoadableIntWrapper {
|
|
int value;
|
|
LoadableIntWrapper operator-(LoadableIntWrapper rhs) {
|
|
return LoadableIntWrapper{.value = value - rhs.value};
|
|
}
|
|
|
|
LoadableIntWrapper operator+=(LoadableIntWrapper rhs) {
|
|
value += rhs.value;
|
|
return *this;
|
|
}
|
|
|
|
int operator()() {
|
|
return value;
|
|
}
|
|
int operator()(int x) {
|
|
return value + x;
|
|
}
|
|
int operator()(int x, int y) {
|
|
return value + x * y;
|
|
}
|
|
|
|
operator int() const { return value; }
|
|
|
|
LoadableIntWrapper &operator++() {
|
|
value++;
|
|
return *this;
|
|
}
|
|
|
|
// Friend functions
|
|
friend bool operator==(const LoadableIntWrapper &lhs,
|
|
const LoadableIntWrapper &rhs) {
|
|
return lhs.value == rhs.value;
|
|
}
|
|
|
|
friend LoadableIntWrapper operator-(const LoadableIntWrapper& obj) {
|
|
return LoadableIntWrapper{.value = -obj.value};
|
|
}
|
|
|
|
friend LoadableIntWrapper operator-=(LoadableIntWrapper& lhs, const LoadableIntWrapper& rhs) {
|
|
lhs.value -= rhs.value;
|
|
return lhs;
|
|
}
|
|
};
|
|
|
|
namespace NS {
|
|
struct IntWrapperInNamespace {
|
|
int value;
|
|
friend bool operator==(const IntWrapperInNamespace &lhs,
|
|
const IntWrapperInNamespace &rhs) {
|
|
return lhs.value == rhs.value;
|
|
}
|
|
};
|
|
} // namespace NS
|
|
|
|
struct LoadableBoolWrapper {
|
|
bool value;
|
|
LoadableBoolWrapper operator!() {
|
|
return LoadableBoolWrapper{.value = !value};
|
|
}
|
|
operator bool() const { return value; }
|
|
};
|
|
|
|
template<class T>
|
|
struct TemplatedWithFriendOperator {
|
|
friend bool operator==(const TemplatedWithFriendOperator &lhs,
|
|
const TemplatedWithFriendOperator &rhs) {
|
|
return true;
|
|
}
|
|
};
|
|
|
|
using TemplatedWithFriendOperatorSpec = TemplatedWithFriendOperator<int>;
|
|
|
|
struct __attribute__((swift_attr("import_owned"))) AddressOnlyIntWrapper {
|
|
int value;
|
|
|
|
AddressOnlyIntWrapper(int value) : value(value) {}
|
|
AddressOnlyIntWrapper(const AddressOnlyIntWrapper &other) : value(other.value) {}
|
|
|
|
int operator()() {
|
|
return value;
|
|
}
|
|
int operator()(int x) {
|
|
return value + x;
|
|
}
|
|
int operator()(int x, int y) {
|
|
return value + x * y;
|
|
}
|
|
|
|
AddressOnlyIntWrapper operator-(AddressOnlyIntWrapper rhs) const {
|
|
return AddressOnlyIntWrapper(value - rhs.value);
|
|
}
|
|
AddressOnlyIntWrapper &operator++() {
|
|
value++;
|
|
return *this;
|
|
}
|
|
AddressOnlyIntWrapper operator++(int) {
|
|
// This shouldn't be called, since we only support pre-increment operators.
|
|
return AddressOnlyIntWrapper(-777);
|
|
}
|
|
};
|
|
|
|
struct HasPostIncrementOperator {
|
|
HasPostIncrementOperator operator++(int) {
|
|
return HasPostIncrementOperator();
|
|
}
|
|
};
|
|
|
|
struct HasPreIncrementOperatorWithAnotherReturnType {
|
|
int value = 0;
|
|
const int &operator++() { return ++value; }
|
|
};
|
|
|
|
struct HasPreIncrementOperatorWithVoidReturnType {
|
|
int value = 0;
|
|
void operator++() { ++value; }
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_reference"),
|
|
swift_attr("retain:immortal"),
|
|
swift_attr("release:immortal"))) ImmortalCounter {
|
|
int value = 0;
|
|
|
|
ImmortalCounter &operator++() {
|
|
value++;
|
|
return *this;
|
|
}
|
|
};
|
|
static ImmortalCounter myCounter;
|
|
|
|
struct HasDeletedOperator {
|
|
void operator!=(HasDeletedOperator) const = delete;
|
|
};
|
|
|
|
struct ReadWriteIntArray {
|
|
private:
|
|
int values[5] = { 1, 2, 3, 4, 5 };
|
|
|
|
public:
|
|
const int &operator[](int x) const {
|
|
return values[x];
|
|
}
|
|
int &operator[](int x) {
|
|
return values[x];
|
|
}
|
|
|
|
struct NestedIntArray {
|
|
private:
|
|
int values[5] = { 1, 2, 3, 4, 5 };
|
|
|
|
public:
|
|
const int &operator[](int x) const {
|
|
return values[x];
|
|
}
|
|
};
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_owned"))) ReadOnlyIntArray {
|
|
private:
|
|
int values[5] = { 1, 2, 3, 4, 5 };
|
|
|
|
public:
|
|
ReadOnlyIntArray(int first) {
|
|
values[0] = first;
|
|
}
|
|
ReadOnlyIntArray(const ReadOnlyIntArray &other) {}
|
|
|
|
const int &operator[](int x) const {
|
|
return values[x];
|
|
}
|
|
};
|
|
|
|
struct WriteOnlyIntArray {
|
|
private:
|
|
int values[5] = { 1, 2, 3, 4, 5 };
|
|
|
|
public:
|
|
int &operator[](int x) {
|
|
return values[x];
|
|
}
|
|
};
|
|
|
|
struct ReadOnlyRvalueParam {
|
|
private:
|
|
int values[5] = {1, 2, 3, 4, 5};
|
|
|
|
public:
|
|
const int &operator[](int &&x) const { return values[x]; }
|
|
};
|
|
|
|
struct ReadWriteRvalueParam {
|
|
private:
|
|
int values[5] = {1, 2, 3, 4, 5};
|
|
|
|
public:
|
|
const int &operator[](int &&x) const { return values[x]; }
|
|
int &operator[](int&& x) { return values[x]; }
|
|
};
|
|
|
|
struct ReadWriteRvalueGetterParam {
|
|
private:
|
|
int values[5] = {1, 2, 3, 4, 5};
|
|
|
|
public:
|
|
const int &operator[](int &&x) const { return values[x]; }
|
|
int &operator[](int x) { return values[x]; }
|
|
};
|
|
|
|
struct DifferentTypesArray {
|
|
private:
|
|
int values[3] = { 1, 2, 3 };
|
|
double doubleValues[2] = { 1.5, 2.5 };
|
|
bool boolValues[2] = { true, false };
|
|
|
|
public:
|
|
const int &operator[](int x) const {
|
|
return values[x];
|
|
}
|
|
int &operator[](int x) {
|
|
return values[x];
|
|
}
|
|
bool &operator[](bool x) {
|
|
return boolValues[x];
|
|
}
|
|
const bool &operator[](bool x) const {
|
|
return boolValues[x];
|
|
}
|
|
const double &operator[](double x) const {
|
|
return doubleValues[x == 0.0];
|
|
}
|
|
};
|
|
|
|
template<class T>
|
|
struct TemplatedArray {
|
|
T ts[];
|
|
|
|
T &operator[](int i) {
|
|
return ts[i];
|
|
}
|
|
const T &operator[](int i) const {
|
|
return ts[i];
|
|
}
|
|
};
|
|
typedef TemplatedArray<double> TemplatedDoubleArray;
|
|
|
|
struct __attribute__((swift_attr("import_unsafe"))) TemplatedSubscriptArray {
|
|
int *ptr;
|
|
|
|
template<class T>
|
|
T &operator[](T i) {
|
|
return ptr[i];
|
|
}
|
|
template<class T>
|
|
const T &operator[](T i) const {
|
|
return ptr[i];
|
|
}
|
|
};
|
|
|
|
struct IntArrayByVal {
|
|
// For testing purposes.
|
|
void setValueAtIndex(int value, unsigned i) { values[i] = value; }
|
|
int operator[](int x) const { return values[x]; }
|
|
private:
|
|
int values[3] = { 1, 2, 3 };
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_owned"))) NonTrivialIntArrayByVal {
|
|
NonTrivialIntArrayByVal(int first) { values[0] = first; }
|
|
NonTrivialIntArrayByVal(const NonTrivialIntArrayByVal &other) {
|
|
for (int i = 0; i < 5; i++)
|
|
values[i] = other.values[i];
|
|
}
|
|
|
|
int operator[](int x) const { return values[x]; }
|
|
|
|
// For testing purposes.
|
|
void setValueAtIndex(int value, unsigned i) { values[i] = value; }
|
|
|
|
private:
|
|
int values[5] = { 1, 2, 3, 4, 5 };
|
|
};
|
|
|
|
struct DifferentTypesArrayByVal {
|
|
int operator[](int x) { return values[x]; }
|
|
bool operator[](bool x) { return boolValues[x]; }
|
|
double operator[](double x) const { return doubleValues[x == 0.0]; }
|
|
|
|
private:
|
|
int values[3] = { 1, 2, 3 };
|
|
double doubleValues[2] = { 1.5, 2.5 };
|
|
bool boolValues[2] = { true, false };
|
|
};
|
|
|
|
template<class T> struct TemplatedArrayByVal {
|
|
T ts[];
|
|
T operator[](int i) { return ts[i]; }
|
|
};
|
|
|
|
typedef TemplatedArrayByVal<double> TemplatedDoubleArrayByVal;
|
|
|
|
template <class T>
|
|
struct TemplatedByVal {
|
|
T val;
|
|
TemplatedByVal<T> operator+(TemplatedByVal other) {
|
|
return TemplatedByVal{.val = val + other.val};
|
|
}
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_unsafe")))
|
|
TemplatedOperatorArrayByVal {
|
|
int *ptr;
|
|
template<class T> T operator[](T i) { return ptr[i]; }
|
|
template <class T>
|
|
T *operator+(T i) {
|
|
return ptr + i;
|
|
}
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_owned"))) NonTrivial {
|
|
char *Str;
|
|
long long a;
|
|
short b;
|
|
long long c;
|
|
short d;
|
|
long long e;
|
|
int f;
|
|
NonTrivial() {
|
|
Str = (char*)"Non-Trivial";
|
|
a = 1;
|
|
b = 2;
|
|
c = 3;
|
|
d = 4;
|
|
e = 5;
|
|
f = 6;
|
|
}
|
|
~NonTrivial() { Str = nullptr; }
|
|
};
|
|
|
|
struct NonTrivialArrayByVal {
|
|
NonTrivial operator[](int x) { return S; }
|
|
private:
|
|
NonTrivial S;
|
|
};
|
|
|
|
struct PtrByVal {
|
|
int *operator[](int x) { return &a; }
|
|
private:
|
|
int a = 64;
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_unsafe"))) RefToPtr {
|
|
RefToPtr() { b = &a; }
|
|
int *&operator[](int x) { return b; }
|
|
private:
|
|
int a = 64;
|
|
int *b = nullptr;
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_unsafe"))) PtrToPtr {
|
|
PtrToPtr() { b = &a; }
|
|
int **operator[](int x) { return &b; }
|
|
private:
|
|
int a = 64;
|
|
int *b = nullptr;
|
|
};
|
|
|
|
struct ConstOpPtrByVal {
|
|
const int *operator[](int x) const { return &a; }
|
|
private:
|
|
int a = 64;
|
|
};
|
|
|
|
struct ConstPtrByVal {
|
|
const int *operator[](int x) { return &a; }
|
|
private:
|
|
int a = 64;
|
|
};
|
|
|
|
struct DerivedFromAddressOnlyIntWrapper : AddressOnlyIntWrapper {
|
|
DerivedFromAddressOnlyIntWrapper(int value) : AddressOnlyIntWrapper(value) { }
|
|
};
|
|
|
|
struct DerivedFromReadWriteIntArray : ReadWriteIntArray {};
|
|
|
|
struct DerivedFromNonTrivialArrayByVal : NonTrivialArrayByVal {};
|
|
|
|
struct SubscriptUnnamedParameter {
|
|
int operator[](int) const { return 123; }
|
|
};
|
|
|
|
struct SubscriptUnnamedParameterReadWrite {
|
|
int value = 0;
|
|
const int &operator[](int) const { return value; }
|
|
int &operator[](int) { return value; }
|
|
};
|
|
|
|
struct Iterator {
|
|
private:
|
|
int value = 123;
|
|
public:
|
|
int &operator*() { return value; }
|
|
};
|
|
|
|
struct ConstIterator {
|
|
private:
|
|
int value = 234;
|
|
public:
|
|
const int &operator*() const { return value; }
|
|
};
|
|
|
|
struct ConstIteratorByVal {
|
|
private:
|
|
int value = 456;
|
|
public:
|
|
int operator*() const { return value; }
|
|
};
|
|
|
|
struct AmbiguousOperatorStar {
|
|
private:
|
|
int value = 567;
|
|
public:
|
|
int &operator*() { return value; }
|
|
const int &operator*() const { return value; }
|
|
};
|
|
|
|
struct AmbiguousOperatorStar2 {
|
|
private:
|
|
int value = 678;
|
|
public:
|
|
int &operator*() & { return value; }
|
|
const int &operator*() const & { return value; }
|
|
const int &&operator*() const && { return static_cast<const int &&>(value); }
|
|
};
|
|
|
|
struct DerivedFromConstIterator : public ConstIterator {};
|
|
|
|
struct DerivedFromConstIteratorPrivately : private ConstIterator {};
|
|
|
|
class SubscriptSetterConst {
|
|
public:
|
|
using T = int;
|
|
|
|
SubscriptSetterConst() : p(new T[10]) {}
|
|
|
|
T& operator[](int i) const {
|
|
return p[i];
|
|
}
|
|
private:
|
|
T *p;
|
|
};
|
|
|
|
struct DerivedFromConstIteratorPrivatelyWithUsingDecl : private ConstIterator {
|
|
using ConstIterator::operator*;
|
|
};
|
|
|
|
struct DerivedFromAmbiguousOperatorStarPrivatelyWithUsingDecl
|
|
: private AmbiguousOperatorStar {
|
|
using AmbiguousOperatorStar::operator*;
|
|
};
|
|
|
|
struct DerivedFromLoadableIntWrapperWithUsingDecl : private LoadableIntWrapper {
|
|
using LoadableIntWrapper::operator-;
|
|
using LoadableIntWrapper::operator+=;
|
|
|
|
int getValue() const {
|
|
return value;
|
|
}
|
|
void setValue(int v) {
|
|
this->value = v;
|
|
}
|
|
};
|
|
|
|
struct HasOperatorCallWithDefaultArg {
|
|
int value;
|
|
int operator()(int x = 0) const { return value + x; }
|
|
};
|
|
|
|
class HasStaticOperatorCallBase {
|
|
public:
|
|
static int operator()(int x) { return x + 42; }
|
|
};
|
|
|
|
class HasStaticOperatorCallBaseNonTrivial: public NonTrivial {
|
|
public:
|
|
HasStaticOperatorCallBaseNonTrivial() {}
|
|
HasStaticOperatorCallBaseNonTrivial(const HasStaticOperatorCallBaseNonTrivial &self) : NonTrivial(self) {}
|
|
HasStaticOperatorCallBaseNonTrivial(HasStaticOperatorCallBaseNonTrivial &&self) : NonTrivial(self) {}
|
|
|
|
static int operator()(const NonTrivial &arg) { return arg.f + 42; }
|
|
};
|
|
|
|
class HasStaticOperatorCallDerived : public HasStaticOperatorCallBase {};
|
|
|
|
class HasStaticOperatorCallWithConstOperator {
|
|
public:
|
|
inline int operator()(int x, int y) const { return x + y; }
|
|
static int operator()(int x) {
|
|
return x - 1;
|
|
}
|
|
};
|
|
|
|
|
|
// This type is intentionally unimportable,
|
|
// to ensure that the function that uses in a parameter
|
|
// cannot import its parameter list.
|
|
struct UnimportableCxxTypeByDefault {
|
|
private:
|
|
UnimportableCxxTypeByDefault(const UnimportableCxxTypeByDefault &) = delete;
|
|
UnimportableCxxTypeByDefault(UnimportableCxxTypeByDefault &&) = delete;
|
|
};
|
|
|
|
struct HasStaticOperatorCallWithUnimportableCxxType {
|
|
// This operator won't be imported.
|
|
static int operator()(const UnimportableCxxTypeByDefault &) noexcept {
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
struct ClassWithOperatorStarAvailable {
|
|
int value;
|
|
|
|
public:
|
|
int &operator*() { return value; }
|
|
};
|
|
|
|
struct DerivedClassWithOperatorStarAvailable : ClassWithOperatorStarAvailable {
|
|
};
|
|
|
|
struct ClassWithOperatorStarUnavailable {
|
|
int value;
|
|
|
|
public:
|
|
int &operator*() __attribute__((availability(swift, unavailable))) {
|
|
return value;
|
|
}
|
|
};
|
|
|
|
struct DerivedClassWithOperatorStarUnavailable
|
|
: ClassWithOperatorStarUnavailable {};
|
|
|
|
struct ClassWithSuccessorAvailable {
|
|
int value;
|
|
|
|
public:
|
|
ClassWithSuccessorAvailable &operator++() {
|
|
value++;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
struct ClassWithSuccessorUnavailable {
|
|
int value;
|
|
|
|
public:
|
|
ClassWithSuccessorUnavailable &operator++()
|
|
__attribute__((availability(swift, unavailable))) {
|
|
value++;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
struct ClassWithOperatorEqualsParamUnnamed {
|
|
bool operator==(const ClassWithOperatorEqualsParamUnnamed &) const {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
#endif
|