Files
Alex Lorenz 415045024c [cxx-interop] Use a synthesized C++ method when accessing a base field or subscript from a derived class synthesized method
The use of a synthesized C++ method allows us to avoid making a copy of self when accessing the base field or subscript from Swift
2023-10-16 14:34:37 -07:00

71 lines
1.4 KiB
C++

int &getCopyCounter() {
static int copyCounter = 0;
return copyCounter;
}
class CopyTrackedBaseClass {
public:
CopyTrackedBaseClass(int x) : x(x) {}
CopyTrackedBaseClass(const CopyTrackedBaseClass &other) : x(other.x) {
++getCopyCounter();
}
int operator [](int y) const {
return y + x;
}
private:
int x;
};
class CopyTrackedDerivedClass: public CopyTrackedBaseClass {
public:
CopyTrackedDerivedClass(int x) : CopyTrackedBaseClass(x) {}
};
class NonEmptyBase {
public:
int getY() const {
return y;
}
private:
int y = 11;
};
class CopyTrackedDerivedDerivedClass: public NonEmptyBase, public CopyTrackedDerivedClass {
public:
CopyTrackedDerivedDerivedClass(int x) : CopyTrackedDerivedClass(x) {}
};
class SubscriptReturnsRef {
public:
const int &operator [](int y) const {
return x[y];
}
int &operator [](int y) {
return x[y];
}
private:
int x[10] = {0};
};
class DerivedSubscriptReturnsRef: public SubscriptReturnsRef {
public:
inline DerivedSubscriptReturnsRef() : SubscriptReturnsRef() {}
};
class NonConstSubscriptReturnsRef {
public:
int &operator [](int y) {
return x[y];
}
private:
int x[10] = {0};
};
class DerivedNonConstSubscriptReturnsRef: public NonConstSubscriptReturnsRef {
public:
inline DerivedNonConstSubscriptReturnsRef() : NonConstSubscriptReturnsRef() {}
};