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 // 6 at a time
32 
33 one   sink_6_123456(               A&);  // { dg-message "one sink_6_123456|no known conversion" }
34 two   sink_6_123456(const          A&);
35 three sink_6_123456(volatile       A&);
36 four  sink_6_123456(const volatile A&);
37 five  sink_6_123456(               A&&);
38 six   sink_6_123456(const          A&&);
39 
40 int test6_123456()
41 {
42                    A a;
43     const          A ca = a; // { dg-error "deleted" }
44           volatile A va;
45     const volatile A cva = a; // { dg-error "deleted" }
46     sink_6_123456(v_source());   // { dg-error "" }
47     sink_6_123456(cv_source());  // { dg-error "" }
48     return 0;
49 }
50 
51 one   sink_6_123457(               A&);  // { dg-message "one sink_6_123457|no known conversion" }
52 two   sink_6_123457(const          A&);
53 three sink_6_123457(volatile       A&);
54 four  sink_6_123457(const volatile A&);
55 five  sink_6_123457(               A&&);
56 seven sink_6_123457(volatile       A&&);
57 
58 int test6_123457()
59 {
60                    A a;
61     const          A ca = a; // { dg-error "deleted" }
62           volatile A va;
63     const volatile A cva = a; // { dg-error "deleted" }
64     sink_6_123457(cv_source());  // { dg-error "" }
65     return 0;
66 }
67 
68 two   sink_6_235678(const          A&);
69 three sink_6_235678(volatile       A&);
70 five  sink_6_235678(               A&&);
71 six   sink_6_235678(const          A&&);
72 seven sink_6_235678(volatile       A&&);
73 eight sink_6_235678(const volatile A&&);  // { dg-message "" }
74 
75 int test6_235678()
76 {
77                    A a;
78     const          A ca = a; // { dg-error "deleted" }
79           volatile A va;
80     const volatile A cva = a; // { dg-error "deleted" }
81     sink_6_235678(a);  // { dg-error "" }
82     sink_6_235678(cva);		// { dg-error "" }
83     return 0;
84 }
85 
86 two   sink_6_234678(const          A&);
87 three sink_6_234678(volatile       A&);
88 four  sink_6_234678(const volatile A&);
89 six   sink_6_234678(const          A&&);
90 seven sink_6_234678(volatile       A&&);
91 eight sink_6_234678(const volatile A&&);
92 
93 int test6_234678()
94 {
95                    A a;
96     const          A ca = a; // { dg-error "deleted" }
97           volatile A va;
98     const volatile A cva = a; // { dg-error "deleted" }
99     sink_6_234678(a);         // { dg-error "" }
100     sink_6_234678(source());  // { dg-error "" }
101     return 0;
102 }
103 
104 two   sink_6_234578(const          A&);
105 three sink_6_234578(volatile       A&);
106 four  sink_6_234578(const volatile A&);
107 five  sink_6_234578(               A&&);
108 seven sink_6_234578(volatile       A&&);
109 eight sink_6_234578(const volatile A&&);
110 
111 int test6_234578()
112 {
113                    A a;
114     const          A ca = a; // { dg-error "deleted" }
115           volatile A va;
116     const volatile A cva = a; // { dg-error "deleted" }
117     sink_6_234578(a);  // { dg-error "" }
118     return 0;
119 }
120 
121 two   sink_6_234568(const          A&);
122 three sink_6_234568(volatile       A&);
123 four  sink_6_234568(const volatile A&);
124 five  sink_6_234568(               A&&);
125 six   sink_6_234568(const          A&&);
126 eight sink_6_234568(const volatile A&&);
127 
128 int test6_234568()
129 {
130                    A a;
131     const          A ca = a; // { dg-error "deleted" }
132           volatile A va;
133     const volatile A cva = a; // { dg-error "deleted" }
134     sink_6_234568(a);  // { dg-error "" }
135     return 0;
136 }
137 
138 two   sink_6_234567(const          A&);  // { dg-message "two sink_6_234567|no known conversion" }
139 three sink_6_234567(volatile       A&);
140 four  sink_6_234567(const volatile A&);
141 five  sink_6_234567(               A&&);
142 six   sink_6_234567(const          A&&);
143 seven sink_6_234567(volatile       A&&);
144 
145 int test6_234567()
146 {
147                    A a;
148     const          A ca = a; // { dg-error "deleted" }
149           volatile A va;
150     const volatile A cva = a; // { dg-error "deleted" }
151     sink_6_234567(a);            // { dg-error "" }
152     sink_6_234567(cv_source());  // { dg-error "" }
153     return 0;
154 }
155 
156 one   sink_6_134678(               A&);
157 three sink_6_134678(volatile       A&);
158 four  sink_6_134678(const volatile A&);
159 six   sink_6_134678(const          A&&);
160 seven sink_6_134678(volatile       A&&);
161 eight sink_6_134678(const volatile A&&);
162 
163 int test6_134678()
164 {
165                    A a;
166     const          A ca = a; // { dg-error "deleted" }
167           volatile A va;
168     const volatile A cva = a; // { dg-error "deleted" }
169     sink_6_134678(source());  // { dg-error "" }
170     return 0;
171 }
172 
173 one   sink_6_124678(               A&);
174 two   sink_6_124678(const          A&);
175 four  sink_6_124678(const volatile A&);
176 six   sink_6_124678(const          A&&);
177 seven sink_6_124678(volatile       A&&);
178 eight sink_6_124678(const volatile A&&);
179 
180 int test6_124678()
181 {
182                    A a;
183     const          A ca = a; // { dg-error "deleted" }
184           volatile A va;
185     const volatile A cva = a; // { dg-error "deleted" }
186     sink_6_124678(source());  // { dg-error "" }
187     return 0;
188 }
189 
190 one   sink_6_123678(               A&);
191 two   sink_6_123678(const          A&);
192 three sink_6_123678(volatile       A&);
193 six   sink_6_123678(const          A&&);
194 seven sink_6_123678(volatile       A&&);
195 eight sink_6_123678(const volatile A&&);  // { dg-message "" }
196 
197 int test6_123678()
198 {
199                    A a;
200     const          A ca = a; // { dg-error "deleted" }
201           volatile A va;
202     const volatile A cva = a; // { dg-error "deleted" }
203     sink_6_123678(cva);		// { dg-error "" }
204     sink_6_123678(source());  // { dg-error "" }
205     return 0;
206 }
207 
208 one   sink_6_123567(               A&);  // { dg-message "one sink_6_123567|no known conversion" }
209 two   sink_6_123567(const          A&);
210 three sink_6_123567(volatile       A&);
211 five  sink_6_123567(               A&&);
212 six   sink_6_123567(const          A&&);
213 seven sink_6_123567(volatile       A&&);
214 
215 int test6_123567()
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_6_123567(cva);          // { dg-error "" }
222     sink_6_123567(cv_source());  // { dg-error "" }
223     return 0;
224 }
225 
226 one   sink_6_123568(               A&);
227 two   sink_6_123568(const          A&);
228 three sink_6_123568(volatile       A&);
229 five  sink_6_123568(               A&&);
230 six   sink_6_123568(const          A&&);
231 eight sink_6_123568(const volatile A&&); // { dg-message "" }
232 
233 int test6_123568()
234 {
235                    A a;
236     const          A ca = a; // { dg-error "deleted" }
237           volatile A va;
238     const volatile A cva = a; // { dg-error "deleted" }
239     sink_6_123568(cva); // { dg-error "" }
240     return 0;
241 }
242 
243 one   sink_6_123578(               A&);
244 two   sink_6_123578(const          A&);
245 three sink_6_123578(volatile       A&);
246 five  sink_6_123578(               A&&);
247 seven sink_6_123578(volatile       A&&);
248 eight sink_6_123578(const volatile A&&); // { dg-message "" }
249 
250 int test6_123578()
251 {
252                    A a;
253     const          A ca = a; // { dg-error "deleted" }
254           volatile A va;
255     const volatile A cva = a; // { dg-error "deleted" }
256     sink_6_123578(cva);		// { dg-error "" }
257     return 0;
258 }
259 
260 one   sink_6_123467(               A&);  // { dg-message "one sink_6_123467|no known conversion" }
261 two   sink_6_123467(const          A&);
262 three sink_6_123467(volatile       A&);
263 four  sink_6_123467(const volatile A&);
264 six   sink_6_123467(const          A&&);
265 seven sink_6_123467(volatile       A&&);
266 
267 int test6_123467()
268 {
269                    A a;
270     const          A ca = a; // { dg-error "deleted" }
271           volatile A va;
272     const volatile A cva = a; // { dg-error "deleted" }
273     sink_6_123467(source());     // { dg-error "" }
274     sink_6_123467(cv_source());  // { dg-error "" }
275     return 0;
276 }
277 
278 one   sink_6_124567(               A&);  // { dg-message "one sink_6_124567|no known conversion" }
279 two   sink_6_124567(const          A&);
280 four  sink_6_124567(const volatile A&);
281 five  sink_6_124567(               A&&);
282 six   sink_6_124567(const          A&&);
283 seven sink_6_124567(volatile       A&&);
284 
285 int test6_124567()
286 {
287                    A a;
288     const          A ca = a; // { dg-error "deleted" }
289           volatile A va;
290     const volatile A cva = a; // { dg-error "deleted" }
291     sink_6_124567(cv_source());  // { dg-error "" }
292     return 0;
293 }
294 
295 one   sink_6_125678(               A&);
296 two   sink_6_125678(const          A&);
297 five  sink_6_125678(               A&&);
298 six   sink_6_125678(const          A&&);
299 seven sink_6_125678(volatile       A&&); // { dg-message "" }
300 eight sink_6_125678(const volatile A&&); // { dg-message "" }
301 
302 int test6_125678()
303 {
304                    A a;
305     const          A ca = a; // { dg-error "deleted" }
306           volatile A va;
307     const volatile A cva = a; // { dg-error "deleted" }
308     sink_6_125678(va);		// { dg-error "" }
309     sink_6_125678(cva);		// { dg-error "" }
310     return 0;
311 }
312 
313 one   sink_6_134567(               A&);  // { dg-message "one sink_6_134567|no known conversion" }
314 three sink_6_134567(volatile       A&);
315 four  sink_6_134567(const volatile A&);
316 five  sink_6_134567(               A&&);
317 six   sink_6_134567(const          A&&);
318 seven sink_6_134567(volatile       A&&);
319 
320 int test6_134567()
321 {
322                    A a;
323     const          A ca = a; // { dg-error "deleted" }
324           volatile A va;
325     const volatile A cva = a; // { dg-error "deleted" }
326     sink_6_134567(cv_source());  // { dg-error "" }
327     return 0;
328 }
329 
330 one   sink_6_135678(               A&);
331 three sink_6_135678(volatile       A&);
332 five  sink_6_135678(               A&&);
333 six   sink_6_135678(const          A&&); // { dg-message "" }
334 seven sink_6_135678(volatile       A&&);
335 eight sink_6_135678(const volatile A&&); // { dg-message "" }
336 
337 int test6_135678()
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_6_135678(ca);		// { dg-error "" }
344     sink_6_135678(cva);		// { dg-error "" }
345     return 0;
346 }
347 
348 int main()
349 {
350     return test6_235678() + test6_234678() + test6_234578() + test6_234568() +
351            test6_234567() + test6_134678() + test6_124678() + test6_123678() +
352            test6_123567();
353 }
354