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