Add ADL support
[binutils-gdb.git] / gdb / testsuite / gdb.cp / koenig.cc
1 namespace A
2 {
3 class C
4 {
5 public:
6 static const int x = 11;
7 };
8
9 int
10 first (C c)
11 {
12 return 11;
13 }
14
15 int
16 first (int a, C c)
17 {
18 return 22;
19 }
20
21 int
22 second (int a, int b, C cc, int c, int d)
23 {
24 return 33;
25 }
26
27 }
28
29 struct B
30 {
31 A::C c;
32 };
33
34 //------------
35
36 namespace E
37 {
38 class O{};
39 int foo (O o){return 1; }
40 int foo (O o, O o2){return 2; }
41 int foo (O o, O o2, int i){return 3; }
42 }
43
44 namespace F
45 {
46 class O{};
47 int foo ( O fo, ::E::O eo){ return 4;}
48 int foo (int i, O fo, ::E::O eo){ return 5;}
49 }
50
51 namespace G
52 {
53 class O{};
54 int foo (O go, ::F::O fo, ::E::O eo){ return 6; }
55 }
56
57 //------------
58
59 namespace H
60 {
61 class O{};
62 int foo (O){ return 7;}
63 }
64
65 namespace I
66 {
67 class O: public H::O {};
68 class X: H::O{};
69 }
70
71 //------------
72
73 namespace J
74 {
75 union U{};
76 struct S{};
77 enum E{};
78
79 class A{
80 public:
81 class B{};
82 };
83
84 class C{};
85
86 int foo (U){ return 8;}
87 int foo (S){ return 9;}
88 int foo (E){ return 10;}
89 int foo (A::B){ return 11;}
90 int foo (A*){ return 12;}
91 int foo (A**){ return 13;}
92 int foo (C[]){ return 14;}
93
94 }
95 //------------
96
97 namespace K{
98 class O{};
99
100 int foo(O, int){
101 return 15;
102 }
103
104 int bar(O, int){
105 return 15;
106 }
107 }
108
109 int foo(K::O, float){
110 return 16;
111 }
112
113 int bar(K::O, int){
114 return 16;
115 }
116 //------------
117
118 namespace L {
119 namespace A{
120 namespace B{
121 class O {};
122
123 int foo (O){
124 return 17;
125 }
126
127 }
128 }
129 }
130
131 //------------
132
133 namespace M {
134 class A{
135 public:
136 int foo(char) {
137 return 18;
138 }
139 };
140
141 int foo(A,char){
142 return 19;
143 }
144
145 int foo(A *,char){
146 return 23;
147 }
148
149 int bar(char){
150 return 21;
151 }
152
153 namespace N {
154 int foo(::M::A,int){
155 return 20;
156 }
157
158 int bar(int){
159 return 22;
160 }
161 }
162 }
163 //------------
164
165 namespace O {
166 class A{};
167
168 int foo(A,int){
169 return 23;
170 }
171
172 }
173
174 typedef O::A TOA;
175 typedef TOA TTOA;
176
177 //------------
178 int
179 main ()
180 {
181 A::C c;
182 B b;
183
184 A::first (c);
185 first (0, c);
186 second (0, 0, c, 0, 0);
187 A::first (b.c);
188
189 E::O eo;
190 F::O fo;
191 G::O go;
192
193 foo (eo);
194 foo (eo, eo);
195 foo (eo, eo, 1);
196 foo (fo, eo);
197 foo (1 ,fo, eo);
198 foo (go, fo, eo);
199
200 I::O io;
201 I::X ix;
202
203 foo (io);
204 //foo (ix);
205
206 J::U ju;
207 J::S js;
208 J::E je;
209 J::A::B jab;
210 J::A *jap;
211 J::A **japp;
212 J::C jca[3];
213
214 foo (ju);
215 foo (js);
216 foo (je);
217 foo (jab);
218 foo (jap);
219 foo (japp);
220 foo (jca);
221
222 K::O ko;
223 foo (ko, 1);
224 foo (ko, 1.0f);
225 //bar(ko,1);
226
227 L::A::B::O labo;
228 foo (labo);
229
230 M::A ma;
231 foo(ma,'a');
232 ma.foo('a');
233 M::N::foo(ma,'a');
234
235 M::bar('a');
236 M::N::bar('a');
237
238 TTOA ttoa;
239 foo (ttoa, 'a');
240
241 return first (0, c) + foo (eo) +
242 foo (eo, eo) + foo (eo, eo, 1) +
243 foo (fo, eo) + foo (1 ,fo, eo) +
244 foo (go, fo, eo);
245 }