1 // Testcase for N3276 and operator overloading
2 // { dg-require-effective-target c++11 }
3 
4 struct A;
5 struct B {
6   A operator()(int);
7   A operator[](int);
8   A operator=(int);
9   A operator+=(int);
10   A operator-=(int);
11   A operator*=(int);
12   A operator/=(int);
13   A operator^=(int);
14   A operator&=(int);
15   A operator|=(int);
16   A operator<<=(int);
17   A operator>>=(int);
18 };
19 
20 A operator-(B);
21 A operator+(B);
22 A operator*(B);
23 A operator&(B);
24 A operator!(B);
25 A operator~(B);
26 A operator++(B);
27 A operator--(B);
28 
29 A operator+(B,B);
30 A operator-(B,B);
31 A operator*(B,B);
32 A operator/(B,B);
33 A operator%(B,B);
34 A operator^(B,B);
35 A operator&(B,B);
36 A operator|(B,B);
37 A operator<(B,B);
38 A operator>(B,B);
39 A operator,(B,B);
40 A operator<<(B,B);
41 A operator>>(B,B);
42 A operator==(B,B);
43 A operator->*(B,B);
44 
45 #define TRY(E) static_cast<decltype(E)*>(0)
46 
47 template <class B>
f()48 void f()
49 {
50   B b;
51   TRY(b(0));
52   TRY(b[0]);
53   TRY(b=0);
54   TRY(b+=0);
55   TRY(b-=0);
56   TRY(b*=0);
57   TRY(b/=0);
58   TRY(b^=0);
59   TRY(b&=0);
60   TRY(b|=0);
61   TRY(b<<=0);
62   TRY(b>>=0);
63 
64   TRY(-b);
65   TRY(+b);
66   TRY(*b);
67   TRY(&b);
68   TRY(!b);
69   TRY(~b);
70   TRY(++b);
71   TRY(--b);
72 
73   TRY(b+b);
74   TRY(b-b);
75   TRY(b*b);
76   TRY(b/b);
77   TRY(b%b);
78   TRY(b^b);
79   TRY(b&b);
80   TRY(b|b);
81   TRY(b>b);
82   TRY(b<b);
83   TRY((b,b));
84   TRY(b<<b);
85   TRY(b>>b);
86   TRY(b==b);
87   TRY(b->*b);
88 }
89 
main()90 int main()
91 {
92   B b;
93   TRY(b(0));
94   TRY(b[0]);
95   TRY(b=0);
96   TRY(b+=0);
97   TRY(b-=0);
98   TRY(b*=0);
99   TRY(b/=0);
100   TRY(b^=0);
101   TRY(b&=0);
102   TRY(b|=0);
103   TRY(b<<=0);
104   TRY(b>>=0);
105 
106   TRY(-b);
107   TRY(+b);
108   TRY(*b);
109   TRY(&b);
110   TRY(!b);
111   TRY(~b);
112   TRY(++b);
113   TRY(--b);
114 
115   TRY(b+b);
116   TRY(b-b);
117   TRY(b*b);
118   TRY(b/b);
119   TRY(b%b);
120   TRY(b^b);
121   TRY(b&b);
122   TRY(b|b);
123   TRY(b>b);
124   TRY(b<b);
125   TRY((b,b));
126   TRY(b<<b);
127   TRY(b>>b);
128   TRY(b==b);
129   TRY(b->*b);
130 
131   f<B>();
132 }
133