1*99451b44SJordan Rupprecht #include <cstdlib> 2*99451b44SJordan Rupprecht 3*99451b44SJordan Rupprecht int side_effect = 0; 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht struct B { int dummy = 2324; }; 6*99451b44SJordan Rupprecht struct C { 7*99451b44SJordan Rupprecht void *operator new(size_t size) { C* r = ::new C; r->custom_new = true; return r; } 8*99451b44SJordan Rupprecht void *operator new[](size_t size) { C* r = static_cast<C*>(std::malloc(size)); r->custom_new = true; return r; } 9*99451b44SJordan Rupprecht void operator delete(void *p) { std::free(p); side_effect = 1; } 10*99451b44SJordan Rupprecht void operator delete[](void *p) { std::free(p); side_effect = 2; } 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprecht bool custom_new = false; 13*99451b44SJordan Rupprecht B b; 14*99451b44SJordan Rupprecht B* operator->() { return &b; } 15*99451b44SJordan Rupprecht int operator->*(int) { return 2; } 16*99451b44SJordan Rupprecht int operator+(int) { return 44; } 17*99451b44SJordan Rupprecht int operator+=(int) { return 42; } 18*99451b44SJordan Rupprecht int operator++(int) { return 123; } 19*99451b44SJordan Rupprecht int operator++() { return 1234; } 20*99451b44SJordan Rupprecht int operator-(int) { return 34; } 21*99451b44SJordan Rupprecht int operator-=(int) { return 32; } 22*99451b44SJordan Rupprecht int operator--() { return 321; } 23*99451b44SJordan Rupprecht int operator--(int) { return 4321; } 24*99451b44SJordan Rupprecht 25*99451b44SJordan Rupprecht int operator*(int) { return 51; } 26*99451b44SJordan Rupprecht int operator*=(int) { return 52; } 27*99451b44SJordan Rupprecht int operator%(int) { return 53; } 28*99451b44SJordan Rupprecht int operator%=(int) { return 54; } 29*99451b44SJordan Rupprecht int operator/(int) { return 55; } 30*99451b44SJordan Rupprecht int operator/=(int) { return 56; } 31*99451b44SJordan Rupprecht int operator^(int) { return 57; } 32*99451b44SJordan Rupprecht int operator^=(int) { return 58; } 33*99451b44SJordan Rupprecht 34*99451b44SJordan Rupprecht int operator|(int) { return 61; } 35*99451b44SJordan Rupprecht int operator|=(int) { return 62; } 36*99451b44SJordan Rupprecht int operator||(int) { return 63; } 37*99451b44SJordan Rupprecht int operator&(int) { return 64; } 38*99451b44SJordan Rupprecht int operator&=(int) { return 65; } 39*99451b44SJordan Rupprecht int operator&&(int) { return 66; } 40*99451b44SJordan Rupprecht 41*99451b44SJordan Rupprecht int operator~() { return 71; } 42*99451b44SJordan Rupprecht int operator!() { return 72; } 43*99451b44SJordan Rupprecht int operator!=(int) { return 73; } 44*99451b44SJordan Rupprecht int operator=(int) { return 74; } 45*99451b44SJordan Rupprecht int operator==(int) { return 75; } 46*99451b44SJordan Rupprecht 47*99451b44SJordan Rupprecht int operator<(int) { return 81; } 48*99451b44SJordan Rupprecht int operator<<(int) { return 82; } 49*99451b44SJordan Rupprecht int operator<=(int) { return 83; } 50*99451b44SJordan Rupprecht int operator<<=(int) { return 84; } 51*99451b44SJordan Rupprecht int operator>(int) { return 85; } 52*99451b44SJordan Rupprecht int operator>>(int) { return 86; } 53*99451b44SJordan Rupprecht int operator>=(int) { return 87; } 54*99451b44SJordan Rupprecht int operator>>=(int) { return 88; } 55*99451b44SJordan Rupprecht 56*99451b44SJordan Rupprecht int operator,(int) { return 2012; } 57*99451b44SJordan Rupprecht int operator&() { return 2013; } 58*99451b44SJordan Rupprecht 59*99451b44SJordan Rupprecht int operator()(int) { return 91; } 60*99451b44SJordan Rupprecht int operator[](int) { return 92; } 61*99451b44SJordan Rupprecht 62*99451b44SJordan Rupprecht operator int() { return 11; } 63*99451b44SJordan Rupprecht operator long() { return 12; } 64*99451b44SJordan Rupprecht 65*99451b44SJordan Rupprecht // Make sure this doesn't collide with 66*99451b44SJordan Rupprecht // the real operator int. 67*99451b44SJordan Rupprecht int operatorint() { return 13; } 68*99451b44SJordan Rupprecht int operatornew() { return 14; } 69*99451b44SJordan Rupprecht }; 70*99451b44SJordan Rupprecht 71*99451b44SJordan Rupprecht int main(int argc, char **argv) { 72*99451b44SJordan Rupprecht C c; 73*99451b44SJordan Rupprecht int result = c->dummy; 74*99451b44SJordan Rupprecht result = c->*4; 75*99451b44SJordan Rupprecht result += c+1; 76*99451b44SJordan Rupprecht result += c+=1; 77*99451b44SJordan Rupprecht result += c++; 78*99451b44SJordan Rupprecht result += ++c; 79*99451b44SJordan Rupprecht result += c-1; 80*99451b44SJordan Rupprecht result += c-=1; 81*99451b44SJordan Rupprecht result += c--; 82*99451b44SJordan Rupprecht result += --c; 83*99451b44SJordan Rupprecht 84*99451b44SJordan Rupprecht result += c * 4; 85*99451b44SJordan Rupprecht result += c *= 4; 86*99451b44SJordan Rupprecht result += c % 4; 87*99451b44SJordan Rupprecht result += c %= 4; 88*99451b44SJordan Rupprecht result += c / 4; 89*99451b44SJordan Rupprecht result += c /= 4; 90*99451b44SJordan Rupprecht result += c ^ 4; 91*99451b44SJordan Rupprecht result += c ^= 4; 92*99451b44SJordan Rupprecht 93*99451b44SJordan Rupprecht result += c | 4; 94*99451b44SJordan Rupprecht result += c |= 4; 95*99451b44SJordan Rupprecht result += c || 4; 96*99451b44SJordan Rupprecht result += c & 4; 97*99451b44SJordan Rupprecht result += c &= 4; 98*99451b44SJordan Rupprecht result += c && 4; 99*99451b44SJordan Rupprecht 100*99451b44SJordan Rupprecht result += ~c; 101*99451b44SJordan Rupprecht result += !c; 102*99451b44SJordan Rupprecht result += c!=1; 103*99451b44SJordan Rupprecht result += c=2; 104*99451b44SJordan Rupprecht result += c==2; 105*99451b44SJordan Rupprecht 106*99451b44SJordan Rupprecht result += c<2; 107*99451b44SJordan Rupprecht result += c<<2; 108*99451b44SJordan Rupprecht result += c<=2; 109*99451b44SJordan Rupprecht result += c<<=2; 110*99451b44SJordan Rupprecht result += c>2; 111*99451b44SJordan Rupprecht result += c>>2; 112*99451b44SJordan Rupprecht result += c>=2; 113*99451b44SJordan Rupprecht result += c>>=2; 114*99451b44SJordan Rupprecht 115*99451b44SJordan Rupprecht result += (c , 2); 116*99451b44SJordan Rupprecht result += &c; 117*99451b44SJordan Rupprecht 118*99451b44SJordan Rupprecht result += c(1); 119*99451b44SJordan Rupprecht result += c[1]; 120*99451b44SJordan Rupprecht 121*99451b44SJordan Rupprecht result += static_cast<int>(c); 122*99451b44SJordan Rupprecht result += static_cast<long>(c); 123*99451b44SJordan Rupprecht result += c.operatorint(); 124*99451b44SJordan Rupprecht result += c.operatornew(); 125*99451b44SJordan Rupprecht 126*99451b44SJordan Rupprecht C *c2 = new C(); 127*99451b44SJordan Rupprecht C *c3 = new C[3]; 128*99451b44SJordan Rupprecht 129*99451b44SJordan Rupprecht //% self.expect("expr c->dummy", endstr=" 2324\n") 130*99451b44SJordan Rupprecht //% self.expect("expr c->*2", endstr=" 2\n") 131*99451b44SJordan Rupprecht //% self.expect("expr c + 44", endstr=" 44\n") 132*99451b44SJordan Rupprecht //% self.expect("expr c += 42", endstr=" 42\n") 133*99451b44SJordan Rupprecht //% self.expect("expr c++", endstr=" 123\n") 134*99451b44SJordan Rupprecht //% self.expect("expr ++c", endstr=" 1234\n") 135*99451b44SJordan Rupprecht //% self.expect("expr c - 34", endstr=" 34\n") 136*99451b44SJordan Rupprecht //% self.expect("expr c -= 32", endstr=" 32\n") 137*99451b44SJordan Rupprecht //% self.expect("expr c--", endstr=" 4321\n") 138*99451b44SJordan Rupprecht //% self.expect("expr --c", endstr=" 321\n") 139*99451b44SJordan Rupprecht //% self.expect("expr c * 3", endstr=" 51\n") 140*99451b44SJordan Rupprecht //% self.expect("expr c *= 3", endstr=" 52\n") 141*99451b44SJordan Rupprecht //% self.expect("expr c % 3", endstr=" 53\n") 142*99451b44SJordan Rupprecht //% self.expect("expr c %= 3", endstr=" 54\n") 143*99451b44SJordan Rupprecht //% self.expect("expr c / 3", endstr=" 55\n") 144*99451b44SJordan Rupprecht //% self.expect("expr c /= 3", endstr=" 56\n") 145*99451b44SJordan Rupprecht //% self.expect("expr c ^ 3", endstr=" 57\n") 146*99451b44SJordan Rupprecht //% self.expect("expr c ^= 3", endstr=" 58\n") 147*99451b44SJordan Rupprecht //% self.expect("expr c | 3", endstr=" 61\n") 148*99451b44SJordan Rupprecht //% self.expect("expr c |= 3", endstr=" 62\n") 149*99451b44SJordan Rupprecht //% self.expect("expr c || 3", endstr=" 63\n") 150*99451b44SJordan Rupprecht //% self.expect("expr c & 3", endstr=" 64\n") 151*99451b44SJordan Rupprecht //% self.expect("expr c &= 3", endstr=" 65\n") 152*99451b44SJordan Rupprecht //% self.expect("expr c && 3", endstr=" 66\n") 153*99451b44SJordan Rupprecht //% self.expect("expr ~c", endstr=" 71\n") 154*99451b44SJordan Rupprecht //% self.expect("expr !c", endstr=" 72\n") 155*99451b44SJordan Rupprecht //% self.expect("expr c!=1", endstr=" 73\n") 156*99451b44SJordan Rupprecht //% self.expect("expr c=1", endstr=" 74\n") 157*99451b44SJordan Rupprecht //% self.expect("expr c==1", endstr=" 75\n") 158*99451b44SJordan Rupprecht //% self.expect("expr c<1", endstr=" 81\n") 159*99451b44SJordan Rupprecht //% self.expect("expr c<<1", endstr=" 82\n") 160*99451b44SJordan Rupprecht //% self.expect("expr c<=1", endstr=" 83\n") 161*99451b44SJordan Rupprecht //% self.expect("expr c<<=1", endstr=" 84\n") 162*99451b44SJordan Rupprecht //% self.expect("expr c>1", endstr=" 85\n") 163*99451b44SJordan Rupprecht //% self.expect("expr c>>1", endstr=" 86\n") 164*99451b44SJordan Rupprecht //% self.expect("expr c>=1", endstr=" 87\n") 165*99451b44SJordan Rupprecht //% self.expect("expr c>>=1", endstr=" 88\n") 166*99451b44SJordan Rupprecht //% self.expect("expr c,1", endstr=" 2012\n") 167*99451b44SJordan Rupprecht //% self.expect("expr &c", endstr=" 2013\n") 168*99451b44SJordan Rupprecht //% self.expect("expr c(1)", endstr=" 91\n") 169*99451b44SJordan Rupprecht //% self.expect("expr c[1]", endstr=" 92\n") 170*99451b44SJordan Rupprecht //% self.expect("expr static_cast<int>(c)", endstr=" 11\n") 171*99451b44SJordan Rupprecht //% self.expect("expr static_cast<long>(c)", endstr=" 12\n") 172*99451b44SJordan Rupprecht //% self.expect("expr c.operatorint()", endstr=" 13\n") 173*99451b44SJordan Rupprecht //% self.expect("expr c.operatornew()", endstr=" 14\n") 174*99451b44SJordan Rupprecht //% self.expect("expr (new C)->custom_new", endstr=" true\n") 175*99451b44SJordan Rupprecht //% self.expect("expr (new struct C[1])->custom_new", endstr=" true\n") 176*99451b44SJordan Rupprecht //% self.expect("expr delete c2; side_effect", endstr=" = 1\n") 177*99451b44SJordan Rupprecht //% self.expect("expr delete[] c3; side_effect", endstr=" = 2\n") 178*99451b44SJordan Rupprecht delete c2; 179*99451b44SJordan Rupprecht delete[] c3; 180*99451b44SJordan Rupprecht return 0; 181*99451b44SJordan Rupprecht } 182