OSDN Git Service

PR c++/36628
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / cpp0x / rv1p.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 // 1 at a time
32
33 one   sink_1_1(               A&);
34
35 int test1_1()
36 {
37                    A a;
38     const          A ca = a;
39           volatile A va;
40     const volatile A cva = a;
41     sa<sizeof(sink_1_1(a))           == 1> t1;
42     return 0;
43 }
44
45 two   sink_1_2(const          A&);
46
47 int test1_2()
48 {
49                    A a;
50     const          A ca = a;
51           volatile A va;
52     const volatile A cva = a;
53     sa<sizeof(sink_1_2(a))           == 2> t1;
54     sa<sizeof(sink_1_2(ca))          == 2> t2;
55     sa<sizeof(sink_1_2(source()))    == 2> t5;
56     sa<sizeof(sink_1_2(c_source()))  == 2> t6;
57     return 0;
58 }
59
60 three sink_1_3(volatile       A&);
61
62 int test1_3()
63 {
64                    A a;
65     const          A ca = a;
66           volatile A va;
67     const volatile A cva = a;
68     sa<sizeof(sink_1_3(a))           == 3> t1;
69     sa<sizeof(sink_1_3(va))          == 3> t3;
70     return 0;
71 }
72
73 four  sink_1_4(const volatile A&);
74
75 int test1_4()
76 {
77                    A a;
78     const          A ca = a;
79           volatile A va;
80     const volatile A cva = a;
81     sa<sizeof(sink_1_4(a))           == 4> t1;
82     sa<sizeof(sink_1_4(ca))          == 4> t2;
83     sa<sizeof(sink_1_4(va))          == 4> t3;
84     sa<sizeof(sink_1_4(cva))         == 4> t4;
85     return 0;
86 }
87
88 five  sink_1_5(               A&&);
89
90 int test1_5()
91 {
92                    A a;
93     const          A ca = a;
94           volatile A va;
95     const volatile A cva = a;
96     sa<sizeof(sink_1_5(a))           == 5> t1;
97     sa<sizeof(sink_1_5(source()))    == 5> t5;
98     return 0;
99 }
100
101 six   sink_1_6(const          A&&);
102
103 int test1_6()
104 {
105                    A a;
106     const          A ca = a;
107           volatile A va;
108     const volatile A cva = a;
109     sa<sizeof(sink_1_6(a))           == 6> t1;
110     sa<sizeof(sink_1_6(ca))          == 6> t2;
111     sa<sizeof(sink_1_6(source()))    == 6> t5;
112     sa<sizeof(sink_1_6(c_source()))  == 6> t6;
113     return 0;
114 }
115
116 seven sink_1_7(volatile       A&&);
117
118 int test1_7()
119 {
120                    A a;
121     const          A ca = a;
122           volatile A va;
123     const volatile A cva = a;
124     sa<sizeof(sink_1_7(a))           == 7> t1;
125     sa<sizeof(sink_1_7(va))          == 7> t3;
126     sa<sizeof(sink_1_7(source()))    == 7> t5;
127     sa<sizeof(sink_1_7(v_source()))  == 7> t7;
128     return 0;
129 }
130
131 eight sink_1_8(const volatile A&&);
132
133 int test1_8()
134 {
135                    A a;
136     const          A ca = a;
137           volatile A va;
138     const volatile A cva = a;
139     sa<sizeof(sink_1_8(a))           == 8> t1;
140     sa<sizeof(sink_1_8(ca))          == 8> t2;
141     sa<sizeof(sink_1_8(va))          == 8> t3;
142     sa<sizeof(sink_1_8(cva))         == 8> t4;
143     sa<sizeof(sink_1_8(source()))    == 8> t5;
144     sa<sizeof(sink_1_8(c_source()))  == 8> t6;
145     sa<sizeof(sink_1_8(v_source()))  == 8> t7;
146     sa<sizeof(sink_1_8(cv_source())) == 8> t8;
147     return 0;
148 }
149
150 int main()
151 {
152     return test1_1() + test1_2() + test1_3() + test1_4() +
153            test1_5() + test1_6() + test1_7() + test1_8();
154 }