18ab2c9cdSAndrew V. Tischenko // RUN: %clang_cc1 %s -emit-llvm -o - -ftime-report 2>&1 | FileCheck %s
28ab2c9cdSAndrew V. Tischenko // RUN: %clang_cc1 %s -emit-llvm -o - -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING -ftime-report 2>&1 | FileCheck %s
38ab2c9cdSAndrew V. Tischenko
48ab2c9cdSAndrew V. Tischenko // Template function declarations
58ab2c9cdSAndrew V. Tischenko template <typename T>
68ab2c9cdSAndrew V. Tischenko void foo();
78ab2c9cdSAndrew V. Tischenko template <typename T, typename U>
88ab2c9cdSAndrew V. Tischenko void foo();
98ab2c9cdSAndrew V. Tischenko
108ab2c9cdSAndrew V. Tischenko // Template function definitions.
118ab2c9cdSAndrew V. Tischenko template <typename T>
foo()128ab2c9cdSAndrew V. Tischenko void foo() {}
138ab2c9cdSAndrew V. Tischenko
148ab2c9cdSAndrew V. Tischenko // Template class (forward) declarations
158ab2c9cdSAndrew V. Tischenko template <typename T>
168ab2c9cdSAndrew V. Tischenko struct A;
178ab2c9cdSAndrew V. Tischenko template <typename T, typename U>
188ab2c9cdSAndrew V. Tischenko struct b;
198ab2c9cdSAndrew V. Tischenko template <typename>
208ab2c9cdSAndrew V. Tischenko struct C;
218ab2c9cdSAndrew V. Tischenko template <typename, typename>
228ab2c9cdSAndrew V. Tischenko struct D;
238ab2c9cdSAndrew V. Tischenko
248ab2c9cdSAndrew V. Tischenko // Forward declarations with default parameters?
258ab2c9cdSAndrew V. Tischenko template <typename T = int>
268ab2c9cdSAndrew V. Tischenko class X1;
278ab2c9cdSAndrew V. Tischenko template <typename = int>
288ab2c9cdSAndrew V. Tischenko class X2;
298ab2c9cdSAndrew V. Tischenko
308ab2c9cdSAndrew V. Tischenko // Forward declarations w/template template parameters
318ab2c9cdSAndrew V. Tischenko template <template <typename> class T>
328ab2c9cdSAndrew V. Tischenko class TTP1;
338ab2c9cdSAndrew V. Tischenko template <template <typename> class>
348ab2c9cdSAndrew V. Tischenko class TTP2;
358ab2c9cdSAndrew V. Tischenko template <template <typename X, typename Y> class T>
368ab2c9cdSAndrew V. Tischenko class TTP5;
378ab2c9cdSAndrew V. Tischenko
388ab2c9cdSAndrew V. Tischenko // Forward declarations with non-type params
398ab2c9cdSAndrew V. Tischenko template <int>
408ab2c9cdSAndrew V. Tischenko class NTP0;
418ab2c9cdSAndrew V. Tischenko template <int N>
428ab2c9cdSAndrew V. Tischenko class NTP1;
438ab2c9cdSAndrew V. Tischenko template <int N = 5>
448ab2c9cdSAndrew V. Tischenko class NTP2;
458ab2c9cdSAndrew V. Tischenko template <int = 10>
468ab2c9cdSAndrew V. Tischenko class NTP3;
478ab2c9cdSAndrew V. Tischenko template <unsigned int N = 12u>
488ab2c9cdSAndrew V. Tischenko class NTP4;
498ab2c9cdSAndrew V. Tischenko template <unsigned int = 12u>
508ab2c9cdSAndrew V. Tischenko class NTP5;
518ab2c9cdSAndrew V. Tischenko template <unsigned = 15u>
528ab2c9cdSAndrew V. Tischenko class NTP6;
538ab2c9cdSAndrew V. Tischenko template <typename T, T Obj>
548ab2c9cdSAndrew V. Tischenko class NTP7;
558ab2c9cdSAndrew V. Tischenko
568ab2c9cdSAndrew V. Tischenko // Template class declarations
578ab2c9cdSAndrew V. Tischenko template <typename T>
588ab2c9cdSAndrew V. Tischenko struct A {};
598ab2c9cdSAndrew V. Tischenko template <typename T, typename U>
608ab2c9cdSAndrew V. Tischenko struct B {};
618ab2c9cdSAndrew V. Tischenko
628ab2c9cdSAndrew V. Tischenko namespace PR6184 {
638ab2c9cdSAndrew V. Tischenko namespace N {
648ab2c9cdSAndrew V. Tischenko template <typename T>
658ab2c9cdSAndrew V. Tischenko void bar(typename T::x);
668ab2c9cdSAndrew V. Tischenko }
678ab2c9cdSAndrew V. Tischenko
688ab2c9cdSAndrew V. Tischenko template <typename T>
bar(typename T::x)698ab2c9cdSAndrew V. Tischenko void N::bar(typename T::x) {}
708ab2c9cdSAndrew V. Tischenko }
718ab2c9cdSAndrew V. Tischenko
728ab2c9cdSAndrew V. Tischenko // This PR occurred only in template parsing mode.
738ab2c9cdSAndrew V. Tischenko namespace PR17637 {
748ab2c9cdSAndrew V. Tischenko template <int>
758ab2c9cdSAndrew V. Tischenko struct L {
768ab2c9cdSAndrew V. Tischenko template <typename T>
778ab2c9cdSAndrew V. Tischenko struct O {
788ab2c9cdSAndrew V. Tischenko template <typename U>
798ab2c9cdSAndrew V. Tischenko static void Fun(U);
808ab2c9cdSAndrew V. Tischenko };
818ab2c9cdSAndrew V. Tischenko };
828ab2c9cdSAndrew V. Tischenko
838ab2c9cdSAndrew V. Tischenko template <int k>
848ab2c9cdSAndrew V. Tischenko template <typename T>
858ab2c9cdSAndrew V. Tischenko template <typename U>
Fun(U)868ab2c9cdSAndrew V. Tischenko void L<k>::O<T>::Fun(U) {}
878ab2c9cdSAndrew V. Tischenko
Instantiate()888ab2c9cdSAndrew V. Tischenko void Instantiate() { L<0>::O<int>::Fun(0); }
898ab2c9cdSAndrew V. Tischenko }
908ab2c9cdSAndrew V. Tischenko
918ab2c9cdSAndrew V. Tischenko namespace explicit_partial_specializations {
928ab2c9cdSAndrew V. Tischenko typedef char (&oneT)[1];
938ab2c9cdSAndrew V. Tischenko typedef char (&twoT)[2];
948ab2c9cdSAndrew V. Tischenko typedef char (&threeT)[3];
958ab2c9cdSAndrew V. Tischenko typedef char (&fourT)[4];
968ab2c9cdSAndrew V. Tischenko typedef char (&fiveT)[5];
978ab2c9cdSAndrew V. Tischenko typedef char (&sixT)[6];
988ab2c9cdSAndrew V. Tischenko
998ab2c9cdSAndrew V. Tischenko char one[1];
1008ab2c9cdSAndrew V. Tischenko char two[2];
1018ab2c9cdSAndrew V. Tischenko char three[3];
1028ab2c9cdSAndrew V. Tischenko char four[4];
1038ab2c9cdSAndrew V. Tischenko char five[5];
1048ab2c9cdSAndrew V. Tischenko char six[6];
1058ab2c9cdSAndrew V. Tischenko
1068ab2c9cdSAndrew V. Tischenko template <bool b>
1078ab2c9cdSAndrew V. Tischenko struct bool_ { typedef int type; };
1088ab2c9cdSAndrew V. Tischenko template <>
1098ab2c9cdSAndrew V. Tischenko struct bool_<false> {};
1108ab2c9cdSAndrew V. Tischenko
1118ab2c9cdSAndrew V. Tischenko #define XCAT(x, y) x##y
1128ab2c9cdSAndrew V. Tischenko #define CAT(x, y) XCAT(x, y)
1138ab2c9cdSAndrew V. Tischenko #define sassert(_b_) bool_<(_b_)>::type CAT(var, __LINE__);
1148ab2c9cdSAndrew V. Tischenko
1158ab2c9cdSAndrew V. Tischenko template <int>
1168ab2c9cdSAndrew V. Tischenko struct L {
1178ab2c9cdSAndrew V. Tischenko template <typename T>
1188ab2c9cdSAndrew V. Tischenko struct O {
1198ab2c9cdSAndrew V. Tischenko template <typename U>
1208ab2c9cdSAndrew V. Tischenko static oneT Fun(U);
1218ab2c9cdSAndrew V. Tischenko };
1228ab2c9cdSAndrew V. Tischenko };
1238ab2c9cdSAndrew V. Tischenko template <int k>
1248ab2c9cdSAndrew V. Tischenko template <typename T>
1258ab2c9cdSAndrew V. Tischenko template <typename U>
Fun(U)1268ab2c9cdSAndrew V. Tischenko oneT L<k>::O<T>::Fun(U) { return one; }
1278ab2c9cdSAndrew V. Tischenko
1288ab2c9cdSAndrew V. Tischenko template <>
1298ab2c9cdSAndrew V. Tischenko template <>
1308ab2c9cdSAndrew V. Tischenko template <typename U>
Fun(U)1318ab2c9cdSAndrew V. Tischenko oneT L<0>::O<char>::Fun(U) { return one; }
1328ab2c9cdSAndrew V. Tischenko
Instantiate()1338ab2c9cdSAndrew V. Tischenko void Instantiate() {
1348ab2c9cdSAndrew V. Tischenko sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one));
1358ab2c9cdSAndrew V. Tischenko sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one));
1368ab2c9cdSAndrew V. Tischenko }
1378ab2c9cdSAndrew V. Tischenko }
1388ab2c9cdSAndrew V. Tischenko
1398ab2c9cdSAndrew V. Tischenko template <class>
1408ab2c9cdSAndrew V. Tischenko struct Foo {
1418ab2c9cdSAndrew V. Tischenko template <class _Other>
1428ab2c9cdSAndrew V. Tischenko using rebind_alloc = _Other;
1438ab2c9cdSAndrew V. Tischenko };
1448ab2c9cdSAndrew V. Tischenko template <class _Alloc>
1458ab2c9cdSAndrew V. Tischenko struct _Wrap_alloc {
1468ab2c9cdSAndrew V. Tischenko template <class _Other>
1478ab2c9cdSAndrew V. Tischenko using rebind_alloc = typename Foo<_Alloc>::template rebind_alloc<_Other>;
1488ab2c9cdSAndrew V. Tischenko template <class>
1498ab2c9cdSAndrew V. Tischenko using rebind = _Wrap_alloc;
1508ab2c9cdSAndrew V. Tischenko };
1518ab2c9cdSAndrew V. Tischenko _Wrap_alloc<int>::rebind<int> w;
1528ab2c9cdSAndrew V. Tischenko
1538ab2c9cdSAndrew V. Tischenko // CHECK: Miscellaneous Ungrouped Timers
154*6264b0d6SBjorn Pettersson // CHECK-DAG: LLVM IR Generation Time
155*6264b0d6SBjorn Pettersson // CHECK-DAG: Code Generation Time
1568ab2c9cdSAndrew V. Tischenko // CHECK: Total
1578ab2c9cdSAndrew V. Tischenko // CHECK: Clang front-end time report
1588ab2c9cdSAndrew V. Tischenko // CHECK: Clang front-end timer
1598ab2c9cdSAndrew V. Tischenko // CHECK: Total
160