OSDN Git Service

PR c++/37256
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / cpp0x / rv2n.C
1 // I, Howard Hinnant, hereby place this code in the public domain.
2
3 // Test overlaod resolution among referece types
4
5 // { dg-do compile }
6 // { dg-options "-std=c++0x" }
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&);  // { dg-message "candidates" }
34 two   sink_2_12(const          A&);  // { dg-message "note" }
35
36 int test2_12()
37 {
38                    A a;
39     const          A ca = a;
40           volatile A va;
41     const volatile A cva = a;
42     sink_2_12(va);           // { dg-error "no match" }
43     sink_2_12(cva);          // { dg-error "no match" }
44     sink_2_12(v_source());   // { dg-error "no match" }
45     sink_2_12(cv_source());  // { dg-error "no match" }
46     return 0;
47 }
48
49 one   sink_2_13(               A&);  // { dg-message "candidates" }
50 three sink_2_13(volatile       A&);  // { dg-message "note" }
51
52 int test2_13()
53 {
54                    A a;
55     const          A ca = a;
56           volatile A va;
57     const volatile A cva = a;
58     sink_2_13(ca);           // { dg-error "no match" }
59     sink_2_13(cva);          // { dg-error "no match" }
60     sink_2_13(source());     // { dg-error "no match" }
61     sink_2_13(c_source());   // { dg-error "no match" }
62     sink_2_13(v_source());   // { dg-error "no match" }
63     sink_2_13(cv_source());  // { dg-error "no match" }
64     return 0;
65 }
66
67 one   sink_2_14(               A&);  // { dg-message "candidates" }
68 four  sink_2_14(const volatile A&);  // { dg-message "note" }
69
70 int test2_14()
71 {
72                    A a;
73     const          A ca = a;
74           volatile A va;
75     const volatile A cva = a;
76     sink_2_14(source());     // { dg-error "no match" }
77     sink_2_14(c_source());   // { dg-error "no match" }
78     sink_2_14(v_source());   // { dg-error "no match" }
79     sink_2_14(cv_source());  // { dg-error "no match" }
80     return 0;
81 }
82
83 one   sink_2_15(               A&);  // { dg-message "candidates" }
84 five  sink_2_15(               A&&);  // { dg-message "note" }
85
86 int test2_15()
87 {
88                    A a;
89     const          A ca = a;
90           volatile A va;
91     const volatile A cva = a;
92    sink_2_15(ca);           // { dg-error "no match" }
93    sink_2_15(va);           // { dg-error "no match" }
94    sink_2_15(cva);          // { dg-error "no match" }
95    sink_2_15(c_source());   // { dg-error "no match" }
96    sink_2_15(v_source());   // { dg-error "no match" }
97    sink_2_15(cv_source());  // { dg-error "no match" }
98     return 0;
99 }
100
101 one   sink_2_16(               A&);  // { dg-message "candidates" }
102 six   sink_2_16(const          A&&);  // { dg-message "note" }
103
104 int test2_16()
105 {
106                    A a;
107     const          A ca = a;
108           volatile A va;
109     const volatile A cva = a;
110     sink_2_16(va);           // { dg-error "no match" }
111     sink_2_16(cva);          // { dg-error "no match" }
112     sink_2_16(v_source());   // { dg-error "no match" }
113     sink_2_16(cv_source());  // { dg-error "no match" }
114     return 0;
115 }
116
117 one   sink_2_17(               A&);  // { dg-message "candidates" }
118 seven sink_2_17(volatile       A&&);  // { dg-message "note" }
119
120 int test2_17()
121 {
122                    A a;
123     const          A ca = a;
124           volatile A va;
125     const volatile A cva = a;
126     sink_2_17(ca);           // { dg-error "no match" }
127     sink_2_17(cva);          // { dg-error "no match" }
128     sink_2_17(c_source());   // { dg-error "no match" }
129     sink_2_17(cv_source());  // { dg-error "no match" }
130     return 0;
131 }
132
133 two   sink_2_23(const          A&);  // { dg-message "candidates" }
134 three sink_2_23(volatile       A&);  // { dg-message "note" }
135
136 int test2_23()
137 {
138                    A a;
139     const          A ca = a;
140           volatile A va;
141     const volatile A cva = a;
142     sink_2_23(a);            // { dg-error "ambiguous" }
143     sink_2_23(cva);          // { dg-error "no match" }
144     sink_2_23(v_source());   // { dg-error "no match" }
145     sink_2_23(cv_source());  // { dg-error "no match" }
146     return 0;
147 }
148
149 two   sink_2_24(const          A&);  // { dg-message "candidates" }
150 four  sink_2_24(const volatile A&);  // { dg-message "note" }
151
152 int test2_24()
153 {
154                    A a;
155     const          A ca = a;
156           volatile A va;
157     const volatile A cva = a;
158     sink_2_24(v_source());   // { dg-error "no match" }
159     sink_2_24(cv_source());  // { dg-error "no match" }
160     return 0;
161 }
162
163 three sink_2_34(volatile       A&);  // { dg-message "candidate" }
164 four  sink_2_34(const volatile A&);  // { dg-message "note" }
165
166 int test2_34()
167 {
168                    A a;
169     const          A ca = a;
170           volatile A va;
171     const volatile A cva = a;
172     sink_2_34(source());     // { dg-error "no match" }
173     sink_2_34(c_source());   // { dg-error "no match" }
174     sink_2_34(v_source());   // { dg-error "no match" }
175     sink_2_34(cv_source());  // { dg-error "no match" }
176     return 0;
177 }
178
179 two   sink_2_25(const          A&);  // { dg-message "candidate" }
180 five  sink_2_25(               A&&);  // { dg-message "note" }
181
182 int test2_25()
183 {
184                    A a;
185     const          A ca = a;
186           volatile A va;
187     const volatile A cva = a;
188    sink_2_25(va);           // { dg-error "no match" }
189    sink_2_25(cva);          // { dg-error "no match" }
190    sink_2_25(v_source());   // { dg-error "no match" }
191    sink_2_25(cv_source());  // { dg-error "no match" }
192     return 0;
193 }
194
195 two   sink_2_26(const          A&);  // { dg-message "candidate" }
196 six   sink_2_26(const          A&&);  // { dg-message "note" }
197
198 int test2_26()
199 {
200                    A a;
201     const          A ca = a;
202           volatile A va;
203     const volatile A cva = a;
204     sink_2_26(va);           // { dg-error "no match" }
205     sink_2_26(cva);          // { dg-error "no match" }
206     sink_2_26(v_source());   // { dg-error "no match" }
207     sink_2_26(cv_source());  // { dg-error "no match" }
208     return 0;
209 }
210
211 two   sink_2_27(const          A&);  // { dg-message "candidate" }
212 seven sink_2_27(volatile       A&&);  // { dg-message "note" }
213
214 int test2_27()
215 {
216                    A a;
217     const          A ca = a;
218           volatile A va;
219     const volatile A cva = a;
220     sink_2_27(cva);          // { dg-error "no match" }
221     sink_2_27(cv_source());  // { dg-error "no match" }
222     return 0;
223 }
224
225 three sink_2_35(volatile       A&);  // { dg-message "candidate" }
226 five  sink_2_35(               A&&);  // { dg-message "note" }
227
228 int test2_35()
229 {
230                    A a;
231     const          A ca = a;
232           volatile A va;
233     const volatile A cva = a;
234     sink_2_35(ca);           // { dg-error "no match" }
235     sink_2_35(cva);          // { dg-error "no match" }
236     sink_2_35(c_source());   // { dg-error "no match" }
237     sink_2_35(v_source());   // { dg-error "no match" }
238     sink_2_35(cv_source());  // { dg-error "no match" }
239     return 0;
240 }
241
242 three sink_2_36(volatile       A&);  // { dg-message "candidate" }
243 six   sink_2_36(const          A&&);  // { dg-message "note" }
244
245 int test2_36()
246 {
247                    A a;
248     const          A ca = a;
249           volatile A va;
250     const volatile A cva = a;
251     sink_2_36(cva);          // { dg-error "no match" }
252     sink_2_36(v_source());   // { dg-error "no match" }
253     sink_2_36(cv_source());  // { dg-error "no match" }
254     return 0;
255 }
256
257 three sink_2_37(volatile       A&);  // { dg-message "candidate" }
258 seven sink_2_37(volatile       A&&);  // { dg-message "note" }
259
260 int test2_37()
261 {
262                    A a;
263     const          A ca = a;
264           volatile A va;
265     const volatile A cva = a;
266     sink_2_37(ca);           // { dg-error "no match" }
267     sink_2_37(cva);          // { dg-error "no match" }
268     sink_2_37(c_source());   // { dg-error "no match" }
269     sink_2_37(cv_source());  // { dg-error "no match" }
270     return 0;
271 }
272
273 four  sink_2_45(const volatile A&);   // { dg-message "candidate" }
274 five  sink_2_45(               A&&);  // { dg-message "note" }
275
276 int test2_45()
277 {
278                    A a;
279     const          A ca = a;
280           volatile A va;
281     const volatile A cva = a;
282     sink_2_45(c_source());   // { dg-error "no match" }
283     sink_2_45(v_source());   // { dg-error "no match" }
284     sink_2_45(cv_source());  // { dg-error "no match" }
285     return 0;
286 }
287
288 four  sink_2_46(const volatile A&);   // { dg-message "candidate" }
289 six   sink_2_46(const          A&&);  // { dg-message "note" }
290
291 int test2_46()
292 {
293                    A a;
294     const          A ca = a;
295           volatile A va;
296     const volatile A cva = a;
297     sink_2_46(v_source());   // { dg-error "no match" }
298     sink_2_46(cv_source());  // { dg-error "no match" }
299     return 0;
300 }
301
302 four  sink_2_47(const volatile A&);   // { dg-message "candidate" }
303 seven sink_2_47(volatile       A&&);  // { dg-message "note" }
304
305 int test2_47()
306 {
307                    A a;
308     const          A ca = a;
309           volatile A va;
310     const volatile A cva = a;
311     sink_2_47(c_source());   // { dg-error "no match" }
312     sink_2_47(cv_source());  // { dg-error "no match" }
313     return 0;
314 }
315
316 five  sink_2_56(               A&&);  // { dg-message "candidate" }
317 six   sink_2_56(const          A&&);  // { dg-message "note" }
318
319 int test2_56()
320 {
321                    A a;
322     const          A ca = a;
323           volatile A va;
324     const volatile A cva = a;
325     sink_2_56(va);           // { dg-error "no match" }
326     sink_2_56(cva);          // { dg-error "no match" }
327     sink_2_56(v_source());   // { dg-error "no match" }
328     sink_2_56(cv_source());  // { dg-error "no match" }
329     return 0;
330 }
331
332 five  sink_2_57(               A&&);  // { dg-message "candidate" }
333 seven sink_2_57(volatile       A&&);  // { dg-message "note" }
334
335 int test2_57()
336 {
337                    A a;
338     const          A ca = a;
339           volatile A va;
340     const volatile A cva = a;
341     sink_2_57(ca);           // { dg-error "no match" }
342     sink_2_57(cva);          // { dg-error "no match" }
343     sink_2_57(c_source());   // { dg-error "no match" }
344     sink_2_57(cv_source());  // { dg-error "no match" }
345     return 0;
346 }
347
348 six   sink_2_67(const          A&&);  // { dg-message "candidate" }
349 seven sink_2_67(volatile       A&&);  // { dg-message "note" }
350
351 int test2_67()
352 {
353                    A a;
354     const          A ca = a;
355           volatile A va;
356     const volatile A cva = a;
357     sink_2_67(a);            // { dg-error "ambiguous" }
358     sink_2_67(cva);          // { dg-error "no match" }
359     sink_2_67(source());     // { dg-error "ambiguous" }
360     sink_2_67(cv_source());  // { dg-error "no match" }
361     return 0;
362 }
363
364 int main()
365 {
366     return test2_12() + test2_13() + test2_15() + test2_16() +
367            test2_17() + test2_23() + test2_25() + test2_26() +
368            test2_27() + test2_35() + test2_36() + test2_37() +
369            test2_56() + test2_57() + test2_67();
370 }