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