1 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu %s
2 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++98 %s
3 // RUN: %clang_cc1 -fsyntax-only -fshow-overloads=best -verify -triple x86_64-linux-gnu -std=c++11 %s
4
5 struct yes;
6 struct no;
7
8 struct Short {
9 operator short();
10 };
11
12 struct Long {
13 operator long();
14 };
15
16 enum E1 { };
17 struct Enum1 {
18 operator E1();
19 };
20
21 enum E2 { };
22 struct Enum2 {
23 operator E2();
24 };
25
26
27 struct X {
28 void f();
29 };
30
31 typedef void (X::*pmf)();
32 struct Xpmf {
33 operator pmf();
34 };
35
36 yes& islong(long);
37 yes& islong(unsigned long); // FIXME: shouldn't be needed
38 no& islong(int);
39
f(Short s,Long l,Enum1 e1,Enum2 e2,Xpmf pmf)40 void f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) {
41 // C++ [over.built]p8
42 int i1 = +e1;
43 int i2 = -e2;
44
45 // C++ [over.built]p10:
46 int i3 = ~s;
47 bool b1 = !s;
48
49 // C++ [over.built]p12
50 (void)static_cast<yes&>(islong(s + l));
51 (void)static_cast<no&>(islong(s + s));
52
53 // C++ [over.built]p16
54 (void)(pmf == &X::f);
55 (void)(pmf == 0);
56
57 // C++ [over.built]p17
58 (void)static_cast<yes&>(islong(s % l));
59 (void)static_cast<yes&>(islong(l << s));
60 (void)static_cast<no&>(islong(s << l));
61 (void)static_cast<yes&>(islong(e1 % l));
62 // FIXME: should pass (void)static_cast<no&>(islong(e1 % e2));
63 }
64
65 struct BoolRef {
66 operator bool&();
67 };
68
69 struct ShortRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}
70 #if __cplusplus >= 201103L // C++11 or later
71 // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}
72 #endif
73 operator short&();
74 };
75
76 struct LongRef {
77 operator volatile long&();
78 };
79
80 struct FloatRef {
81 operator float&();
82 };
83
84 struct XpmfRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}
85 #if __cplusplus >= 201103L // C++11 or later
86 // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}}
87 #endif
88 operator pmf&();
89 };
90
91 struct E2Ref {
92 operator E2&();
93 };
94
g(BoolRef br,ShortRef sr,LongRef lr,FloatRef fr,E2Ref e2_ref,XpmfRef pmf_ref)95 void g(BoolRef br, ShortRef sr, LongRef lr, FloatRef fr, E2Ref e2_ref, XpmfRef pmf_ref) {
96 // C++ [over.built]p3
97 short s1 = sr++;
98
99 // C++ [over.built]p4
100 long l1 = lr--;
101
102 // C++ [over.built]p4
103 float f1 = fr--;
104
105 // C++ [over.built]p4
106 bool b2 = br--; // expected-error{{cannot decrement value of type 'BoolRef'}}
107
108 // C++ [over.built]p18
109 short& sr1 = (sr *= lr);
110 volatile long& lr1 = (lr *= sr);
111
112 // C++ [over.built]p20:
113 E2 e2r2;
114 e2r2 = e2_ref;
115
116 pmf &pmr = (pmf_ref = &X::f); // expected-error{{no viable overloaded '='}}
117 pmf pmr2;
118 pmr2 = pmf_ref;
119
120 // C++ [over.built]p22
121 short& sr2 = (sr %= lr);
122 volatile long& lr2 = (lr <<= sr);
123
124 bool b1 = (sr && lr) || (sr || lr);
125 }
126
127 struct VolatileIntPtr {
128 operator int volatile *();
129 };
130
131 struct ConstIntPtr {
132 operator int const *();
133 };
134
135 struct VolatileIntPtrRef {
136 operator int volatile *&();
137 };
138
139 struct ConstIntPtrRef {
140 operator int const *&();
141 };
142
test_with_ptrs(VolatileIntPtr vip,ConstIntPtr cip,ShortRef sr,VolatileIntPtrRef vipr,ConstIntPtrRef cipr)143 void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr,
144 VolatileIntPtrRef vipr, ConstIntPtrRef cipr) {
145 const int& cir1 = cip[sr];
146 const int& cir2 = sr[cip];
147 volatile int& vir1 = vip[sr];
148 volatile int& vir2 = sr[vip];
149 bool b1 = (vip == cip);
150 long p1 = vip - cip;
151
152 // C++ [over.built]p5:
153 int volatile *vip1 = vipr++;
154 int const *cip1 = cipr++;
155 int volatile *&vipr1 = ++vipr;
156 int const *&cipr1 = --cipr;
157
158 // C++ [over.built]p6:
159 int volatile &ivr = *vip;
160
161 // C++ [over.built]p8:
162 int volatile *vip2 = +vip;
163 int i1 = +sr;
164 int i2 = -sr;
165
166 // C++ [over.built]p13:
167 int volatile &ivr2 = vip[17];
168 int const &icr2 = 17[cip];
169 }
170
171 // C++ [over.match.open]p4
172
test_assign_restrictions(ShortRef & sr)173 void test_assign_restrictions(ShortRef& sr) {
174 sr = (short)0; // expected-error{{no viable overloaded '='}}
175 }
176
177 struct Base { };
178 struct Derived1 : Base { };
179 struct Derived2 : Base { };
180
181 template<typename T>
182 struct ConvertibleToPtrOf {
183 operator T*();
184 };
185
test_with_base_ptrs(ConvertibleToPtrOf<Derived1> d1,ConvertibleToPtrOf<Derived2> d2)186 bool test_with_base_ptrs(ConvertibleToPtrOf<Derived1> d1,
187 ConvertibleToPtrOf<Derived2> d2) {
188 return d1 == d2; // expected-error{{invalid operands}}
189 }
190
191 // DR425
192 struct A {
193 template< typename T > operator T() const;
194 };
195
test_dr425(A a)196 void test_dr425(A a) {
197 (void)(1.0f * a); // expected-error{{ambiguous}} \
198 // expected-note 12{{candidate}}
199 }
200
201 // pr5432
202 enum e {X};
203
204 const int a[][2] = {{1}};
205
test_pr5432()206 int test_pr5432() {
207 return a[X][X];
208 }
209
f()210 void f() {
211 (void)__extension__(A());
212 }
213
214 namespace PR7319 {
215 typedef enum { Enum1, Enum2, Enum3 } MyEnum;
216
217 template<typename X> bool operator>(const X &inX1, const X &inX2);
218
f()219 void f() {
220 MyEnum e1, e2;
221 if (e1 > e2) {}
222 }
223 }
224
225 namespace PR8477 {
226 struct Foo {
227 operator bool();
228 operator const char *();
229 };
230
doit()231 bool doit() {
232 Foo foo;
233 long long zero = 0;
234 (void)(foo + zero);
235 (void)(foo - zero);
236 (void)(zero + foo);
237 (void)(zero[foo]);
238 // FIXME: It would be nice to report fewer candidates here.
239 (void)(foo - foo); // expected-error{{use of overloaded operator '-' is ambiguous}} \
240 // expected-note 4{{built-in candidate operator-}} \
241 // expected-note{{142 candidates omitted}}
242 return foo[zero] == zero;
243 }
244 }
245
246 namespace PR7851 {
247 struct X {
248 operator const void *() const;
249 operator void *();
250
251 operator const unsigned *() const;
252 operator unsigned *();
253 };
254
f()255 void f() {
256 X x;
257 x[0] = 1;
258 *x = 0;
259 (void)(x - x);
260 }
261 }
262
263 namespace PR12854 {
264 enum { size = 1 };
plus_equals()265 void plus_equals() {
266 int* __restrict py;
267 py += size;
268 }
269
270 struct RestrictInt {
271 operator int* __restrict &();
272 };
273
user_conversions(RestrictInt ri)274 void user_conversions(RestrictInt ri) {
275 ++ri;
276 --ri;
277 ri++;
278 ri--;
279 }
280 }
281
282 namespace PR12964 {
283 struct X { operator __int128() const; } x;
284 bool a = x == __int128(0);
285 bool b = x == 0;
286
287 struct Y { operator unsigned __int128() const; } y;
288 bool c = y == __int128(0);
289 bool d = y == 0;
290
291 bool e = x == y;
292 }
293