1 // Header for PCH test cxx-templates.cpp
3 template <typename T1
, typename T2
>
6 template <typename T1
, typename T2
>
14 static void partial();
18 struct S
<int, float> {
19 static void explicit_special();
23 int tmpl_f2() { return x
; }
25 template <typename T
, int y
>
27 int z
= templ_f
<int, 5>(3);
45 typedef typename
T::type Ty
;
49 int y
= T::template my_templf
<int>(0);
57 template<typename T
, typename A1
>
58 inline T
make_a(const A1
& a1
) {
63 template <class T
> class UseBase
{
68 template <class T
> class UseA
: public UseBase
<T
> {
69 using UseBase
<T
>::foo
;
70 using typename UseBase
<T
>::bar
;
73 template <class T
> class Sub
: public UseBase
<int> { };
75 template <class _Ret
, class _Tp
>
80 mem_fun_t(_Ret (_Tp::*__pf
)())
90 template<> bool isInt
<8>(int x
) {
91 try { ++x
; } catch(...) { --x
; }
95 template<typename _CharT
>
96 int __copy_streambufs_eof(_CharT
);
101 friend int __copy_streambufs_eof
<>(int);
105 template<typename T
> struct S_PR7660
{ void g(void (*)(T
)); };
106 template<> void S_PR7660
<int>::g(void(*)(int)) {}
109 template<typename
> class C_PR7670
;
110 template<> class C_PR7670
<int>;
111 template<> class C_PR7670
<int>;
118 extern template class S2
<true>;
120 template <typename T
>
125 template <typename T
>
126 inline void S3
<T
>::m() { }
128 template <typename T
>
132 extern template struct S4
<int>;
134 void S4ImplicitInst() {
145 template <typename T
>
150 template<class T
> void f_PR8134(T
);
151 template<class T
> void f_PR8134(T
);
152 void g_PR8134() { f_PR8134(0); f_PR8134('x'); }
155 template <typename T
>
158 template <typename T
, unsigned N
>
159 struct S6
<const T
[N
]>
162 typedef const T t1
[N
];
171 struct S7
<int[N
]> : S6
<const int[N
]> { };
173 // Zero-length template argument lists
174 namespace ZeroLengthExplicitTemplateArgs
{
175 template<typename T
> void h();
178 template<typename T
> void f();
184 ptr
->template g2
<>(17);
192 template<typename T
> static void g(T
);
193 template<typename T
> void g2(T
);
197 namespace NonTypeTemplateParmContext
{
198 template<typename T
, int inlineCapacity
= 0> class Vector
{ };
201 template<int inlineCapacity
>
202 static String
adopt(Vector
<char, inlineCapacity
>&);
205 template<int inlineCapacity
>
206 inline bool equalIgnoringNullity(const Vector
<char, inlineCapacity
>& a
, const String
& b
) { return false; }
209 template< typename
> class Foo
;
211 template< typename T
>
212 class Foo
: protected T
215 Foo
& operator=( const Foo
& other
);
218 template<typename
...A
> struct NestedExpansion
{
219 template<typename
...B
> auto f(A
...a
, B
...b
) -> decltype(g(a
+ b
...));
221 template struct NestedExpansion
<char, char, char>;
223 namespace rdar13135282
{
224 template < typename _Alloc
>
225 void foo(_Alloc
= _Alloc());
227 template < bool > class __pool
;
229 template < template < bool > class _PoolTp
>
230 struct __common_pool
{
231 typedef _PoolTp
< 0 > pool_type
;
234 template < template < bool > class _PoolTp
>
235 struct __common_pool_base
: __common_pool
< _PoolTp
> {};
237 template < template < bool > class _PoolTp
>
238 struct A
: __common_pool_base
< _PoolTp
> {};
240 template < typename _Poolp
= A
< __pool
> >
242 typedef typename
_Poolp::pool_type __pool_type
;
244 foo
<__mt_alloc
<> >();
259 template void f
<int>();
262 template<typename T
> void doNotDeserialize() {}
263 template<typename T
> struct ContainsDoNotDeserialize
{
264 static int doNotDeserialize
;
266 template<typename T
> struct ContainsDoNotDeserialize2
{
267 static void doNotDeserialize();
269 template<typename T
> int ContainsDoNotDeserialize
<T
>::doNotDeserialize
= 0;
270 template<typename T
> void ContainsDoNotDeserialize2
<T
>::doNotDeserialize() {}
273 template<typename T
> void DependentSpecializedFunc(T x
) { x
.foo(); }
274 template<typename T
> class DependentSpecializedFuncClass
{
276 friend void DependentSpecializedFunc
<>(DependentSpecializedFuncClass
);
279 namespace cyclic_module_load
{
280 // Reduced from a libc++ modules crasher.
282 template<class> class mask_array
;
283 template<class> class valarray
{
285 valarray(const valarray
&v
);
290 valarray
<int> stride() const { return x
; }
293 template<class> class mask_array
{
294 template<class> friend class valarray
;
299 namespace local_extern
{
300 template<typename T
> int f() {
307 template<typename T
> int g() {
314 namespace rdar15468709a
{
315 template<typename
> struct decay
{};
317 template<typename FooParamTy
> auto foo(FooParamTy fooParam
) -> decltype(fooParam
);
318 template<typename BarParamTy
> auto bar(BarParamTy barParam
) -> decay
<decltype(barParam
)>;
328 namespace rdar15468709b
{
329 template<typename
> struct decay
{};
331 template<typename
... Foos
> int returnsInt(Foos
... foos
);
333 template<typename
... FooParamTy
> auto foo(FooParamTy
... fooParam
) -> decltype(returnsInt(fooParam
...));
334 template<typename
... BarParamTy
> auto bar(BarParamTy
... barParam
) -> decay
<decltype(returnsInt(barParam
...))>;
344 namespace rdar15468709c
{
345 template<typename
> struct decay
{};
347 template<class... Foos
> int returnsInt(Foos
... foos
);
349 template<typename FooParamTy
> void foo(FooParamTy fooParam
) { decltype(fooParam
) a
; }
350 template<typename BarParamTy
> auto bar(BarParamTy barParam
) -> decay
<decltype(barParam
)>;
360 namespace MemberSpecializationLocation
{
361 template<typename T
> struct A
{ static int n
; };
364 // https://bugs.llvm.org/show_bug.cgi?id=34728
367 // case 1: defaulted `NonTypeTemplateParmDecl`, non-defaulted 2nd tpl param
368 template <int foo
= 10, class T
>
369 int func1(T
const &);
371 template <int foo
, class T
>
372 int func1(T
const &) {
376 // case 2: defaulted `TemplateTypeParmDecl`, non-defaulted 2nd tpl param
377 template <class A
= int, class B
>
380 template <class A
, class B
>
385 // case 3: defaulted `TemplateTemplateParmDecl`, non-defaulted 2nd tpl param
387 struct Container
{ T
const &item
; };
389 template <template <class> class C
= Container
, class D
>
390 C
<D
> func3(D
const &);
392 template <template <class> class C
, class D
>
393 C
<D
> func3(D
const &d
) {
394 return Container
<D
>{d
};
397 } // end namespace PR34728
399 namespace ClassScopeExplicitSpecializations
{
400 template<int> struct A
{
401 template<int> constexpr int f() const { return 1; }
402 template<> constexpr int f
<0>() const { return 2; }
405 template<> template<int> constexpr int A
<0>::f() const { return 3; }
406 template<> template<> constexpr int A
<0>::f
<0>() const { return 4; }
407 template<> template<> constexpr int A
<0>::f
<1>() const { return 5; }
409 #pragma clang diagnostic push
410 #pragma clang diagnostic ignored "-Winstantiation-after-specialization"
411 template int A
<2>::f
<0>() const;
412 #pragma clang diagnostic pop
413 template int A
<2>::f
<1>() const;
414 extern template int A
<3>::f
<0>() const;
415 extern template int A
<3>::f
<1>() const;
417 template<int> struct B
{
418 template<typename
> static const int v
= 1;
419 template<typename T
> static const int v
<T
*> = 2;
420 template<> static const int v
<int> = 3;
422 template<typename
> static constexpr int w
= 1;
423 template<typename T
> static constexpr int w
<T
*> = 2;
424 template<> static constexpr int w
<int> = 3;
427 template<> template<typename
> constexpr int B
<0>::v
= 4;
428 template<> template<typename T
> constexpr int B
<0>::v
<T
*> = 5;
429 template<> template<typename T
> constexpr int B
<0>::v
<T
&> = 6;
430 // This is ill-formed: the initializer of v<int> is instantiated with the
432 //template<> template<> constexpr int B<0>::v<int> = 7;
433 template<> template<> constexpr int B
<0>::v
<float> = 8;
435 template<> template<typename
> constexpr int B
<0>::w
= 4;
436 template<> template<typename T
> constexpr int B
<0>::w
<T
*> = 5;
437 template<> template<typename T
> constexpr int B
<0>::w
<T
&> = 6;
438 template<> template<> constexpr int B
<0>::w
<int> = 7;
439 template<> template<> constexpr int B
<0>::w
<float> = 8;
442 namespace DependentMemberExpr
{
444 constexpr int setstate() { return 0; }
446 template<typename T
> struct A
: Base
{
447 constexpr int f() { return Base::setstate(); }
451 namespace DependentTemplateName
{
452 template <template <class> class Template
>
453 struct TakesClassTemplate
{};
456 TakesClassTemplate
<T::template Member
> getWithIdentifier();
459 namespace ClassTemplateCycle
{
460 // Create a cycle: the typedef T refers to A<0, 8>, whose template argument
461 // list refers back to T.
462 template<int, int> struct A
;
463 using T
= A
<0, sizeof(void*)>;
464 template<int N
> struct A
<N
, sizeof(T
*)> {};
467 // Create a cycle: the variable M refers to A<1, 1>, whose template argument
468 // list list refers back to M.
469 template<int, int> struct A
;
470 const decltype(sizeof(A
<1, 1>*)) M
= 1;
471 template<int N
> struct A
<N
, M
> {};