166e63ce3Schristos /* This test code is from Wendell Baker (wbaker@comet.berkeley.edu) */
266e63ce3Schristos 
366e63ce3Schristos #include <stddef.h>
466e63ce3Schristos 
566e63ce3Schristos int a_i;
666e63ce3Schristos char a_c;
766e63ce3Schristos double a_d;
866e63ce3Schristos 
966e63ce3Schristos typedef void *Pix;
1066e63ce3Schristos 
1166e63ce3Schristos int
f(int i)1266e63ce3Schristos f(int i)
1366e63ce3Schristos { return 0; }
1466e63ce3Schristos 
1566e63ce3Schristos int
f(int i,char c)1666e63ce3Schristos f(int i, char c)
1766e63ce3Schristos { return 0; }
1866e63ce3Schristos 
1966e63ce3Schristos int
f(int i,char c,double d)2066e63ce3Schristos f(int i, char c, double d)
2166e63ce3Schristos { return 0; }
2266e63ce3Schristos 
2366e63ce3Schristos int
f(int i,char c,double d,char * cs)2466e63ce3Schristos f(int i, char c, double d, char *cs)
2566e63ce3Schristos { return 0; }
2666e63ce3Schristos 
2766e63ce3Schristos int
f(int i,char c,double d,char * cs,void (* fig)(int,char))2866e63ce3Schristos f(int i, char c, double d, char *cs, void (*fig)(int, char))
2966e63ce3Schristos { return 0; }
3066e63ce3Schristos 
3166e63ce3Schristos int
f(int i,char c,double d,char * cs,void (* fig)(char,int))3266e63ce3Schristos f(int i, char c, double d, char *cs, void (*fig)(char, int))
3366e63ce3Schristos { return 0; }
3466e63ce3Schristos 
3566e63ce3Schristos class R {
3666e63ce3Schristos public:
3766e63ce3Schristos     int i;
3866e63ce3Schristos };
3966e63ce3Schristos class S {
4066e63ce3Schristos public:
4166e63ce3Schristos     int i;
4266e63ce3Schristos };
4366e63ce3Schristos class T {
4466e63ce3Schristos public:
4566e63ce3Schristos     int i;
4666e63ce3Schristos };
4766e63ce3Schristos 
g(char,const char,volatile char)4866e63ce3Schristos char g(char, const char, volatile char)
4966e63ce3Schristos { return 'c'; }
g(R,char &,const char &,volatile char &)5066e63ce3Schristos char g(R, char&, const char&, volatile char&)
5166e63ce3Schristos { return 'c'; }
g(char *,const char *,volatile char *)5266e63ce3Schristos char g(char*, const char*, volatile char*)
5366e63ce3Schristos { return 'c'; }
g(S,char * &,const char * &,volatile char * &)5466e63ce3Schristos char g(S, char*&, const char*&, volatile char*&)
5566e63ce3Schristos { return 'c'; }
5666e63ce3Schristos 
g(T,signed char,const signed char,volatile signed char)5766e63ce3Schristos signed char g(T,signed char, const signed char, volatile signed char)
5866e63ce3Schristos { return 'c'; }
g(T,R,signed char &,const signed char &,volatile signed char &)5966e63ce3Schristos signed char g(T, R, signed char&, const signed char&, volatile signed char&)
6066e63ce3Schristos { return 'c'; }
g(T,signed char *,const signed char *,volatile signed char *)6166e63ce3Schristos signed char g(T, signed char*, const signed char*, volatile signed char*)
6266e63ce3Schristos { return 'c'; }
g(T,S,signed char * &,const signed char * &,volatile signed char * &)6366e63ce3Schristos signed char g(T, S, signed char*&, const signed char*&, volatile signed char*&)
6466e63ce3Schristos { return 'c'; }
6566e63ce3Schristos 
g(unsigned char,const unsigned char,volatile unsigned char)6666e63ce3Schristos unsigned char g(unsigned char, const unsigned char, volatile unsigned char)
6766e63ce3Schristos { return 'c'; }
g(R,unsigned char &,const unsigned char &,volatile unsigned char &)6866e63ce3Schristos unsigned char g(R, unsigned char&, const unsigned char&, volatile unsigned char&)
6966e63ce3Schristos { return 'c'; }
g(unsigned char *,const unsigned char *,volatile unsigned char *)7066e63ce3Schristos unsigned char g(unsigned char*, const unsigned char*, volatile unsigned char*)
7166e63ce3Schristos { return 'c'; }
g(S,unsigned char * &,const unsigned char * &,volatile unsigned char * &)7266e63ce3Schristos unsigned char g(S, unsigned char*&, const unsigned char*&, volatile unsigned char*&)
7366e63ce3Schristos { return 'c'; }
7466e63ce3Schristos 
g(short,const short,volatile short)7566e63ce3Schristos short g(short, const short, volatile short)
7666e63ce3Schristos { return 0; }
g(R,short &,const short &,volatile short &)7766e63ce3Schristos short g(R, short&, const short&, volatile short&)
7866e63ce3Schristos { return 0; }
g(short *,const short *,volatile short *)7966e63ce3Schristos short g(short*, const short*, volatile short*)
8066e63ce3Schristos { return 0; }
g(S,short * &,const short * &,volatile short * &)8166e63ce3Schristos short g(S, short*&, const short*&, volatile short*&)
8266e63ce3Schristos { return 0; }
8366e63ce3Schristos 
g(T,signed short,const signed short,volatile signed short)8466e63ce3Schristos signed short g(T, signed short, const signed short, volatile signed short)
8566e63ce3Schristos { return 0; }
g(T,R,signed short &,const signed short &,volatile signed short &)8666e63ce3Schristos signed short g(T, R, signed short&, const signed short&, volatile signed short&)
8766e63ce3Schristos { return 0; }
g(T,signed short *,const signed short *,volatile signed short *)8866e63ce3Schristos signed short g(T, signed short*, const signed short*, volatile signed short*)
8966e63ce3Schristos { return 0; }
g(T,S,double,signed short * &,const signed short * &,volatile signed short * &)9066e63ce3Schristos signed short g(T, S, double, signed short*&, const signed short*&, volatile signed short*&)
9166e63ce3Schristos { return 0; }
9266e63ce3Schristos 
g(unsigned short,const unsigned short,volatile unsigned short)9366e63ce3Schristos unsigned short g(unsigned short, const unsigned short, volatile unsigned short)
9466e63ce3Schristos { return 0; }
g(R,unsigned short &,const unsigned short &,volatile unsigned short &)9566e63ce3Schristos unsigned short g(R, unsigned short&, const unsigned short&, volatile unsigned short&)
9666e63ce3Schristos { return 0; }
g(unsigned short *,const unsigned short *,volatile unsigned short *)9766e63ce3Schristos unsigned short g(unsigned short*, const unsigned short*, volatile unsigned short*)
9866e63ce3Schristos { return 0; }
g(S,unsigned short * &,const unsigned short * &,volatile unsigned short * &)9966e63ce3Schristos unsigned short g(S, unsigned short*&, const unsigned short*&, volatile unsigned short*&)
10066e63ce3Schristos { return 0; }
10166e63ce3Schristos 
g(int,const int,volatile int)10266e63ce3Schristos int g(int, const int, volatile int)
10366e63ce3Schristos { return 0; }
g(R,int &,const int &,volatile int &)10466e63ce3Schristos int g(R, int&, const int&, volatile int&)
10566e63ce3Schristos { return 0; }
g(int *,const int *,volatile int *)10666e63ce3Schristos int g(int*, const int*, volatile int*)
10766e63ce3Schristos { return 0; }
g(S,int * &,const int * &,volatile int * &)10866e63ce3Schristos int g(S, int*&, const int*&, volatile int*&)
10966e63ce3Schristos { return 0; }
11066e63ce3Schristos 
g(T,signed int,const signed int,volatile signed int)11166e63ce3Schristos signed int g(T, signed int, const signed int, volatile signed int)
11266e63ce3Schristos { return 0; }
g(T,R,signed int &,const signed int &,volatile signed int &)11366e63ce3Schristos signed int g(T, R, signed int&, const signed int&, volatile signed int&)
11466e63ce3Schristos { return 0; }
g(T,signed int *,const signed int *,volatile signed int *)11566e63ce3Schristos signed int g(T, signed int*, const signed int*, volatile signed int*)
11666e63ce3Schristos { return 0; }
g(T,S,signed int * &,const signed int * &,volatile signed int * &)11766e63ce3Schristos signed int g(T, S, signed int*&, const signed int*&, volatile signed int*&)
11866e63ce3Schristos { return 0; }
11966e63ce3Schristos 
g(unsigned int,const unsigned int,volatile unsigned int)12066e63ce3Schristos unsigned int g(unsigned int, const unsigned int, volatile unsigned int)
12166e63ce3Schristos { return 0; }
g(R,unsigned int &,const unsigned int &,volatile unsigned int &)12266e63ce3Schristos unsigned int g(R, unsigned int&, const unsigned int&, volatile unsigned int&)
12366e63ce3Schristos { return 0; }
g(unsigned int *,const unsigned int *,volatile unsigned int *)12466e63ce3Schristos unsigned int g(unsigned int*, const unsigned int*, volatile unsigned int*)
12566e63ce3Schristos { return 0; }
g(S,unsigned int * &,const unsigned int * &,volatile unsigned int * &)12666e63ce3Schristos unsigned int g(S, unsigned int*&, const unsigned int*&, volatile unsigned int*&)
12766e63ce3Schristos { return 0; }
12866e63ce3Schristos 
g(long,const long,volatile long)12966e63ce3Schristos long g(long, const long, volatile long)
13066e63ce3Schristos { return 0; }
g(R,long &,const long &,volatile long &)13166e63ce3Schristos long g(R, long&, const long&, volatile long&)
13266e63ce3Schristos { return 0; }
g(long *,const long *,volatile long *)13366e63ce3Schristos long g(long*, const long*, volatile long*)
13466e63ce3Schristos { return 0; }
g(S,long * &,const long * &,volatile long * &)13566e63ce3Schristos long g(S, long*&, const long*&, volatile long*&)
13666e63ce3Schristos { return 0; }
13766e63ce3Schristos 
g(T,signed long,const signed long,volatile signed long)13866e63ce3Schristos signed long g(T, signed long, const signed long, volatile signed long)
13966e63ce3Schristos { return 0; }
g(T,R,signed long &,const signed long &,volatile signed long &)14066e63ce3Schristos signed long g(T, R, signed long&, const signed long&, volatile signed long&)
14166e63ce3Schristos { return 0; }
g(T,signed long *,const signed long *,volatile signed long *)14266e63ce3Schristos signed long g(T, signed long*, const signed long*, volatile signed long*)
14366e63ce3Schristos { return 0; }
g(T,S,signed long * &,const signed long * &,volatile signed long * &)14466e63ce3Schristos signed long g(T, S, signed long*&, const signed long*&, volatile signed long*&)
14566e63ce3Schristos { return 0; }
14666e63ce3Schristos 
g(unsigned long,const unsigned long,volatile unsigned long)14766e63ce3Schristos unsigned long g(unsigned long, const unsigned long, volatile unsigned long)
14866e63ce3Schristos { return 0; }
g(S,unsigned long &,const unsigned long &,volatile unsigned long &)14966e63ce3Schristos unsigned long g(S, unsigned long&, const unsigned long&, volatile unsigned long&)
15066e63ce3Schristos { return 0; }
g(unsigned long *,const unsigned long *,volatile unsigned long *)15166e63ce3Schristos unsigned long g(unsigned long*, const unsigned long*, volatile unsigned long*)
15266e63ce3Schristos { return 0; }
g(S,unsigned long * &,const unsigned long * &,volatile unsigned long * &)15366e63ce3Schristos unsigned long g(S, unsigned long*&, const unsigned long*&, volatile unsigned long*&)
15466e63ce3Schristos { return 0; }
15566e63ce3Schristos 
15666e63ce3Schristos #ifdef __GNUC__
g(long long,const long long,volatile long long)15766e63ce3Schristos long long g(long long, const long long, volatile long long)
15866e63ce3Schristos { return 0; }
g(S,long long &,const long long &,volatile long long &)15966e63ce3Schristos long long g(S, long long&, const long long&, volatile long long&)
16066e63ce3Schristos { return 0; }
g(long long *,const long long *,volatile long long *)16166e63ce3Schristos long long g(long long*, const long long*, volatile long long*)
16266e63ce3Schristos { return 0; }
g(R,long long * &,const long long * &,volatile long long * &)16366e63ce3Schristos long long g(R, long long*&, const long long*&, volatile long long*&)
16466e63ce3Schristos { return 0; }
16566e63ce3Schristos 
g(T,signed long long,const signed long long,volatile signed long long)16666e63ce3Schristos signed long long g(T, signed long long, const signed long long, volatile signed long long)
16766e63ce3Schristos { return 0; }
g(T,R,signed long long &,const signed long long &,volatile signed long long &)16866e63ce3Schristos signed long long g(T, R, signed long long&, const signed long long&, volatile signed long long&)
16966e63ce3Schristos { return 0; }
g(T,signed long long *,const signed long long *,volatile signed long long *)17066e63ce3Schristos signed long long g(T, signed long long*, const signed long long*, volatile signed long long*)
17166e63ce3Schristos { return 0; }
g(T,S,signed long long * &,const signed long long * &,volatile signed long long * &)17266e63ce3Schristos signed long long g(T, S, signed long long*&, const signed long long*&, volatile signed long long*&)
17366e63ce3Schristos { return 0; }
17466e63ce3Schristos 
g(unsigned long long,const unsigned long long,volatile unsigned long long)17566e63ce3Schristos unsigned long long g(unsigned long long, const unsigned long long, volatile unsigned long long)
17666e63ce3Schristos { return 0; }
g(R,unsigned long long *,const unsigned long long *,volatile unsigned long long *)17766e63ce3Schristos unsigned long long g(R, unsigned long long*, const unsigned long long*, volatile unsigned long long*)
17866e63ce3Schristos { return 0; }
g(unsigned long long &,const unsigned long long &,volatile unsigned long long &)17966e63ce3Schristos unsigned long long g(unsigned long long&, const unsigned long long&, volatile unsigned long long&)
18066e63ce3Schristos { return 0; }
g(S,unsigned long long * &,const unsigned long long * &,volatile unsigned long long * &)18166e63ce3Schristos unsigned long long g(S, unsigned long long*&, const unsigned long long*&, volatile unsigned long long*&)
18266e63ce3Schristos { return 0; }
18366e63ce3Schristos #endif
18466e63ce3Schristos 
g(float,const float,volatile float)18566e63ce3Schristos float g(float, const float, volatile float)
18666e63ce3Schristos { return 0; }
g(char,float &,const float &,volatile float &)18766e63ce3Schristos float g(char, float&, const float&, volatile float&)
18866e63ce3Schristos { return 0; }
g(float *,const float *,volatile float *)18966e63ce3Schristos float g(float*, const float*, volatile float*)
19066e63ce3Schristos { return 0; }
g(char,float * &,const float * &,volatile float * &)19166e63ce3Schristos float g(char, float*&, const float*&, volatile float*&)
19266e63ce3Schristos { return 0; }
19366e63ce3Schristos 
g(double,const double,volatile double)19466e63ce3Schristos double g(double, const double, volatile double)
19566e63ce3Schristos { return 0; }
g(char,double &,const double &,volatile double &)19666e63ce3Schristos double g(char, double&, const double&, volatile double&)
19766e63ce3Schristos { return 0; }
g(double *,const double *,volatile double *)19866e63ce3Schristos double g(double*, const double*, volatile double*)
19966e63ce3Schristos { return 0; }
g(char,double * &,const double * &,volatile double * &)20066e63ce3Schristos double g(char, double*&, const double*&, volatile double*&)
20166e63ce3Schristos { return 0; }
20266e63ce3Schristos 
20366e63ce3Schristos #ifdef __GNUC__
g(long double,const long double,volatile long double)20466e63ce3Schristos long double g(long double, const long double, volatile long double)
20566e63ce3Schristos { return 0; }
g(char,long double &,const long double &,volatile long double &)20666e63ce3Schristos long double g(char, long double&, const long double&, volatile long double&)
20766e63ce3Schristos { return 0; }
g(long double *,const long double *,volatile long double *)20866e63ce3Schristos long double g(long double*, const long double*, volatile long double*)
20966e63ce3Schristos { return 0; }
g(char,long double * &,const long double * &,volatile long double * &)21066e63ce3Schristos long double g(char, long double*&, const long double*&, volatile long double*&)
21166e63ce3Schristos { return 0; }
21266e63ce3Schristos #endif
21366e63ce3Schristos 
21466e63ce3Schristos class c {
21566e63ce3Schristos public:
c(int)21666e63ce3Schristos     c(int) {};
21766e63ce3Schristos     int i;
21866e63ce3Schristos };
21966e63ce3Schristos 
g(c,const c,volatile c)22066e63ce3Schristos class c g(c, const c, volatile c)
22166e63ce3Schristos { return 0; }
g(char,c &,const c &,volatile c &)22266e63ce3Schristos c g(char, c&, const c&, volatile c&)
22366e63ce3Schristos { return 0; }
g(c *,const c *,volatile c *)22466e63ce3Schristos c g(c*, const c*, volatile c*)
22566e63ce3Schristos { return 0; }
g(char,c * &,const c * &,volatile c * &)22666e63ce3Schristos c g(char, c*&, const c*&, volatile c*&)
22766e63ce3Schristos { return 0; }
22866e63ce3Schristos 
22966e63ce3Schristos /*
23066e63ce3Schristos void h(char = 'a')
23166e63ce3Schristos { }
23266e63ce3Schristos void h(char, signed char = 'a')
23366e63ce3Schristos { }
23466e63ce3Schristos void h(unsigned char = 'a')
23566e63ce3Schristos { }
23666e63ce3Schristos */
23766e63ce3Schristos /*
23866e63ce3Schristos void h(char = (char)'a')
23966e63ce3Schristos { }
24066e63ce3Schristos void h(char, signed char = (signed char)'a')
24166e63ce3Schristos { }
24266e63ce3Schristos void h(unsigned char = (unsigned char)'a')
24366e63ce3Schristos { }
24466e63ce3Schristos 
24566e63ce3Schristos 
24666e63ce3Schristos void h(short = (short)43)
24766e63ce3Schristos { }
24866e63ce3Schristos void h(char, signed short = (signed short)43)
24966e63ce3Schristos { }
25066e63ce3Schristos void h(unsigned short = (unsigned short)43)
25166e63ce3Schristos { }
25266e63ce3Schristos 
25366e63ce3Schristos void h(int = (int)43)
25466e63ce3Schristos { }
25566e63ce3Schristos void h(char, signed int = (signed int)43)
25666e63ce3Schristos { }
25766e63ce3Schristos void h(unsigned int = (unsigned int)43)
25866e63ce3Schristos { }
25966e63ce3Schristos 
26066e63ce3Schristos 
26166e63ce3Schristos void h(long = (long)43)
26266e63ce3Schristos { }
26366e63ce3Schristos void h(char, signed long = (signed long)43)
26466e63ce3Schristos { }
26566e63ce3Schristos void h(unsigned long = (unsigned long)43)
26666e63ce3Schristos { }
26766e63ce3Schristos 
26866e63ce3Schristos #ifdef __GNUC__
26966e63ce3Schristos void h(long long = 43)
27066e63ce3Schristos { }
27166e63ce3Schristos void h(char, signed long long = 43)
27266e63ce3Schristos { }
27366e63ce3Schristos void h(unsigned long long = 43)
27466e63ce3Schristos { }
27566e63ce3Schristos #endif
27666e63ce3Schristos 
27766e63ce3Schristos void h(float = 4.3e-10)
27866e63ce3Schristos { }
27966e63ce3Schristos void h(double = 4.3)
28066e63ce3Schristos { }
28166e63ce3Schristos #ifdef __GNUC__
28266e63ce3Schristos void h(long double = 4.33e33)
28366e63ce3Schristos { }
28466e63ce3Schristos #endif
28566e63ce3Schristos */
28666e63ce3Schristos 
28766e63ce3Schristos /* An unneeded printf() definition - actually, just a stub - used to occupy
28866e63ce3Schristos    this space.  It has been removed and replaced with this comment which
28966e63ce3Schristos    exists to occupy some lines so that templates.exp won't need adjustment.  */
29066e63ce3Schristos 
29166e63ce3Schristos class T1 {
29266e63ce3Schristos public:
29366e63ce3Schristos     static void* operator new(size_t) throw ();
29466e63ce3Schristos     static void operator delete(void *pointer);
29566e63ce3Schristos 
29666e63ce3Schristos     void operator=(const T1&);
29766e63ce3Schristos     T1& operator=(int);
29866e63ce3Schristos 
29966e63ce3Schristos     int operator==(int) const;
30066e63ce3Schristos     int operator==(const T1&) const;
30166e63ce3Schristos     int operator!=(int) const;
30266e63ce3Schristos     int operator!=(const T1&) const;
30366e63ce3Schristos 
30466e63ce3Schristos     int operator<=(int) const;
30566e63ce3Schristos     int operator<=(const T1&) const;
30666e63ce3Schristos     int operator<(int) const;
30766e63ce3Schristos     int operator<(const T1&) const;
30866e63ce3Schristos     int operator>=(int) const;
30966e63ce3Schristos     int operator>=(const T1&) const;
31066e63ce3Schristos     int operator>(int) const;
31166e63ce3Schristos     int operator>(const T1&) const;
31266e63ce3Schristos 
31366e63ce3Schristos     void operator+(int) const;
31466e63ce3Schristos     T1& operator+(const T1&) const;
31566e63ce3Schristos     void operator+=(int) const;
31666e63ce3Schristos     T1& operator+=(const T1&) const;
31766e63ce3Schristos 
31866e63ce3Schristos     T1& operator++() const;
31966e63ce3Schristos 
32066e63ce3Schristos     void operator-(int) const;
32166e63ce3Schristos     T1& operator-(const T1&) const;
32266e63ce3Schristos     void operator-=(int) const;
32366e63ce3Schristos     T1& operator-=(const T1&) const;
32466e63ce3Schristos 
32566e63ce3Schristos     T1& operator--() const;
32666e63ce3Schristos 
32766e63ce3Schristos     void operator*(int) const;
32866e63ce3Schristos     T1& operator*(const T1&) const;
32966e63ce3Schristos     void operator*=(int) const;
33066e63ce3Schristos     T1& operator*=(const T1&) const;
33166e63ce3Schristos 
33266e63ce3Schristos     void operator/(int) const;
33366e63ce3Schristos     T1& operator/(const T1&) const;
33466e63ce3Schristos     void operator/=(int) const;
33566e63ce3Schristos     T1& operator/=(const T1&) const;
33666e63ce3Schristos 
33766e63ce3Schristos     void operator%(int) const;
33866e63ce3Schristos     T1& operator%(const T1&) const;
33966e63ce3Schristos     void operator%=(int) const;
34066e63ce3Schristos     T1& operator%=(const T1&) const;
34166e63ce3Schristos 
34266e63ce3Schristos     void operator&&(int) const;
34366e63ce3Schristos     T1& operator&&(const T1&) const;
34466e63ce3Schristos 
34566e63ce3Schristos     void operator||(int) const;
34666e63ce3Schristos     T1& operator||(const T1&) const;
34766e63ce3Schristos 
34866e63ce3Schristos     void operator&(int) const;
34966e63ce3Schristos     T1& operator&(const T1&) const;
35066e63ce3Schristos     void operator&=(int) const;
35166e63ce3Schristos     T1& operator&=(const T1&) const;
35266e63ce3Schristos 
35366e63ce3Schristos     void operator|(int) const;
35466e63ce3Schristos     T1& operator|(const T1&) const;
35566e63ce3Schristos     void operator|=(int) const;
35666e63ce3Schristos     T1& operator|=(const T1&) const;
35766e63ce3Schristos 
35866e63ce3Schristos     void operator^(int) const;
35966e63ce3Schristos     T1& operator^(const T1&) const;
36066e63ce3Schristos     void operator^=(int) const;
36166e63ce3Schristos     T1& operator^=(const T1&) const;
36266e63ce3Schristos 
36366e63ce3Schristos     T1& operator!() const;
36466e63ce3Schristos     T1& operator~() const;
36566e63ce3Schristos };
36666e63ce3Schristos 
36766e63ce3Schristos void*
operator new(size_t)36866e63ce3Schristos T1::operator new(size_t) throw ()
36966e63ce3Schristos { return 0; }
37066e63ce3Schristos 
37166e63ce3Schristos void
operator delete(void * pointer)37266e63ce3Schristos T1::operator delete(void *pointer)
37366e63ce3Schristos { }
37466e63ce3Schristos 
37566e63ce3Schristos class T2 {
37666e63ce3Schristos public:
T2(int i)37766e63ce3Schristos     T2(int i): integer(i)
37866e63ce3Schristos 	{ }
37966e63ce3Schristos     int integer;
38066e63ce3Schristos };
38166e63ce3Schristos 
operator ==(const T2 &,const T2 &)38266e63ce3Schristos int operator==(const T2&, const T2&)
38366e63ce3Schristos { return 0; }
operator ==(const T2 &,char)38466e63ce3Schristos int operator==(const T2&, char)
38566e63ce3Schristos { return 0; }
operator !=(const T2 &,const T2 &)38666e63ce3Schristos int operator!=(const T2&, const T2&)
38766e63ce3Schristos { return 0; }
operator !=(const T2 &,char)38866e63ce3Schristos int operator!=(const T2&, char)
38966e63ce3Schristos { return 0; }
39066e63ce3Schristos 
operator <=(const T2 &,const T2 &)39166e63ce3Schristos int operator<=(const T2&, const T2&)
39266e63ce3Schristos { return 0; }
operator <=(const T2 &,char)39366e63ce3Schristos int operator<=(const T2&, char)
39466e63ce3Schristos { return 0; }
operator <(const T2 &,const T2 &)39566e63ce3Schristos int operator<(const T2&, const T2&)
39666e63ce3Schristos { return 0; }
operator <(const T2 &,char)39766e63ce3Schristos int operator<(const T2&, char)
39866e63ce3Schristos { return 0; }
operator >=(const T2 &,const T2 &)39966e63ce3Schristos int operator>=(const T2&, const T2&)
40066e63ce3Schristos { return 0; }
operator >=(const T2 &,char)40166e63ce3Schristos int operator>=(const T2&, char)
40266e63ce3Schristos { return 0; }
operator >(const T2 &,const T2 &)40366e63ce3Schristos int operator>(const T2&, const T2&)
40466e63ce3Schristos { return 0; }
operator >(const T2 &,char)40566e63ce3Schristos int operator>(const T2&, char)
40666e63ce3Schristos { return 0; }
40766e63ce3Schristos 
operator +(const T2 t,int i)40866e63ce3Schristos T2 operator+(const T2 t, int i)
40966e63ce3Schristos { return t.integer + i; }
operator +(const T2 a,const T2 & b)41066e63ce3Schristos T2 operator+(const T2 a, const T2& b)
41166e63ce3Schristos { return a.integer + b.integer; }
operator +=(T2 & t,int i)41266e63ce3Schristos T2& operator+=(T2& t, int i)
41366e63ce3Schristos { t.integer += i; return t; }
operator +=(T2 & a,const T2 & b)41466e63ce3Schristos T2& operator+=(T2& a, const T2& b)
41566e63ce3Schristos { a.integer += b.integer; return a; }
41666e63ce3Schristos 
operator -(const T2 t,int i)41766e63ce3Schristos T2 operator-(const T2 t, int i)
41866e63ce3Schristos { return t.integer - i; }
operator -(const T2 a,const T2 & b)41966e63ce3Schristos T2 operator-(const T2 a, const T2& b)
42066e63ce3Schristos { return a.integer - b.integer; }
operator -=(T2 & t,int i)42166e63ce3Schristos T2& operator-=(T2& t, int i)
42266e63ce3Schristos { t.integer -= i; return t; }
operator -=(T2 & a,const T2 & b)42366e63ce3Schristos T2& operator-=(T2& a, const T2& b)
42466e63ce3Schristos { a.integer -= b.integer; return a; }
42566e63ce3Schristos 
operator *(const T2 t,int i)42666e63ce3Schristos T2 operator*(const T2 t, int i)
42766e63ce3Schristos { return t.integer * i; }
operator *(const T2 a,const T2 & b)42866e63ce3Schristos T2 operator*(const T2 a, const T2& b)
42966e63ce3Schristos { return a.integer * b.integer; }
operator *=(T2 & t,int i)43066e63ce3Schristos T2& operator*=(T2& t, int i)
43166e63ce3Schristos { t.integer *= i; return t; }
operator *=(T2 & a,const T2 & b)43266e63ce3Schristos T2& operator*=(T2& a, const T2& b)
43366e63ce3Schristos { a.integer *= b.integer; return a; }
43466e63ce3Schristos 
operator /(const T2 t,int i)43566e63ce3Schristos T2 operator/(const T2 t, int i)
43666e63ce3Schristos { return t.integer / i; }
operator /(const T2 a,const T2 & b)43766e63ce3Schristos T2 operator/(const T2 a, const T2& b)
43866e63ce3Schristos { return a.integer / b.integer; }
operator /=(T2 & t,int i)43966e63ce3Schristos T2& operator/=(T2& t, int i)
44066e63ce3Schristos { t.integer /= i; return t; }
operator /=(T2 & a,const T2 & b)44166e63ce3Schristos T2& operator/=(T2& a, const T2& b)
44266e63ce3Schristos { a.integer /= b.integer; return a; }
44366e63ce3Schristos 
operator %(const T2 t,int i)44466e63ce3Schristos T2 operator%(const T2 t, int i)
44566e63ce3Schristos { return t.integer % i; }
operator %(const T2 a,const T2 & b)44666e63ce3Schristos T2 operator%(const T2 a, const T2& b)
44766e63ce3Schristos { return a.integer % b.integer; }
operator %=(T2 & t,int i)44866e63ce3Schristos T2& operator%=(T2& t, int i)
44966e63ce3Schristos { t.integer %= i; return t; }
operator %=(T2 & a,const T2 & b)45066e63ce3Schristos T2& operator%=(T2& a, const T2& b)
45166e63ce3Schristos { a.integer %= b.integer; return a; }
45266e63ce3Schristos 
45366e63ce3Schristos template<class T>
45466e63ce3Schristos class T5 {
45566e63ce3Schristos public:
45666e63ce3Schristos     T5(int);
45766e63ce3Schristos     T5(const T5<T>&);
45866e63ce3Schristos     ~T5();
45966e63ce3Schristos     static void* operator new(size_t) throw ();
46066e63ce3Schristos     static void operator delete(void *pointer);
46166e63ce3Schristos     int value();
46266e63ce3Schristos 
46366e63ce3Schristos     static T X;
46466e63ce3Schristos     T x;
46566e63ce3Schristos     int val;
46666e63ce3Schristos };
46766e63ce3Schristos 
46866e63ce3Schristos template<class T>
T5(int v)46966e63ce3Schristos T5<T>::T5(int v)
47066e63ce3Schristos { val = v; }
47166e63ce3Schristos 
47266e63ce3Schristos template<class T>
T5(const T5<T> &)47366e63ce3Schristos T5<T>::T5(const T5<T>&)
47466e63ce3Schristos {}
47566e63ce3Schristos 
47666e63ce3Schristos template<class T>
~T5()47766e63ce3Schristos T5<T>::~T5()
47866e63ce3Schristos {}
47966e63ce3Schristos 
48066e63ce3Schristos template<class T>
48166e63ce3Schristos void*
operator new(size_t)48266e63ce3Schristos T5<T>::operator new(size_t) throw ()
48366e63ce3Schristos { return 0; }
48466e63ce3Schristos 
48566e63ce3Schristos template<class T>
48666e63ce3Schristos void
operator delete(void * pointer)48766e63ce3Schristos T5<T>::operator delete(void *pointer)
48866e63ce3Schristos { }
48966e63ce3Schristos 
49066e63ce3Schristos template<class T>
49166e63ce3Schristos int
value()49266e63ce3Schristos T5<T>::value()
49366e63ce3Schristos { return val; }
49466e63ce3Schristos 
49566e63ce3Schristos template <class T>
GetMax(T a,T b)49666e63ce3Schristos T GetMax (T a, T b) {
49766e63ce3Schristos   T result;
49866e63ce3Schristos   result = (a>b)? a : b;
49966e63ce3Schristos   // set breakpoint on a line with no real code
50066e63ce3Schristos   return (result);
50166e63ce3Schristos }
50266e63ce3Schristos 
50366e63ce3Schristos #if ! defined(__GNUC__) || defined(GCC_BUG)
50466e63ce3Schristos template<class T>
50566e63ce3Schristos T T5<T>::X;
50666e63ce3Schristos #endif
50766e63ce3Schristos 
50866e63ce3Schristos 
50966e63ce3Schristos 
51066e63ce3Schristos 
51166e63ce3Schristos T5<char> t5c(1);
51266e63ce3Schristos T5<int> t5i(2);
51366e63ce3Schristos T5<int (*)(char, void *)> t5fi1(3);
51466e63ce3Schristos T5<int (*)(int, double **, void *)> t5fi2(4);
51566e63ce3Schristos 
51666e63ce3Schristos 
51766e63ce3Schristos 
51866e63ce3Schristos 
51966e63ce3Schristos 
52066e63ce3Schristos 
52166e63ce3Schristos class x {
52266e63ce3Schristos public:
52366e63ce3Schristos     int (*manage[5])(double,
52466e63ce3Schristos 		     void *(*malloc)(unsigned size),
52566e63ce3Schristos 		     void (*free)(void *pointer));
52666e63ce3Schristos     int (*device[5])(int open(const char *, unsigned mode, unsigned perms, int extra),
52766e63ce3Schristos 		     int *(*read)(int fd, void *place, unsigned size),
52866e63ce3Schristos 		     int *(*write)(int fd, void *place, unsigned size),
52966e63ce3Schristos 		     void (*close)(int fd));
53066e63ce3Schristos };
53166e63ce3Schristos T5<x> t5x(5);
53266e63ce3Schristos 
53366e63ce3Schristos #if !defined(__GNUC__) || (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)
53466e63ce3Schristos template class T5<char>;
53566e63ce3Schristos template class T5<int>;
53666e63ce3Schristos template class T5<int (*)(char, void *)>;
53766e63ce3Schristos template class T5<int (*)(int, double **, void *)>;
53866e63ce3Schristos template class T5<x>;
53966e63ce3Schristos #endif
54066e63ce3Schristos 
54166e63ce3Schristos class T7 {
54266e63ce3Schristos public:
54366e63ce3Schristos     static int get();
54466e63ce3Schristos     static void put(int);
54566e63ce3Schristos };
54666e63ce3Schristos 
54766e63ce3Schristos int
get()54866e63ce3Schristos T7::get()
54966e63ce3Schristos { return 1; }
55066e63ce3Schristos 
55166e63ce3Schristos void
put(int i)55266e63ce3Schristos T7::put(int i)
55366e63ce3Schristos {
55466e63ce3Schristos     // nothing
55566e63ce3Schristos }
55666e63ce3Schristos 
55766e63ce3Schristos // More template kinds.  GDB 4.16 didn't handle these, but
55866e63ce3Schristos // Wildebeest does.  Note: Assuming HP aCC is used to compile
55966e63ce3Schristos // this file; with g++ or HP cfront or other compilers the
56066e63ce3Schristos // demangling may not get done correctly.
56166e63ce3Schristos 
56266e63ce3Schristos // Ordinary template, to be instantiated with different types
56366e63ce3Schristos template<class T>
56466e63ce3Schristos class Foo {
56566e63ce3Schristos public:
56666e63ce3Schristos   int x;
56766e63ce3Schristos   T t;
56866e63ce3Schristos   T foo (int, T);
56966e63ce3Schristos };
57066e63ce3Schristos 
57166e63ce3Schristos 
foo(int i,T tt)57266e63ce3Schristos template<class T> T Foo<T>::foo (int i, T tt)
57366e63ce3Schristos {
57466e63ce3Schristos   return tt;
57566e63ce3Schristos }
57666e63ce3Schristos 
57766e63ce3Schristos // Template with int parameter
57866e63ce3Schristos 
57966e63ce3Schristos template<class T, int sz>
58066e63ce3Schristos class Bar {
58166e63ce3Schristos public:
58266e63ce3Schristos   int x;
58366e63ce3Schristos   T t;
58466e63ce3Schristos   T bar (int, T);
58566e63ce3Schristos };
58666e63ce3Schristos 
58766e63ce3Schristos 
58866e63ce3Schristos template<class T, int sz> T Bar<T, sz>::bar (int i, T tt)
58966e63ce3Schristos {
59066e63ce3Schristos   if (i < sz)
59166e63ce3Schristos     return tt;
59266e63ce3Schristos   else
59366e63ce3Schristos     return 0;
59466e63ce3Schristos }
59566e63ce3Schristos 
59666e63ce3Schristos // function template with int parameter
dummy(T tt,int i)59766e63ce3Schristos template<class T> int dummy (T tt, int i)
59866e63ce3Schristos {
59966e63ce3Schristos   return tt;
60066e63ce3Schristos }
60166e63ce3Schristos 
60266e63ce3Schristos // Template with partial specializations
60366e63ce3Schristos template<class T1, class T2>
60466e63ce3Schristos class Spec {
60566e63ce3Schristos public:
60666e63ce3Schristos   int x;
60766e63ce3Schristos   T1 spec (T2);
60866e63ce3Schristos };
60966e63ce3Schristos 
61066e63ce3Schristos template<class T1, class T2>
61166e63ce3Schristos T1 Spec<T1, T2>::spec (T2 t2)
61266e63ce3Schristos {
61366e63ce3Schristos   return 0;
61466e63ce3Schristos }
61566e63ce3Schristos 
61666e63ce3Schristos template<class T>
61766e63ce3Schristos class Spec<T, T*> {
61866e63ce3Schristos public:
61966e63ce3Schristos   int x;
62066e63ce3Schristos   T spec (T*);
62166e63ce3Schristos };
62266e63ce3Schristos 
62366e63ce3Schristos template<class T>
spec(T * tp)62466e63ce3Schristos T Spec<T, T*>::spec (T * tp)
62566e63ce3Schristos {
62666e63ce3Schristos   return *tp;
62766e63ce3Schristos }
62866e63ce3Schristos 
62966e63ce3Schristos // Template with char parameter
63066e63ce3Schristos template<class T, char sz>
63166e63ce3Schristos class Baz {
63266e63ce3Schristos public:
~Baz()63366e63ce3Schristos   ~Baz () { };
63466e63ce3Schristos   int x;
63566e63ce3Schristos   T t;
63666e63ce3Schristos   T baz (int, T);
63766e63ce3Schristos };
63866e63ce3Schristos 
63966e63ce3Schristos template<class T, char sz> T Baz<T, sz>::baz (int i, T tt)
64066e63ce3Schristos {
64166e63ce3Schristos   if (i < sz)
64266e63ce3Schristos     return tt;
64366e63ce3Schristos   else
64466e63ce3Schristos     return 0;
64566e63ce3Schristos }
64666e63ce3Schristos 
64766e63ce3Schristos typedef Baz<int, 1> intBazOne;
64866e63ce3Schristos 
64966e63ce3Schristos // Template with char * parameter
65066e63ce3Schristos template<class T, char * sz>
65166e63ce3Schristos class Qux {
65266e63ce3Schristos public:
65366e63ce3Schristos   int x;
65466e63ce3Schristos   T t;
65566e63ce3Schristos   T qux (int, T);
65666e63ce3Schristos };
65766e63ce3Schristos 
65866e63ce3Schristos template<class T, char * sz> T Qux<T, sz>::qux (int i, T tt)
65966e63ce3Schristos {
66066e63ce3Schristos   if (sz[0] == 'q')
66166e63ce3Schristos     return tt;
66266e63ce3Schristos   else
66366e63ce3Schristos     return 0;
66466e63ce3Schristos }
66566e63ce3Schristos 
66666e63ce3Schristos // Template with a function pointer parameter
66766e63ce3Schristos template<class T, int (*f)(int) >
66866e63ce3Schristos class Qux1 {
66966e63ce3Schristos public:
67066e63ce3Schristos   int x;
67166e63ce3Schristos   T t;
67266e63ce3Schristos   T qux (int, T);
67366e63ce3Schristos };
67466e63ce3Schristos 
67566e63ce3Schristos template<class T, int (*f)(int)> T Qux1<T, f>::qux (int i, T tt)
67666e63ce3Schristos {
67766e63ce3Schristos   if (f != 0)
67866e63ce3Schristos     return tt;
67966e63ce3Schristos   else
68066e63ce3Schristos     return 0;
68166e63ce3Schristos }
68266e63ce3Schristos 
68366e63ce3Schristos // Some functions to provide as arguments to template
gf1(int a)68466e63ce3Schristos int gf1 (int a) {
68566e63ce3Schristos   return a * 2 + 13;
68666e63ce3Schristos }
gf2(int a)68766e63ce3Schristos int gf2 (int a) {
68866e63ce3Schristos   return a * 2 + 26;
68966e63ce3Schristos }
69066e63ce3Schristos 
69166e63ce3Schristos char string[3];
69266e63ce3Schristos 
69366e63ce3Schristos 
69466e63ce3Schristos // Template for nested instantiations
69566e63ce3Schristos 
69666e63ce3Schristos template<class T>
69766e63ce3Schristos class Garply {
69866e63ce3Schristos public:
69966e63ce3Schristos   int x;
70066e63ce3Schristos   T t;
70166e63ce3Schristos   T garply (int, T);
70266e63ce3Schristos };
70366e63ce3Schristos 
garply(int i,T tt)70466e63ce3Schristos template<class T> T Garply<T>::garply (int i, T tt)
70566e63ce3Schristos {
70666e63ce3Schristos   if (i > x)
70766e63ce3Schristos     return tt;
70866e63ce3Schristos   else
70966e63ce3Schristos     {
71066e63ce3Schristos       x += i;
71166e63ce3Schristos       return tt;
71266e63ce3Schristos     }
71366e63ce3Schristos }
71466e63ce3Schristos 
71566e63ce3Schristos template<class C> class Empty
71666e63ce3Schristos {
71766e63ce3Schristos };
71866e63ce3Schristos 
71966e63ce3Schristos template<class C> class FunctionArg
72066e63ce3Schristos {
72166e63ce3Schristos public:
72266e63ce3Schristos   int method(Empty<void (FunctionArg<C>)> &);
72366e63ce3Schristos };
72466e63ce3Schristos 
method(Empty<void (FunctionArg<C>)> & arg)72566e63ce3Schristos template<class C> int FunctionArg<C>::method(Empty<void (FunctionArg<C>)> &arg)
72666e63ce3Schristos {
72766e63ce3Schristos   return 75;
72866e63ce3Schristos }
72966e63ce3Schristos 
73066e63ce3Schristos Empty<void(FunctionArg<int>)> empty;
73166e63ce3Schristos FunctionArg<int> arg;
73266e63ce3Schristos 
main()73366e63ce3Schristos int main()
73466e63ce3Schristos {
73566e63ce3Schristos     int i;
73666e63ce3Schristos     long l, m, n;
737*48596154Schristos 
73866e63ce3Schristos     i = i + 1;
73966e63ce3Schristos 
74066e63ce3Schristos     // New tests added here
74166e63ce3Schristos 
74266e63ce3Schristos   Foo<int> fint={0,0};
74366e63ce3Schristos   Foo<char> fchar={0,0};
74466e63ce3Schristos   Foo<volatile char *> fvpchar = {0, 0};
74566e63ce3Schristos 
74666e63ce3Schristos   Bar<int, 33> bint;
74766e63ce3Schristos   Bar<int, (4 > 3)> bint2;
74866e63ce3Schristos 
74966e63ce3Schristos   Baz<int, 's'> bazint;
75066e63ce3Schristos   Baz<char, 'a'> bazint2;
75166e63ce3Schristos 
75266e63ce3Schristos   Qux<char, string> quxint2;
75366e63ce3Schristos   Qux<int, string> quxint;
75466e63ce3Schristos 
75566e63ce3Schristos   Qux1<int, gf1> qux11;
75666e63ce3Schristos 
75766e63ce3Schristos   int x = fint.foo(33, 47);
75866e63ce3Schristos   char c = fchar.foo(33, 'x');
75966e63ce3Schristos   volatile char * cp = fvpchar.foo(33, 0);
76066e63ce3Schristos 
76166e63ce3Schristos   int y = dummy<int> (400, 600);
76266e63ce3Schristos 
76366e63ce3Schristos   int z = bint.bar(55, 66);
76466e63ce3Schristos   z += bint2.bar(55, 66);
76566e63ce3Schristos 
76666e63ce3Schristos   c = bazint2.baz(4, 'y');
76766e63ce3Schristos   c = quxint2.qux(4, 'z');
76866e63ce3Schristos 
76966e63ce3Schristos   y = bazint.baz(4,3);
77066e63ce3Schristos   y = quxint.qux(4, 22);
77166e63ce3Schristos   y += qux11.qux(4, 22);
77266e63ce3Schristos 
77366e63ce3Schristos   y *= gf1(y) - gf2(y);
77466e63ce3Schristos 
77566e63ce3Schristos   Spec<int, char> sic;
77666e63ce3Schristos   Spec<int, int *> siip;
77766e63ce3Schristos 
77866e63ce3Schristos   sic.spec ('c');
77966e63ce3Schristos   siip.spec (&x);
78066e63ce3Schristos 
78166e63ce3Schristos   Garply<int> f;
78266e63ce3Schristos   Garply<char> fc;
78366e63ce3Schristos   f.x = 13;
78466e63ce3Schristos 
78566e63ce3Schristos   Garply<Garply<char> > nf;
78666e63ce3Schristos   nf.x = 31;
78766e63ce3Schristos 
78866e63ce3Schristos   x = f.garply (3, 4);
78966e63ce3Schristos 
79066e63ce3Schristos   fc = nf.garply (3, fc);
79166e63ce3Schristos 
79266e63ce3Schristos   y = x + fc.x;
79366e63ce3Schristos 
79466e63ce3Schristos   i=GetMax<int>(x,y);
79566e63ce3Schristos   n=GetMax<long>(l,m);
79666e63ce3Schristos 
79766e63ce3Schristos   intBazOne ibo;
79866e63ce3Schristos   z = ibo.baz (2, 21);
79966e63ce3Schristos 
80066e63ce3Schristos   t5i.value();
80166e63ce3Schristos 
80266e63ce3Schristos   arg.method(empty);
80366e63ce3Schristos 
80466e63ce3Schristos   return 0;
80566e63ce3Schristos }
806