blob: c45e02dcb23c1718fe9931dc5b2b76e6fda0129d [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() { }
Argyrios Kyrtzidis0e036382010-08-05 09:48:16 +0000127
128template <typename T>
129struct S4 {
130 void m() { }
131};
132extern template struct S4<int>;
133
134void S4ImplicitInst() {
135 S4<int> s;
136 s.m();
137}
Argyrios Kyrtzidisf84cde12010-09-06 19:04:27 +0000138
139struct S5 {
140 S5(int x);
141};
142
143struct TS5 {
144 S5 s;
145 template <typename T>
146 TS5(T y) : s(y) {}
147};
Argyrios Kyrtzidis99a8ca02010-09-13 11:45:48 +0000148
149// PR 8134
150template<class T> void f_PR8134(T);
151template<class T> void f_PR8134(T);
152void g_PR8134() { f_PR8134(0); f_PR8134('x'); }
Douglas Gregor32adc8b2010-10-26 00:51:02 +0000153
154// rdar8580149
155template <typename T>
156struct S6;
157
158template <typename T, unsigned N>
159struct S6<const T [N]>
160{
161private:
162 typedef const T t1[N];
163public:
164 typedef t1& t2;
165};
166
Douglas Gregor7c789c12010-10-29 22:39:52 +0000167template<typename T>
168 struct S7;
169
170template<unsigned N>
171struct S7<int[N]> : S6<const int[N]> { };
Douglas Gregordef03542011-02-04 12:01:24 +0000172
173// Zero-length template argument lists
174namespace ZeroLengthExplicitTemplateArgs {
175 template<typename T> void h();
176
177 struct Y {
178 template<typename T> void f();
179 };
180
181 template<typename T>
182 void f(T *ptr) {
183 T::template g<>(17);
184 ptr->template g2<>(17);
185 h<T>();
186 h<int>();
187 Y y;
188 y.f<int>();
189 }
190
191 struct X {
192 template<typename T> static void g(T);
193 template<typename T> void g2(T);
194 };
195}
Douglas Gregor67da6f62011-03-05 01:35:54 +0000196
197namespace NonTypeTemplateParmContext {
198 template<typename T, int inlineCapacity = 0> class Vector { };
199
200 struct String {
201 template<int inlineCapacity>
202 static String adopt(Vector<char, inlineCapacity>&);
203 };
204
205 template<int inlineCapacity>
206 inline bool equalIgnoringNullity(const Vector<char, inlineCapacity>& a, const String& b) { return false; }
207}