Files
clang-p2996/lldb/test/API/lang/cpp/operators/main.cpp
shafik 4ad53177db [LLDB] Fix overloaded operator new cases in TestCppOperators.py which currently work by accident
The overloaded new operator in TestCppOperators.py are working by accident because of how
we currently deal with artificial methods.

Differential Revision: https://reviews.llvm.org/D79251
2020-05-04 13:57:42 -07:00

181 lines
5.5 KiB
C++

#include <cstdlib>
int side_effect = 0;
struct B { int dummy = 2324; };
struct C {
void *operator new(std::size_t size) { void *p = ::operator new(size); side_effect = 3; return p; }
void *operator new[](std::size_t size) { void *p = ::operator new(size); side_effect = 4; return p; }
void operator delete(void *p) { std::free(p); side_effect = 1; }
void operator delete[](void *p) { std::free(p); side_effect = 2; }
B b;
B* operator->() { return &b; }
int operator->*(int) { return 2; }
int operator+(int) { return 44; }
int operator+=(int) { return 42; }
int operator++(int) { return 123; }
int operator++() { return 1234; }
int operator-(int) { return 34; }
int operator-=(int) { return 32; }
int operator--() { return 321; }
int operator--(int) { return 4321; }
int operator*(int) { return 51; }
int operator*=(int) { return 52; }
int operator%(int) { return 53; }
int operator%=(int) { return 54; }
int operator/(int) { return 55; }
int operator/=(int) { return 56; }
int operator^(int) { return 57; }
int operator^=(int) { return 58; }
int operator|(int) { return 61; }
int operator|=(int) { return 62; }
int operator||(int) { return 63; }
int operator&(int) { return 64; }
int operator&=(int) { return 65; }
int operator&&(int) { return 66; }
int operator~() { return 71; }
int operator!() { return 72; }
int operator!=(int) { return 73; }
int operator=(int) { return 74; }
int operator==(int) { return 75; }
int operator<(int) { return 81; }
int operator<<(int) { return 82; }
int operator<=(int) { return 83; }
int operator<<=(int) { return 84; }
int operator>(int) { return 85; }
int operator>>(int) { return 86; }
int operator>=(int) { return 87; }
int operator>>=(int) { return 88; }
int operator,(int) { return 2012; }
int operator&() { return 2013; }
int operator()(int) { return 91; }
int operator[](int) { return 92; }
operator int() { return 11; }
operator long() { return 12; }
// Make sure this doesn't collide with
// the real operator int.
int operatorint() { return 13; }
int operatornew() { return 14; }
};
int main(int argc, char **argv) {
C c;
int result = c->dummy;
result = c->*4;
result += c+1;
result += c+=1;
result += c++;
result += ++c;
result += c-1;
result += c-=1;
result += c--;
result += --c;
result += c * 4;
result += c *= 4;
result += c % 4;
result += c %= 4;
result += c / 4;
result += c /= 4;
result += c ^ 4;
result += c ^= 4;
result += c | 4;
result += c |= 4;
result += c || 4;
result += c & 4;
result += c &= 4;
result += c && 4;
result += ~c;
result += !c;
result += c!=1;
result += c=2;
result += c==2;
result += c<2;
result += c<<2;
result += c<=2;
result += c<<=2;
result += c>2;
result += c>>2;
result += c>=2;
result += c>>=2;
result += (c , 2);
result += &c;
result += c(1);
result += c[1];
result += static_cast<int>(c);
result += static_cast<long>(c);
result += c.operatorint();
result += c.operatornew();
C *c2 = new C();
C *c3 = new C[3];
//% self.expect("expr c->dummy", endstr=" 2324\n")
//% self.expect("expr c->*2", endstr=" 2\n")
//% self.expect("expr c + 44", endstr=" 44\n")
//% self.expect("expr c += 42", endstr=" 42\n")
//% self.expect("expr c++", endstr=" 123\n")
//% self.expect("expr ++c", endstr=" 1234\n")
//% self.expect("expr c - 34", endstr=" 34\n")
//% self.expect("expr c -= 32", endstr=" 32\n")
//% self.expect("expr c--", endstr=" 4321\n")
//% self.expect("expr --c", endstr=" 321\n")
//% self.expect("expr c * 3", endstr=" 51\n")
//% self.expect("expr c *= 3", endstr=" 52\n")
//% self.expect("expr c % 3", endstr=" 53\n")
//% self.expect("expr c %= 3", endstr=" 54\n")
//% self.expect("expr c / 3", endstr=" 55\n")
//% self.expect("expr c /= 3", endstr=" 56\n")
//% self.expect("expr c ^ 3", endstr=" 57\n")
//% self.expect("expr c ^= 3", endstr=" 58\n")
//% self.expect("expr c | 3", endstr=" 61\n")
//% self.expect("expr c |= 3", endstr=" 62\n")
//% self.expect("expr c || 3", endstr=" 63\n")
//% self.expect("expr c & 3", endstr=" 64\n")
//% self.expect("expr c &= 3", endstr=" 65\n")
//% self.expect("expr c && 3", endstr=" 66\n")
//% self.expect("expr ~c", endstr=" 71\n")
//% self.expect("expr !c", endstr=" 72\n")
//% self.expect("expr c!=1", endstr=" 73\n")
//% self.expect("expr c=1", endstr=" 74\n")
//% self.expect("expr c==1", endstr=" 75\n")
//% self.expect("expr c<1", endstr=" 81\n")
//% self.expect("expr c<<1", endstr=" 82\n")
//% self.expect("expr c<=1", endstr=" 83\n")
//% self.expect("expr c<<=1", endstr=" 84\n")
//% self.expect("expr c>1", endstr=" 85\n")
//% self.expect("expr c>>1", endstr=" 86\n")
//% self.expect("expr c>=1", endstr=" 87\n")
//% self.expect("expr c>>=1", endstr=" 88\n")
//% self.expect("expr c,1", endstr=" 2012\n")
//% self.expect("expr &c", endstr=" 2013\n")
//% self.expect("expr c(1)", endstr=" 91\n")
//% self.expect("expr c[1]", endstr=" 92\n")
//% self.expect("expr static_cast<int>(c)", endstr=" 11\n")
//% self.expect("expr static_cast<long>(c)", endstr=" 12\n")
//% self.expect("expr c.operatorint()", endstr=" 13\n")
//% self.expect("expr c.operatornew()", endstr=" 14\n")
//% self.expect("expr (new struct C); side_effect", endstr=" = 3\n")
//% self.expect("expr (new struct C[1]); side_effect", endstr=" = 4\n")
//% self.expect("expr delete c2; side_effect", endstr=" = 1\n")
//% self.expect("expr delete[] c3; side_effect", endstr=" = 2\n")
delete c2;
delete[] c3;
return 0;
}