blob: 91d53d3060a0b0e159cdefcd3205a797339303a2 [file] [log] [blame]
Argyrios Kyrtzidis90b715e2010-06-19 19:28:53 +00001// Header for PCH test cxx-templates.cpp
2
Argyrios Kyrtzidisdd41c142010-06-23 13:48:30 +00003template <typename T1, typename T2>
Argyrios Kyrtzidis5a7b9c52010-07-02 11:55:48 +00004struct S;
5
6template <typename T1, typename T2>
Argyrios Kyrtzidis90b715e2010-06-19 19:28:53 +00007struct S {
Argyrios Kyrtzidis5a7b9c52010-07-02 11:55:48 +00008 S() { }
Argyrios Kyrtzidisdd41c142010-06-23 13:48:30 +00009 static void templ();
10};
11
12template <typename T>
13struct S<int, T> {
14 static void partial();
15};
16
17template <>
18struct S<int, float> {
19 static void explicit_special();
Argyrios Kyrtzidis90b715e2010-06-19 19:28:53 +000020};
Argyrios Kyrtzidisf511ba62010-06-22 09:55:07 +000021
Argyrios Kyrtzidis17cfded2010-06-28 09:31:42 +000022template <int x>
23int tmpl_f2() { return x; }
24
Argyrios Kyrtzidisb24e1992010-06-25 16:25:09 +000025template <typename T, int y>
Argyrios Kyrtzidisf511ba62010-06-22 09:55:07 +000026T templ_f(T x) {
Argyrios Kyrtzidisdc767e32010-06-28 09:31:34 +000027 int z = templ_f<int, 5>(3);
Argyrios Kyrtzidis17cfded2010-06-28 09:31:42 +000028 z = tmpl_f2<y+2>();
Argyrios Kyrtzidisae8b17f2010-06-30 08:49:25 +000029 T data[y];
Argyrios Kyrtzidisb24e1992010-06-25 16:25:09 +000030 return x+y;
Argyrios Kyrtzidisf511ba62010-06-22 09:55:07 +000031}
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +000032
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +000033void govl(int);
34void govl(char);
35
36template <typename T>
37struct Unresolv {
38 void f() {
39 govl(T());
40 }
41};
42
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +000043template <typename T>
44struct Dep {
45 typedef typename T::type Ty;
46 void f() {
47 Ty x = Ty();
48 T::my_f();
49 int y = T::template my_templf<int>(0);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +000050 ovl(y);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +000051 }
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +000052
53 void ovl(int);
54 void ovl(float);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +000055};
56
57template<typename T, typename A1>
58inline T make_a(const A1& a1) {
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +000059 T::depend_declref();
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +000060 return T(a1);
61}
Argyrios Kyrtzidis8f4eae92010-06-30 08:49:30 +000062
63template <class T> class UseBase {
64 void foo();
65 typedef int bar;
66};
67
68template <class T> class UseA : public UseBase<T> {
69 using UseBase<T>::foo;
70 using typename UseBase<T>::bar;
71};
Argyrios Kyrtzidis5a7b9c52010-07-02 11:55:48 +000072
73template <class T> class Sub : public UseBase<int> { };
74
75template <class _Ret, class _Tp>
76 class mem_fun_t
77 {
78 public:
79 explicit
80 mem_fun_t(_Ret (_Tp::*__pf)())
81 {}
82
83 private:
84 _Ret (_Tp::*_M_f)();
85 };
86
87template<unsigned N>
88bool isInt(int x);
89
90template<> bool isInt<8>(int x) {
Argyrios Kyrtzidis7cb45e32010-07-22 16:03:56 +000091 try { ++x; } catch(...) { --x; }
92 return true;
Argyrios Kyrtzidis5a7b9c52010-07-02 11:55:48 +000093}
94
95template<typename _CharT>
96int __copy_streambufs_eof(_CharT);
97
98class basic_streambuf
99{
100 void m() { }
101 friend int __copy_streambufs_eof<>(int);
102};
103
Argyrios Kyrtzidise3041be2010-07-19 10:14:41 +0000104// PR 7660
105template<typename T> struct S_PR7660 { void g(void (*)(T)); };
106 template<> void S_PR7660<int>::g(void(*)(int)) {}
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000107
108// PR 7670
109template<typename> class C_PR7670;
110template<> class C_PR7670<int>;
111template<> class C_PR7670<int>;
Argyrios Kyrtzidisab411c82010-07-29 20:07:52 +0000112
113template <bool B>
114struct S2 {
115 static bool V;
116};
117
118extern template class S2<true>;
Argyrios Kyrtzidisa8650052010-08-03 17:30:10 +0000119
120template <typename T>
121struct S3 {
122 void m();
123};
124
125template <typename T>
126inline void S3<T>::m() { }