1 // I, Howard Hinnant, hereby place this code in the public domain.
2 
3 // Test overload resolution among reference types
4 
5 // { dg-do compile { target c++11 } }
6 // { dg-options "-fno-ipa-icf" }
7 
8 template <bool> struct sa;
9 template <> struct sa<true> {};
10 
11 struct one   {char x[1];};
12 struct two   {char x[2];};
13 struct three {char x[3];};
14 struct four  {char x[4];};
15 struct five  {char x[5];};
16 struct six   {char x[6];};
17 struct seven {char x[7];};
18 struct eight {char x[8];};
19 
20 struct A
21 {
22     A();
23     A(const volatile A&&);
24 };
25 
26                A    source();
27 const          A  c_source();
28       volatile A  v_source();
29 const volatile A cv_source();
30 
31 // 2 at a time
32 
33 one   sink_2_12(               A&);
34 two   sink_2_12(const          A&);
35 
36 int test2_12()
37 {
38                    A a;
39     const          A ca = a; // { dg-error "deleted" }
40           volatile A va;
41     const volatile A cva = a; // { dg-error "deleted" }
42     sink_2_12(va);           // { dg-error "" }
43     sink_2_12(cva);          // { dg-error "" }
44     sink_2_12(v_source());   // { dg-error "" }
45     sink_2_12(cv_source());  // { dg-error "" }
46     return 0;
47 }
48 
49 one   sink_2_13(               A&);
50 three sink_2_13(volatile       A&);
51 
52 int test2_13()
53 {
54                    A a;
55     const          A ca = a; // { dg-error "deleted" }
56           volatile A va;
57     const volatile A cva = a; // { dg-error "deleted" }
58     sink_2_13(ca);           // { dg-error "" }
59     sink_2_13(cva);          // { dg-error "" }
60     sink_2_13(source());     // { dg-error "" }
61     sink_2_13(c_source());   // { dg-error "" }
62     sink_2_13(v_source());   // { dg-error "" }
63     sink_2_13(cv_source());  // { dg-error "" }
64     return 0;
65 }
66 
67 one   sink_2_14(               A&);
68 four  sink_2_14(const volatile A&);
69 
70 int test2_14()
71 {
72                    A a;
73     const          A ca = a; // { dg-error "deleted" }
74           volatile A va;
75     const volatile A cva = a; // { dg-error "deleted" }
76     sink_2_14(source());     // { dg-error "" }
77     sink_2_14(c_source());   // { dg-error "" }
78     sink_2_14(v_source());   // { dg-error "" }
79     sink_2_14(cv_source());  // { dg-error "" }
80     return 0;
81 }
82 
83 one   sink_2_15(               A&);
84 five  sink_2_15(               A&&);
85 
86 int test2_15()
87 {
88                    A a;
89     const          A ca = a; // { dg-error "deleted" }
90           volatile A va;
91     const volatile A cva = a; // { dg-error "deleted" }
92    sink_2_15(ca);           // { dg-error "" }
93    sink_2_15(va);           // { dg-error "" }
94    sink_2_15(cva);          // { dg-error "" }
95    sink_2_15(c_source());   // { dg-error "" }
96    sink_2_15(v_source());   // { dg-error "" }
97    sink_2_15(cv_source());  // { dg-error "" }
98     return 0;
99 }
100 
101 one   sink_2_16(               A&);
102 six   sink_2_16(const          A&&);
103 
104 int test2_16()
105 {
106                    A a;
107     const          A ca = a; // { dg-error "deleted" }
108           volatile A va;
109     const volatile A cva = a; // { dg-error "deleted" }
110     sink_2_16(ca);	     // { dg-error "" }
111     sink_2_16(va);           // { dg-error "" }
112     sink_2_16(cva);          // { dg-error "" }
113     sink_2_16(v_source());   // { dg-error "" }
114     sink_2_16(cv_source());  // { dg-error "" }
115     return 0;
116 }
117 
118 one   sink_2_17(               A&);
119 seven sink_2_17(volatile       A&&);
120 
121 int test2_17()
122 {
123                    A a;
124     const          A ca = a; // { dg-error "deleted" }
125           volatile A va;
126     const volatile A cva = a; // { dg-error "deleted" }
127     sink_2_17(ca);           // { dg-error "" }
128     sink_2_17(va);           // { dg-error "" }
129     sink_2_17(cva);          // { dg-error "" }
130     sink_2_17(c_source());   // { dg-error "" }
131     sink_2_17(cv_source());  // { dg-error "" }
132     return 0;
133 }
134 
135 one   sink_2_18(               A&);
136 eight sink_2_18(const volatile A&&);
137 
138 int test2_18()
139 {
140                    A a;
141     const          A ca = a; // { dg-error "deleted" }
142           volatile A va;
143     const volatile A cva = a; // { dg-error "deleted" }
144     sink_2_18(ca);		// { dg-error "" }
145     sink_2_18(va);		// { dg-error "" }
146     sink_2_18(cva);		// { dg-error "" }
147     return 0;
148 }
149 
150 two   sink_2_23(const          A&);
151 three sink_2_23(volatile       A&);
152 
153 int test2_23()
154 {
155                    A a;
156     const          A ca = a; // { dg-error "deleted" }
157           volatile A va;
158     const volatile A cva = a; // { dg-error "deleted" }
159     sink_2_23(a);            // { dg-error "ambiguous" }
160     sink_2_23(cva);          // { dg-error "" }
161     sink_2_23(v_source());   // { dg-error "" }
162     sink_2_23(cv_source());  // { dg-error "" }
163     return 0;
164 }
165 
166 two   sink_2_24(const          A&);
167 four  sink_2_24(const volatile A&);
168 
169 int test2_24()
170 {
171                    A a;
172     const          A ca = a; // { dg-error "deleted" }
173           volatile A va;
174     const volatile A cva = a; // { dg-error "deleted" }
175     sink_2_24(v_source());   // { dg-error "" }
176     sink_2_24(cv_source());  // { dg-error "" }
177     return 0;
178 }
179 
180 three sink_2_34(volatile       A&);
181 four  sink_2_34(const volatile A&);
182 
183 int test2_34()
184 {
185                    A a;
186     const          A ca = a; // { dg-error "deleted" }
187           volatile A va;
188     const volatile A cva = a; // { dg-error "deleted" }
189     sink_2_34(source());     // { dg-error "" }
190     sink_2_34(c_source());   // { dg-error "" }
191     sink_2_34(v_source());   // { dg-error "" }
192     sink_2_34(cv_source());  // { dg-error "" }
193     return 0;
194 }
195 
196 two   sink_2_25(const          A&);
197 five  sink_2_25(               A&&);
198 
199 int test2_25()
200 {
201                    A a;
202     const          A ca = a; // { dg-error "deleted" }
203           volatile A va;
204     const volatile A cva = a; // { dg-error "deleted" }
205    sink_2_25(va);           // { dg-error "" }
206    sink_2_25(cva);          // { dg-error "" }
207    sink_2_25(v_source());   // { dg-error "" }
208    sink_2_25(cv_source());  // { dg-error "" }
209     return 0;
210 }
211 
212 two   sink_2_26(const          A&);
213 six   sink_2_26(const          A&&);
214 
215 int test2_26()
216 {
217                    A a;
218     const          A ca = a; // { dg-error "deleted" }
219           volatile A va;
220     const volatile A cva = a; // { dg-error "deleted" }
221     sink_2_26(va);           // { dg-error "" }
222     sink_2_26(cva);          // { dg-error "" }
223     sink_2_26(v_source());   // { dg-error "" }
224     sink_2_26(cv_source());  // { dg-error "" }
225     return 0;
226 }
227 
228 two   sink_2_27(const          A&);
229 seven sink_2_27(volatile       A&&);
230 
231 int test2_27()
232 {
233                    A a;
234     const          A ca = a; // { dg-error "deleted" }
235           volatile A va;
236     const volatile A cva = a; // { dg-error "deleted" }
237     sink_2_27(va);	     // { dg-error "" }
238     sink_2_27(cva);          // { dg-error "" }
239     sink_2_27(cv_source());  // { dg-error "" }
240     return 0;
241 }
242 
243 two   sink_2_28(const          A&);
244 eight sink_2_28(const volatile A&&);
245 
246 int test2_28()
247 {
248                    A a;
249     const          A ca = a; // { dg-error "deleted" }
250           volatile A va;
251     const volatile A cva = a; // { dg-error "deleted" }
252     sink_2_28(va);		// { dg-error "" }
253     sink_2_28(cva);		// { dg-error "" }
254     return 0;
255 }
256 
257 three sink_2_35(volatile       A&);
258 five  sink_2_35(               A&&);
259 
260 int test2_35()
261 {
262                    A a;
263     const          A ca = a; // { dg-error "deleted" }
264           volatile A va;
265     const volatile A cva = a; // { dg-error "deleted" }
266     sink_2_35(ca);           // { dg-error "" }
267     sink_2_35(cva);          // { dg-error "" }
268     sink_2_35(c_source());   // { dg-error "" }
269     sink_2_35(v_source());   // { dg-error "" }
270     sink_2_35(cv_source());  // { dg-error "" }
271     return 0;
272 }
273 
274 three sink_2_36(volatile       A&);
275 six   sink_2_36(const          A&&);
276 
277 int test2_36()
278 {
279                    A a;
280     const          A ca = a; // { dg-error "deleted" }
281           volatile A va;
282     const volatile A cva = a; // { dg-error "deleted" }
283     sink_2_36(ca);		// { dg-error "" }
284     sink_2_36(cva);          // { dg-error "" }
285     sink_2_36(v_source());   // { dg-error "" }
286     sink_2_36(cv_source());  // { dg-error "" }
287     return 0;
288 }
289 
290 three sink_2_37(volatile       A&);
291 seven sink_2_37(volatile       A&&);
292 
293 int test2_37()
294 {
295                    A a;
296     const          A ca = a; // { dg-error "deleted" }
297           volatile A va;
298     const volatile A cva = a; // { dg-error "deleted" }
299     sink_2_37(ca);           // { dg-error "" }
300     sink_2_37(cva);          // { dg-error "" }
301     sink_2_37(c_source());   // { dg-error "" }
302     sink_2_37(cv_source());  // { dg-error "" }
303     return 0;
304 }
305 
306 three sink_2_38(volatile       A&);
307 eight sink_2_38(const volatile A&&);
308 
309 void test2_38()
310 {
311                    A a;
312     const          A ca = a; // { dg-error "deleted" }
313           volatile A va;
314     const volatile A cva = a; // { dg-error "deleted" }
315     sink_2_38(ca);		// { dg-error "" }
316     sink_2_38(cva);		// { dg-error "" }
317 }
318 
319 four  sink_2_45(const volatile A&);
320 five  sink_2_45(               A&&);
321 
322 int test2_45()
323 {
324                    A a;
325     const          A ca = a; // { dg-error "deleted" }
326           volatile A va;
327     const volatile A cva = a; // { dg-error "deleted" }
328     sink_2_45(c_source());   // { dg-error "" }
329     sink_2_45(v_source());   // { dg-error "" }
330     sink_2_45(cv_source());  // { dg-error "" }
331     return 0;
332 }
333 
334 four  sink_2_46(const volatile A&);
335 six   sink_2_46(const          A&&);
336 
337 int test2_46()
338 {
339                    A a;
340     const          A ca = a; // { dg-error "deleted" }
341           volatile A va;
342     const volatile A cva = a; // { dg-error "deleted" }
343     sink_2_46(v_source());   // { dg-error "" }
344     sink_2_46(cv_source());  // { dg-error "" }
345     return 0;
346 }
347 
348 four  sink_2_47(const volatile A&);
349 seven sink_2_47(volatile       A&&);
350 
351 int test2_47()
352 {
353                    A a;
354     const          A ca = a; // { dg-error "deleted" }
355           volatile A va;
356     const volatile A cva = a; // { dg-error "deleted" }
357     sink_2_47(c_source());   // { dg-error "" }
358     sink_2_47(cv_source());  // { dg-error "" }
359     return 0;
360 }
361 
362 five  sink_2_56(               A&&);
363 six   sink_2_56(const          A&&);
364 
365 int test2_56()
366 {
367                    A a;
368     const          A ca = a; // { dg-error "deleted" }
369           volatile A va;
370     const volatile A cva = a; // { dg-error "deleted" }
371     sink_2_56(a);		// { dg-error "" }
372     sink_2_56(ca);		// { dg-error "" }
373     sink_2_56(va);           // { dg-error "" }
374     sink_2_56(cva);          // { dg-error "" }
375     sink_2_56(v_source());   // { dg-error "" }
376     sink_2_56(cv_source());  // { dg-error "" }
377     return 0;
378 }
379 
380 five  sink_2_57(               A&&);
381 seven sink_2_57(volatile       A&&);
382 
383 int test2_57()
384 {
385                    A a;
386     const          A ca = a; // { dg-error "deleted" }
387           volatile A va;
388     const volatile A cva = a; // { dg-error "deleted" }
389     sink_2_57(a);		// { dg-error "" }
390     sink_2_57(va);		// { dg-error "" }
391     sink_2_57(ca);           // { dg-error "" }
392     sink_2_57(cva);          // { dg-error "" }
393     sink_2_57(c_source());   // { dg-error "" }
394     sink_2_57(cv_source());  // { dg-error "" }
395     return 0;
396 }
397 
398 five  sink_2_58(               A&&);
399 eight sink_2_58(const volatile A&&);
400 
401 void test2_58()
402 {
403                    A a;
404     const          A ca = a; // { dg-error "deleted" }
405           volatile A va;
406     const volatile A cva = a; // { dg-error "deleted" }
407     sink_2_58(a);		// { dg-error "" }
408     sink_2_58(ca);		// { dg-error "" }
409     sink_2_58(va);		// { dg-error "" }
410     sink_2_58(cva);		// { dg-error "" }
411 }
412 
413 six   sink_2_67(const          A&&);
414 seven sink_2_67(volatile       A&&);
415 
416 int test2_67()
417 {
418                    A a;
419     const          A ca = a; // { dg-error "deleted" }
420           volatile A va;
421     const volatile A cva = a; // { dg-error "deleted" }
422     sink_2_67(a);            // { dg-error "" }
423     sink_2_67(ca);	     // { dg-error "" }
424     sink_2_67(va);	     // { dg-error "" }
425     sink_2_67(cva);          // { dg-error "" }
426     sink_2_67(source());     // { dg-error "" }
427     sink_2_67(cv_source());  // { dg-error "" }
428     return 0;
429 }
430 
431 six   sink_2_68(const          A&&);
432 eight sink_2_68(const volatile A&&);
433 
434 int test2_68()
435 {
436                    A a;
437     const          A ca = a; // { dg-error "deleted" }
438           volatile A va;
439     const volatile A cva = a; // { dg-error "deleted" }
440     sink_2_68(a);		// { dg-error "" }
441     sink_2_68(ca);		// { dg-error "" }
442     sink_2_68(va);		// { dg-error "" }
443     sink_2_68(cva);		// { dg-error "" }
444     return 0;
445 }
446 
447 seven sink_2_78(volatile       A&&);
448 eight sink_2_78(const volatile A&&);
449 
450 int test2_78()
451 {
452                    A a;
453     const          A ca = a; // { dg-error "deleted" }
454           volatile A va;
455     const volatile A cva = a; // { dg-error "deleted" }
456     sink_2_78(a);		// { dg-error "" }
457     sink_2_78(ca);		// { dg-error "" }
458     sink_2_78(va);		// { dg-error "" }
459     sink_2_78(cva);		// { dg-error "" }
460     return 0;
461 }
462 
463 int main()
464 {
465     return test2_12() + test2_13() + test2_15() + test2_16() +
466            test2_17() + test2_23() + test2_25() + test2_26() +
467            test2_27() + test2_35() + test2_36() + test2_37() +
468            test2_56() + test2_57() + test2_67();
469 }
470