xref: /llvm-project/lldb/test/API/lang/cpp/operators/main.cpp (revision 4ad53177db756849d0be70643aee77fed13a00e1)
199451b44SJordan Rupprecht #include <cstdlib>
299451b44SJordan Rupprecht 
399451b44SJordan Rupprecht int side_effect = 0;
499451b44SJordan Rupprecht 
599451b44SJordan Rupprecht struct B { int dummy = 2324; };
699451b44SJordan Rupprecht struct C {
operator newC7*4ad53177Sshafik   void *operator new(std::size_t size) { void *p = ::operator new(size); side_effect = 3; return p; }
operator new[]C8*4ad53177Sshafik   void *operator new[](std::size_t size) { void *p = ::operator new(size); side_effect = 4; return p; }
operator deleteC999451b44SJordan Rupprecht   void operator delete(void *p) { std::free(p); side_effect = 1; }
operator delete[]C1099451b44SJordan Rupprecht   void operator delete[](void *p) { std::free(p); side_effect = 2; }
1199451b44SJordan Rupprecht 
1299451b44SJordan Rupprecht   B b;
operator ->C1399451b44SJordan Rupprecht   B* operator->() { return &b; }
operator ->*C1499451b44SJordan Rupprecht   int operator->*(int) { return 2; }
operator +C1599451b44SJordan Rupprecht   int operator+(int) { return 44; }
operator +=C1699451b44SJordan Rupprecht   int operator+=(int) { return 42; }
operator ++C1799451b44SJordan Rupprecht   int operator++(int) { return 123; }
operator ++C1899451b44SJordan Rupprecht   int operator++() { return 1234; }
operator -C1999451b44SJordan Rupprecht   int operator-(int) { return 34; }
operator -=C2099451b44SJordan Rupprecht   int operator-=(int) { return 32; }
operator --C2199451b44SJordan Rupprecht   int operator--() { return 321; }
operator --C2299451b44SJordan Rupprecht   int operator--(int) { return 4321; }
2399451b44SJordan Rupprecht 
operator *C2499451b44SJordan Rupprecht   int operator*(int) { return 51; }
operator *=C2599451b44SJordan Rupprecht   int operator*=(int) { return 52; }
operator %C2699451b44SJordan Rupprecht   int operator%(int) { return 53; }
operator %=C2799451b44SJordan Rupprecht   int operator%=(int) { return 54; }
operator /C2899451b44SJordan Rupprecht   int operator/(int) { return 55; }
operator /=C2999451b44SJordan Rupprecht   int operator/=(int) { return 56; }
operator ^C3099451b44SJordan Rupprecht   int operator^(int) { return 57; }
operator ^=C3199451b44SJordan Rupprecht   int operator^=(int) { return 58; }
3299451b44SJordan Rupprecht 
operator |C3399451b44SJordan Rupprecht   int operator|(int) { return 61; }
operator |=C3499451b44SJordan Rupprecht   int operator|=(int) { return 62; }
operator ||C3599451b44SJordan Rupprecht   int operator||(int) { return 63; }
operator &C3699451b44SJordan Rupprecht   int operator&(int) { return 64; }
operator &=C3799451b44SJordan Rupprecht   int operator&=(int) { return 65; }
operator &&C3899451b44SJordan Rupprecht   int operator&&(int) { return 66; }
3999451b44SJordan Rupprecht 
operator ~C4099451b44SJordan Rupprecht   int operator~() { return 71; }
operator !C4199451b44SJordan Rupprecht   int operator!() { return 72; }
operator !=C4299451b44SJordan Rupprecht   int operator!=(int) { return 73; }
operator =C4399451b44SJordan Rupprecht   int operator=(int) { return 74; }
operator ==C4499451b44SJordan Rupprecht   int operator==(int) { return 75; }
4599451b44SJordan Rupprecht 
operator <C4699451b44SJordan Rupprecht   int operator<(int) { return 81; }
operator <<C4799451b44SJordan Rupprecht   int operator<<(int) { return 82; }
operator <=C4899451b44SJordan Rupprecht   int operator<=(int) { return 83; }
operator <<=C4999451b44SJordan Rupprecht   int operator<<=(int) { return 84; }
operator >C5099451b44SJordan Rupprecht   int operator>(int) { return 85; }
operator >>C5199451b44SJordan Rupprecht   int operator>>(int) { return 86; }
operator >=C5299451b44SJordan Rupprecht   int operator>=(int) { return 87; }
operator >>=C5399451b44SJordan Rupprecht   int operator>>=(int) { return 88; }
5499451b44SJordan Rupprecht 
operator ,C5599451b44SJordan Rupprecht   int operator,(int) { return 2012; }
operator &C5699451b44SJordan Rupprecht   int operator&() { return 2013; }
5799451b44SJordan Rupprecht 
operator ()C5899451b44SJordan Rupprecht   int operator()(int) { return 91; }
operator []C5999451b44SJordan Rupprecht   int operator[](int) { return 92; }
6099451b44SJordan Rupprecht 
operator intC6199451b44SJordan Rupprecht   operator int() { return 11; }
operator longC6299451b44SJordan Rupprecht   operator long() { return 12; }
6399451b44SJordan Rupprecht 
6499451b44SJordan Rupprecht   // Make sure this doesn't collide with
6599451b44SJordan Rupprecht   // the real operator int.
operatorintC6699451b44SJordan Rupprecht   int operatorint() { return 13; }
operatornewC6799451b44SJordan Rupprecht   int operatornew() { return 14; }
6899451b44SJordan Rupprecht };
6999451b44SJordan Rupprecht 
main(int argc,char ** argv)7099451b44SJordan Rupprecht int main(int argc, char **argv) {
7199451b44SJordan Rupprecht   C c;
7299451b44SJordan Rupprecht   int result = c->dummy;
7399451b44SJordan Rupprecht   result = c->*4;
7499451b44SJordan Rupprecht   result += c+1;
7599451b44SJordan Rupprecht   result += c+=1;
7699451b44SJordan Rupprecht   result += c++;
7799451b44SJordan Rupprecht   result += ++c;
7899451b44SJordan Rupprecht   result += c-1;
7999451b44SJordan Rupprecht   result += c-=1;
8099451b44SJordan Rupprecht   result += c--;
8199451b44SJordan Rupprecht   result += --c;
8299451b44SJordan Rupprecht 
8399451b44SJordan Rupprecht   result += c * 4;
8499451b44SJordan Rupprecht   result += c *= 4;
8599451b44SJordan Rupprecht   result += c % 4;
8699451b44SJordan Rupprecht   result += c %= 4;
8799451b44SJordan Rupprecht   result += c / 4;
8899451b44SJordan Rupprecht   result += c /= 4;
8999451b44SJordan Rupprecht   result += c ^ 4;
9099451b44SJordan Rupprecht   result += c ^= 4;
9199451b44SJordan Rupprecht 
9299451b44SJordan Rupprecht   result += c | 4;
9399451b44SJordan Rupprecht   result += c |= 4;
9499451b44SJordan Rupprecht   result += c || 4;
9599451b44SJordan Rupprecht   result += c & 4;
9699451b44SJordan Rupprecht   result += c &= 4;
9799451b44SJordan Rupprecht   result += c && 4;
9899451b44SJordan Rupprecht 
9999451b44SJordan Rupprecht   result += ~c;
10099451b44SJordan Rupprecht   result += !c;
10199451b44SJordan Rupprecht   result += c!=1;
10299451b44SJordan Rupprecht   result += c=2;
10399451b44SJordan Rupprecht   result += c==2;
10499451b44SJordan Rupprecht 
10599451b44SJordan Rupprecht   result += c<2;
10699451b44SJordan Rupprecht   result += c<<2;
10799451b44SJordan Rupprecht   result += c<=2;
10899451b44SJordan Rupprecht   result += c<<=2;
10999451b44SJordan Rupprecht   result += c>2;
11099451b44SJordan Rupprecht   result += c>>2;
11199451b44SJordan Rupprecht   result += c>=2;
11299451b44SJordan Rupprecht   result += c>>=2;
11399451b44SJordan Rupprecht 
11499451b44SJordan Rupprecht   result += (c , 2);
11599451b44SJordan Rupprecht   result += &c;
11699451b44SJordan Rupprecht 
11799451b44SJordan Rupprecht   result += c(1);
11899451b44SJordan Rupprecht   result += c[1];
11999451b44SJordan Rupprecht 
12099451b44SJordan Rupprecht   result += static_cast<int>(c);
12199451b44SJordan Rupprecht   result += static_cast<long>(c);
12299451b44SJordan Rupprecht   result += c.operatorint();
12399451b44SJordan Rupprecht   result += c.operatornew();
12499451b44SJordan Rupprecht 
12599451b44SJordan Rupprecht   C *c2 = new C();
12699451b44SJordan Rupprecht   C *c3 = new C[3];
12799451b44SJordan Rupprecht 
12899451b44SJordan Rupprecht   //% self.expect("expr c->dummy", endstr=" 2324\n")
12999451b44SJordan Rupprecht   //% self.expect("expr c->*2", endstr=" 2\n")
13099451b44SJordan Rupprecht   //% self.expect("expr c + 44", endstr=" 44\n")
13199451b44SJordan Rupprecht   //% self.expect("expr c += 42", endstr=" 42\n")
13299451b44SJordan Rupprecht   //% self.expect("expr c++", endstr=" 123\n")
13399451b44SJordan Rupprecht   //% self.expect("expr ++c", endstr=" 1234\n")
13499451b44SJordan Rupprecht   //% self.expect("expr c - 34", endstr=" 34\n")
13599451b44SJordan Rupprecht   //% self.expect("expr c -= 32", endstr=" 32\n")
13699451b44SJordan Rupprecht   //% self.expect("expr c--", endstr=" 4321\n")
13799451b44SJordan Rupprecht   //% self.expect("expr --c", endstr=" 321\n")
13899451b44SJordan Rupprecht   //% self.expect("expr c * 3", endstr=" 51\n")
13999451b44SJordan Rupprecht   //% self.expect("expr c *= 3", endstr=" 52\n")
14099451b44SJordan Rupprecht   //% self.expect("expr c % 3", endstr=" 53\n")
14199451b44SJordan Rupprecht   //% self.expect("expr c %= 3", endstr=" 54\n")
14299451b44SJordan Rupprecht   //% self.expect("expr c / 3", endstr=" 55\n")
14399451b44SJordan Rupprecht   //% self.expect("expr c /= 3", endstr=" 56\n")
14499451b44SJordan Rupprecht   //% self.expect("expr c ^ 3", endstr=" 57\n")
14599451b44SJordan Rupprecht   //% self.expect("expr c ^= 3", endstr=" 58\n")
14699451b44SJordan Rupprecht   //% self.expect("expr c | 3", endstr=" 61\n")
14799451b44SJordan Rupprecht   //% self.expect("expr c |= 3", endstr=" 62\n")
14899451b44SJordan Rupprecht   //% self.expect("expr c || 3", endstr=" 63\n")
14999451b44SJordan Rupprecht   //% self.expect("expr c & 3", endstr=" 64\n")
15099451b44SJordan Rupprecht   //% self.expect("expr c &= 3", endstr=" 65\n")
15199451b44SJordan Rupprecht   //% self.expect("expr c && 3", endstr=" 66\n")
15299451b44SJordan Rupprecht   //% self.expect("expr ~c", endstr=" 71\n")
15399451b44SJordan Rupprecht   //% self.expect("expr !c", endstr=" 72\n")
15499451b44SJordan Rupprecht   //% self.expect("expr c!=1", endstr=" 73\n")
15599451b44SJordan Rupprecht   //% self.expect("expr c=1", endstr=" 74\n")
15699451b44SJordan Rupprecht   //% self.expect("expr c==1", endstr=" 75\n")
15799451b44SJordan Rupprecht   //% self.expect("expr c<1", endstr=" 81\n")
15899451b44SJordan Rupprecht   //% self.expect("expr c<<1", endstr=" 82\n")
15999451b44SJordan Rupprecht   //% self.expect("expr c<=1", endstr=" 83\n")
16099451b44SJordan Rupprecht   //% self.expect("expr c<<=1", endstr=" 84\n")
16199451b44SJordan Rupprecht   //% self.expect("expr c>1", endstr=" 85\n")
16299451b44SJordan Rupprecht   //% self.expect("expr c>>1", endstr=" 86\n")
16399451b44SJordan Rupprecht   //% self.expect("expr c>=1", endstr=" 87\n")
16499451b44SJordan Rupprecht   //% self.expect("expr c>>=1", endstr=" 88\n")
16599451b44SJordan Rupprecht   //% self.expect("expr c,1", endstr=" 2012\n")
16699451b44SJordan Rupprecht   //% self.expect("expr &c", endstr=" 2013\n")
16799451b44SJordan Rupprecht   //% self.expect("expr c(1)", endstr=" 91\n")
16899451b44SJordan Rupprecht   //% self.expect("expr c[1]", endstr=" 92\n")
16999451b44SJordan Rupprecht   //% self.expect("expr static_cast<int>(c)", endstr=" 11\n")
17099451b44SJordan Rupprecht   //% self.expect("expr static_cast<long>(c)", endstr=" 12\n")
17199451b44SJordan Rupprecht   //% self.expect("expr c.operatorint()", endstr=" 13\n")
17299451b44SJordan Rupprecht   //% self.expect("expr c.operatornew()", endstr=" 14\n")
173*4ad53177Sshafik   //% self.expect("expr (new struct C); side_effect", endstr=" = 3\n")
174*4ad53177Sshafik   //% self.expect("expr (new struct C[1]); side_effect", endstr=" = 4\n")
17599451b44SJordan Rupprecht   //% self.expect("expr delete c2; side_effect", endstr=" = 1\n")
17699451b44SJordan Rupprecht   //% self.expect("expr delete[] c3; side_effect", endstr=" = 2\n")
17799451b44SJordan Rupprecht   delete c2;
17899451b44SJordan Rupprecht   delete[] c3;
17999451b44SJordan Rupprecht   return 0;
18099451b44SJordan Rupprecht }
181