xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.cp/cplusfuncs.cc (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis #include <stddef.h>
2*b725ae77Skettenis 
3*b725ae77Skettenis class foo {
4*b725ae77Skettenis public:
5*b725ae77Skettenis   foo  (int);
6*b725ae77Skettenis   foo  (int, const char *);
7*b725ae77Skettenis   foo  (foo&);
8*b725ae77Skettenis   ~foo ();
9*b725ae77Skettenis 
10*b725ae77Skettenis   void  operator *      (foo&);
11*b725ae77Skettenis   void  operator %      (foo&);
12*b725ae77Skettenis   void  operator -      (foo&);
13*b725ae77Skettenis   void  operator >>     (foo&);
14*b725ae77Skettenis   void  operator !=     (foo&);
15*b725ae77Skettenis   void  operator >      (foo&);
16*b725ae77Skettenis   void  operator >=     (foo&);
17*b725ae77Skettenis   void  operator |      (foo&);
18*b725ae77Skettenis   void  operator &&     (foo&);
19*b725ae77Skettenis   void  operator !      (void);
20*b725ae77Skettenis   void  operator ++     (int);
21*b725ae77Skettenis   void  operator =      (foo&);
22*b725ae77Skettenis   void  operator +=     (foo&);
23*b725ae77Skettenis   void  operator *=     (foo&);
24*b725ae77Skettenis   void  operator %=     (foo&);
25*b725ae77Skettenis   void  operator >>=    (foo&);
26*b725ae77Skettenis   void  operator |=     (foo&);
27*b725ae77Skettenis   void  operator ,      (foo&);
28*b725ae77Skettenis   void  operator /      (foo&);
29*b725ae77Skettenis   void  operator +      (foo&);
30*b725ae77Skettenis   void  operator <<     (foo&);
31*b725ae77Skettenis   void  operator ==     (foo&);
32*b725ae77Skettenis   void  operator <      (foo&);
33*b725ae77Skettenis   void  operator <=     (foo&);
34*b725ae77Skettenis   void  operator &      (foo&);
35*b725ae77Skettenis   void  operator ^      (foo&);
36*b725ae77Skettenis   void  operator ||     (foo&);
37*b725ae77Skettenis   void  operator ~      (void);
38*b725ae77Skettenis   void  operator --     (int);
39*b725ae77Skettenis   foo*  operator ->     (void);
40*b725ae77Skettenis   void  operator -=     (foo&);
41*b725ae77Skettenis   void  operator /=     (foo&);
42*b725ae77Skettenis   void  operator <<=    (foo&);
43*b725ae77Skettenis   void  operator &=     (foo&);
44*b725ae77Skettenis   void  operator ^=     (foo&);
45*b725ae77Skettenis   void  operator ->*    (foo&);
46*b725ae77Skettenis   void  operator []     (foo&);
47*b725ae77Skettenis   void  operator ()     (foo&);
48*b725ae77Skettenis   void* operator new    (size_t) throw ();
49*b725ae77Skettenis   void  operator delete (void *);
50*b725ae77Skettenis   /**/  operator int    ();
51*b725ae77Skettenis   /**/  operator char*  ();
52*b725ae77Skettenis 
53*b725ae77Skettenis   int foofunc (int); // forced to have int return type, which is required
54*b725ae77Skettenis   int foofunc (int, signed char *); // forced to have int return type, which is required
55*b725ae77Skettenis   int ifoo;
56*b725ae77Skettenis   const char *ccpfoo;
57*b725ae77Skettenis };
58*b725ae77Skettenis 
59*b725ae77Skettenis #ifdef usestubs
60*b725ae77Skettenis extern "C" {
61*b725ae77Skettenis    void set_debug_traps();
62*b725ae77Skettenis    void breakpoint();
63*b725ae77Skettenis };
64*b725ae77Skettenis #endif
65*b725ae77Skettenis 
main()66*b725ae77Skettenis int main () {
67*b725ae77Skettenis #ifdef usestubs
68*b725ae77Skettenis    set_debug_traps();
69*b725ae77Skettenis    breakpoint();
70*b725ae77Skettenis #endif
71*b725ae77Skettenis    int z=3;
72*b725ae77Skettenis }
73*b725ae77Skettenis 
foo(int i)74*b725ae77Skettenis foo::foo  (int i)                  { ifoo = i;}
foo(int i,const char * ccp)75*b725ae77Skettenis foo::foo  (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; }
foo(foo & afoo)76*b725ae77Skettenis foo::foo  (foo& afoo)              { afoo.ifoo = 0; }
~foo()77*b725ae77Skettenis foo::~foo ()                       {}
78*b725ae77Skettenis 
operator *(foo & afoo)79*b725ae77Skettenis void  foo::operator *      (foo& afoo) { afoo.ifoo = 0; }
operator %(foo & afoo)80*b725ae77Skettenis void  foo::operator %      (foo& afoo) { afoo.ifoo = 0; }
operator -(foo & afoo)81*b725ae77Skettenis void  foo::operator -      (foo& afoo) { afoo.ifoo = 0; }
operator >>(foo & afoo)82*b725ae77Skettenis void  foo::operator >>     (foo& afoo) { afoo.ifoo = 0; }
operator !=(foo & afoo)83*b725ae77Skettenis void  foo::operator !=     (foo& afoo) { afoo.ifoo = 0; }
operator >(foo & afoo)84*b725ae77Skettenis void  foo::operator >      (foo& afoo) { afoo.ifoo = 0; }
operator >=(foo & afoo)85*b725ae77Skettenis void  foo::operator >=     (foo& afoo) { afoo.ifoo = 0; }
operator |(foo & afoo)86*b725ae77Skettenis void  foo::operator |      (foo& afoo) { afoo.ifoo = 0; }
operator &&(foo & afoo)87*b725ae77Skettenis void  foo::operator &&     (foo& afoo) { afoo.ifoo = 0; }
operator !(void)88*b725ae77Skettenis void  foo::operator !      (void) {}
operator ++(int ival)89*b725ae77Skettenis void  foo::operator ++     (int ival) { ival = 0; }
operator =(foo & afoo)90*b725ae77Skettenis void  foo::operator =      (foo& afoo) { afoo.ifoo = 0; }
operator +=(foo & afoo)91*b725ae77Skettenis void  foo::operator +=     (foo& afoo) { afoo.ifoo = 0; }
operator *=(foo & afoo)92*b725ae77Skettenis void  foo::operator *=     (foo& afoo) { afoo.ifoo = 0; }
operator %=(foo & afoo)93*b725ae77Skettenis void  foo::operator %=     (foo& afoo) { afoo.ifoo = 0; }
operator >>=(foo & afoo)94*b725ae77Skettenis void  foo::operator >>=    (foo& afoo) { afoo.ifoo = 0; }
operator |=(foo & afoo)95*b725ae77Skettenis void  foo::operator |=     (foo& afoo) { afoo.ifoo = 0; }
operator ,(foo & afoo)96*b725ae77Skettenis void  foo::operator ,      (foo& afoo) { afoo.ifoo = 0; }
operator /(foo & afoo)97*b725ae77Skettenis void  foo::operator /      (foo& afoo) { afoo.ifoo = 0; }
operator +(foo & afoo)98*b725ae77Skettenis void  foo::operator +      (foo& afoo) { afoo.ifoo = 0; }
operator <<(foo & afoo)99*b725ae77Skettenis void  foo::operator <<     (foo& afoo) { afoo.ifoo = 0; }
operator ==(foo & afoo)100*b725ae77Skettenis void  foo::operator ==     (foo& afoo) { afoo.ifoo = 0; }
operator <(foo & afoo)101*b725ae77Skettenis void  foo::operator <      (foo& afoo) { afoo.ifoo = 0; }
operator <=(foo & afoo)102*b725ae77Skettenis void  foo::operator <=     (foo& afoo) { afoo.ifoo = 0; }
operator &(foo & afoo)103*b725ae77Skettenis void  foo::operator &      (foo& afoo) { afoo.ifoo = 0; }
operator ^(foo & afoo)104*b725ae77Skettenis void  foo::operator ^      (foo& afoo) { afoo.ifoo = 0; }
operator ||(foo & afoo)105*b725ae77Skettenis void  foo::operator ||     (foo& afoo) { afoo.ifoo = 0; }
operator ~(void)106*b725ae77Skettenis void  foo::operator ~      (void) {}
operator --(int ival)107*b725ae77Skettenis void  foo::operator --     (int ival) { ival = 0; }
operator ->(void)108*b725ae77Skettenis foo*  foo::operator ->     (void) {return this;}
operator -=(foo & afoo)109*b725ae77Skettenis void  foo::operator -=     (foo& afoo) { afoo.ifoo = 0; }
operator /=(foo & afoo)110*b725ae77Skettenis void  foo::operator /=     (foo& afoo) { afoo.ifoo = 0; }
operator <<=(foo & afoo)111*b725ae77Skettenis void  foo::operator <<=    (foo& afoo) { afoo.ifoo = 0; }
operator &=(foo & afoo)112*b725ae77Skettenis void  foo::operator &=     (foo& afoo) { afoo.ifoo = 0; }
operator ^=(foo & afoo)113*b725ae77Skettenis void  foo::operator ^=     (foo& afoo) { afoo.ifoo = 0; }
operator ->*(foo & afoo)114*b725ae77Skettenis void  foo::operator ->*    (foo& afoo) { afoo.ifoo = 0; }
operator [](foo & afoo)115*b725ae77Skettenis void  foo::operator []     (foo& afoo) { afoo.ifoo = 0; }
operator ()(foo & afoo)116*b725ae77Skettenis void  foo::operator ()     (foo& afoo) { afoo.ifoo = 0; }
operator new(size_t ival)117*b725ae77Skettenis void* foo::operator new    (size_t ival) throw () { ival = 0; return 0; }
operator delete(void * ptr)118*b725ae77Skettenis void  foo::operator delete (void *ptr) { ptr = 0; }
operator int()119*b725ae77Skettenis /**/  foo::operator int    () { return 0; }
operator char*()120*b725ae77Skettenis /**/  foo::operator char*  () { return 0; }
121*b725ae77Skettenis 
122*b725ae77Skettenis /* Some functions to test overloading by varying one argument type. */
123*b725ae77Skettenis 
overload1arg(void)124*b725ae77Skettenis void overload1arg (void)		{          }
overload1arg(char arg)125*b725ae77Skettenis void overload1arg (char arg)		{ arg = 0; }
overload1arg(signed char arg)126*b725ae77Skettenis void overload1arg (signed char arg)	{ arg = 0; }
overload1arg(unsigned char arg)127*b725ae77Skettenis void overload1arg (unsigned char arg)	{ arg = 0; }
overload1arg(short arg)128*b725ae77Skettenis void overload1arg (short arg)		{ arg = 0; }
overload1arg(unsigned short arg)129*b725ae77Skettenis void overload1arg (unsigned short arg)	{ arg = 0; }
overload1arg(int arg)130*b725ae77Skettenis void overload1arg (int arg)		{ arg = 0; }
overload1arg(unsigned int arg)131*b725ae77Skettenis void overload1arg (unsigned int arg)	{ arg = 0; }
overload1arg(long arg)132*b725ae77Skettenis void overload1arg (long arg)		{ arg = 0; }
overload1arg(unsigned long arg)133*b725ae77Skettenis void overload1arg (unsigned long arg)	{ arg = 0; }
overload1arg(float arg)134*b725ae77Skettenis void overload1arg (float arg)		{ arg = 0; }
overload1arg(double arg)135*b725ae77Skettenis void overload1arg (double arg)		{ arg = 0; }
136*b725ae77Skettenis 
137*b725ae77Skettenis /* Some functions to test overloading by varying argument count. */
138*b725ae77Skettenis 
overloadargs(int a1)139*b725ae77Skettenis void overloadargs (int a1)				{ a1 = 0; }
overloadargs(int a1,int a2)140*b725ae77Skettenis void overloadargs (int a1, int a2)			{ a1 = a2 = 0; }
overloadargs(int a1,int a2,int a3)141*b725ae77Skettenis void overloadargs (int a1, int a2, int a3)		{ a1 = a2 = a3 = 0; }
overloadargs(int a1,int a2,int a3,int a4)142*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4)
143*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5)144*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5)
145*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6)146*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6)
147*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6,int a7)148*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7)
149*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8)150*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
151*b725ae77Skettenis 		   int a8)
152*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9)153*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
154*b725ae77Skettenis 		   int a8, int a9)
155*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)156*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
157*b725ae77Skettenis 		   int a8, int a9, int a10)
158*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 =
159*b725ae77Skettenis 			  a10 = 0; }
overloadargs(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11)160*b725ae77Skettenis void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
161*b725ae77Skettenis 		   int a8, int a9, int a10, int a11)
162*b725ae77Skettenis 			{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 =
163*b725ae77Skettenis 			  a10 = a11 == 0; }
164*b725ae77Skettenis 
165*b725ae77Skettenis /* Some hairy function definitions.
166*b725ae77Skettenis    Use typedefs to help maintain sanity. */
167*b725ae77Skettenis 
168*b725ae77Skettenis typedef int   (*PFPc_i)(char *);
169*b725ae77Skettenis typedef short (*PFPl_s)(long *);
170*b725ae77Skettenis typedef short (*PFPc_s)(char *);
171*b725ae77Skettenis typedef int   (*PFl_i)(long);
172*b725ae77Skettenis typedef PFl_i (*PFPc_PFl_i)(char *);
173*b725ae77Skettenis typedef PFl_i (*PFPi_PFl_i)(int *);
174*b725ae77Skettenis typedef PFl_i (*PFPFPc_i_PFl_i)(PFPc_i);
175*b725ae77Skettenis typedef PFl_i (*PFs_PFl_i)(short);
176*b725ae77Skettenis typedef int   (*PFPFPl_s_i)(PFPl_s);
177*b725ae77Skettenis typedef int   (*PFPFPc_s_i)(PFPc_s);
178*b725ae77Skettenis 
hairyfunc1(int arg)179*b725ae77Skettenis PFs_PFl_i hairyfunc1 (int arg)			{ arg = 0; return 0; }
hairyfunc2(PFPc_i arg)180*b725ae77Skettenis int       hairyfunc2 (PFPc_i arg)		{ arg = 0; return 0; }
hairyfunc3(PFPFPl_s_i arg)181*b725ae77Skettenis int	  hairyfunc3 (PFPFPl_s_i arg)		{ arg = 0; return 0; }
hairyfunc4(PFPFPc_s_i arg)182*b725ae77Skettenis int	  hairyfunc4 (PFPFPc_s_i arg)		{ arg = 0; return 0; }
hairyfunc5(PFPc_PFl_i arg)183*b725ae77Skettenis int	  hairyfunc5 (PFPc_PFl_i arg)		{ arg = 0; return 0; }
hairyfunc6(PFPi_PFl_i arg)184*b725ae77Skettenis int	  hairyfunc6 (PFPi_PFl_i arg)		{ arg = 0; return 0; }
hairyfunc7(PFPFPc_i_PFl_i arg)185*b725ae77Skettenis int	  hairyfunc7 (PFPFPc_i_PFl_i arg)	{ arg = 0; return 0; }
186*b725ae77Skettenis 
187*b725ae77Skettenis /* gdb has two demanglers (one for g++ 2.95, one for g++ 3).
188*b725ae77Skettenis    These marker functions help me figure out which demangler is in use. */
189*b725ae77Skettenis 
dm_type_char_star(char * p)190*b725ae77Skettenis char *	dm_type_char_star (char * p)		{ return p; }
dm_type_foo_ref(foo & foo)191*b725ae77Skettenis int	dm_type_foo_ref (foo & foo)		{ return foo.ifoo; }
dm_type_int_star(int * p)192*b725ae77Skettenis int *	dm_type_int_star (int * p)		{ return p; }
dm_type_long_star(long * p)193*b725ae77Skettenis long *	dm_type_long_star (long * p)		{ return p; }
dm_type_unsigned_int(unsigned int i)194*b725ae77Skettenis int	dm_type_unsigned_int (unsigned int i)	{ return i; }
dm_type_void(void)195*b725ae77Skettenis int	dm_type_void (void)			{ return 0; }
dm_type_void_star(void * p)196*b725ae77Skettenis void *	dm_type_void_star (void * p)		{ return p; }
197