xref: /netbsd-src/external/gpl3/gdb/dist/gdb/testsuite/gdb.cp/koenig.cc (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
1 namespace A
2 {
3   class C
4   {
5   public:
6     static const int x = 11;
7   };
8 
9   int
first(C c)10   first (C c)
11   {
12     return 11;
13   }
14 
15   int
first(int a,C c)16   first (int a, C c)
17   {
18     return 22;
19   }
20 
21   int
second(int a,int b,C cc,int c,int d)22   second (int a, int b, C cc, int c, int d)
23   {
24     return 33;
25   }
26 
27   int
entry(C c)28   entry (C c)
29   {
30     return 44;
31   }
32 }
33 
34 struct B
35 {
36   A::C c;
37 };
38 
39 //------------
40 
41 namespace E
42 {
43   class O{};
foo(O o)44   int foo (O o){return 1; }
foo(O o,O o2)45   int foo (O o, O o2){return 2; }
foo(O o,O o2,int i)46   int foo (O o, O o2, int i){return 3; }
47 }
48 
49 namespace F
50 {
51   class O{};
foo(O fo,::E::O eo)52   int foo (       O fo, ::E::O eo){ return 4;}
foo(int i,O fo,::E::O eo)53   int foo (int i, O fo, ::E::O eo){ return 5;}
54 }
55 
56 namespace G
57 {
58   class O{};
foo(O go,::F::O fo,::E::O eo)59   int foo (O go, ::F::O fo, ::E::O eo){ return 6; }
60 }
61 
62 //------------
63 
64 namespace H
65 {
66   class O{};
foo(O)67   int foo (O){ return 7;}
68 }
69 
70 namespace I
71 {
72   class O: public H::O {};
73   class X: H::O{};
74 }
75 
76 //------------
77 
78 namespace J
79 {
80   union U{};
81   struct S{};
82   enum E{};
83 
84   class A{
85   public:
86     class B{};
87   };
88 
89   class C{};
90 
foo(U)91   int foo (U){ return 8;}
foo(S)92   int foo (S){ return 9;}
foo(E)93   int foo (E){ return 10;}
foo(A::B)94   int foo (A::B){ return 11;}
foo(A *)95   int foo (A*){ return 12;}
foo(A **)96   int foo (A**){ return 13;}
foo(C[])97   int foo (C[]){ return 14;}
98 
99 }
100 //------------
101 
102 namespace K{
103   class O{};
104 
foo(O,int)105   int foo(O, int){
106     return 15;
107   }
108 
bar(O,int)109   int bar(O, int){
110     return 15;
111   }
112 }
113 
foo(K::O,float)114 int foo(K::O, float){
115   return 16;
116 }
117 
bar(K::O,int)118 int bar(K::O, int){
119   return 16;
120 }
121 //------------
122 
123 namespace L {
124   namespace A{
125     namespace B{
126     class O {};
127 
foo(O)128     int foo (O){
129       return 17;
130     }
131 
132     }
133   }
134 }
135 
136 //------------
137 
138 namespace M {
139   class A{
140   public:
foo(char)141     int foo(char) {
142       return 18;
143     }
144   };
145 
foo(A,char)146   int foo(A,char){
147       return 19;
148   }
149 
foo(A *,char)150   int foo(A *,char){
151     return 23;
152   }
153 
bar(char)154   int bar(char){
155     return 21;
156   }
157 
158   namespace N {
foo(::M::A,int)159     int foo(::M::A,int){
160       return 20;
161     }
162 
bar(int)163     int bar(int){
164       return 22;
165     }
166   }
167 }
168 //------------
169 
170 namespace O {
171   class A{};
172 
foo(A,int)173   int foo(A,int){
174     return 23;
175   }
176 
177 }
178 
179 typedef O::A TOA;
180 typedef TOA  TTOA;
181 
182 //------------
183 
184 static union {
185     int  a;
186     char b;
187 }p_union;
188 
189 //------------
190 
191 namespace P {
192   class Q{
193   public:
operator ==(int)194     int operator== (int)
195       {
196         return 24;
197       }
198 
operator ==(float)199     int operator== (float)
200       {
201         return 25;
202       }
203 
operator +(float)204     int operator+ (float)
205       {
206         return 26;
207       }
208 
209   };
210 
operator !=(Q,int)211   int operator!= (Q, int)
212     {
213       return 27;
214     }
215 
operator !=(Q,double)216   int operator!= (Q, double)
217     {
218       return 28;
219     }
220 
operator +(Q,int)221   int operator+ (Q, int)
222     {
223       return 29;
224     }
225 
operator ++(Q)226   int operator++ (Q)
227     {
228       return 30;
229     }
230 }
231 
232 //------------
233 
234 class R {
235   public:
rfoo()236     int rfoo(){ return 31; }
rbar()237     int rbar(){
238       return 1; // marker1
239     }
240 };
241 
242 //------------
243 
244 int
main()245 main ()
246 {
247   A::C c;
248   B b;
249 
250   A::first (c);
251   first (0, c);
252   second (0, 0, c, 0, 0);
253   entry (c);
254   A::first (b.c);
255 
256   E::O eo;
257   F::O fo;
258   G::O go;
259 
260   foo (eo);
261   foo (eo, eo);
262   foo (eo, eo, 1);
263   foo (fo, eo);
264   foo (1  ,fo, eo);
265   foo (go, fo, eo);
266 
267   I::O io;
268   I::X ix;
269 
270   foo (io);
271 //foo (ix);
272 
273   J::U ju;
274   J::S js;
275   J::E je;
276   J::A::B jab;
277   J::A *jap;
278   J::A **japp;
279   J::C jca[3];
280 
281   foo (ju);
282   foo (js);
283   foo (je);
284   foo (jab);
285   foo (jap);
286   foo (japp);
287   foo (jca);
288 
289   K::O ko;
290   foo (ko, 1);
291   foo (ko, 1.0f);
292   //bar(ko,1);
293 
294   L::A::B::O labo;
295   foo (labo);
296 
297   M::A ma;
298   foo(ma,'a');
299   ma.foo('a');
300   M::N::foo(ma,'a');
301 
302   M::bar('a');
303   M::N::bar('a');
304 
305   TTOA ttoa;
306   foo (ttoa, 'a');
307 
308   p_union = {0};
309 
310   P::Q q;
311   q == 5;
312   q == 5.0f;
313   q != 5;
314   q != 5.0f;
315   q + 5;
316   q + 5.0f;
317 
318   ++q;
319 
320   R r;
321   r.rbar();
322   r.rfoo();
323 
324   return first (0, c) + foo (eo) +
325          foo (eo, eo) + foo (eo, eo, 1)  +
326          foo (fo, eo) + foo (1  ,fo, eo) +
327          foo (go, fo, eo);
328 }
329