1 // RUN: %clang_cc1 %s -emit-llvm -o - -ftime-report 2>&1 | FileCheck %s
2 // RUN: %clang_cc1 %s -emit-llvm -o - -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING -ftime-report 2>&1 | FileCheck %s
3
4 // Template function declarations
5 template <typename T>
6 void foo();
7 template <typename T, typename U>
8 void foo();
9
10 // Template function definitions.
11 template <typename T>
foo()12 void foo() {}
13
14 // Template class (forward) declarations
15 template <typename T>
16 struct A;
17 template <typename T, typename U>
18 struct b;
19 template <typename>
20 struct C;
21 template <typename, typename>
22 struct D;
23
24 // Forward declarations with default parameters?
25 template <typename T = int>
26 class X1;
27 template <typename = int>
28 class X2;
29
30 // Forward declarations w/template template parameters
31 template <template <typename> class T>
32 class TTP1;
33 template <template <typename> class>
34 class TTP2;
35 template <template <typename X, typename Y> class T>
36 class TTP5;
37
38 // Forward declarations with non-type params
39 template <int>
40 class NTP0;
41 template <int N>
42 class NTP1;
43 template <int N = 5>
44 class NTP2;
45 template <int = 10>
46 class NTP3;
47 template <unsigned int N = 12u>
48 class NTP4;
49 template <unsigned int = 12u>
50 class NTP5;
51 template <unsigned = 15u>
52 class NTP6;
53 template <typename T, T Obj>
54 class NTP7;
55
56 // Template class declarations
57 template <typename T>
58 struct A {};
59 template <typename T, typename U>
60 struct B {};
61
62 namespace PR6184 {
63 namespace N {
64 template <typename T>
65 void bar(typename T::x);
66 }
67
68 template <typename T>
bar(typename T::x)69 void N::bar(typename T::x) {}
70 }
71
72 // This PR occurred only in template parsing mode.
73 namespace PR17637 {
74 template <int>
75 struct L {
76 template <typename T>
77 struct O {
78 template <typename U>
79 static void Fun(U);
80 };
81 };
82
83 template <int k>
84 template <typename T>
85 template <typename U>
Fun(U)86 void L<k>::O<T>::Fun(U) {}
87
Instantiate()88 void Instantiate() { L<0>::O<int>::Fun(0); }
89 }
90
91 namespace explicit_partial_specializations {
92 typedef char (&oneT)[1];
93 typedef char (&twoT)[2];
94 typedef char (&threeT)[3];
95 typedef char (&fourT)[4];
96 typedef char (&fiveT)[5];
97 typedef char (&sixT)[6];
98
99 char one[1];
100 char two[2];
101 char three[3];
102 char four[4];
103 char five[5];
104 char six[6];
105
106 template <bool b>
107 struct bool_ { typedef int type; };
108 template <>
109 struct bool_<false> {};
110
111 #define XCAT(x, y) x##y
112 #define CAT(x, y) XCAT(x, y)
113 #define sassert(_b_) bool_<(_b_)>::type CAT(var, __LINE__);
114
115 template <int>
116 struct L {
117 template <typename T>
118 struct O {
119 template <typename U>
120 static oneT Fun(U);
121 };
122 };
123 template <int k>
124 template <typename T>
125 template <typename U>
Fun(U)126 oneT L<k>::O<T>::Fun(U) { return one; }
127
128 template <>
129 template <>
130 template <typename U>
Fun(U)131 oneT L<0>::O<char>::Fun(U) { return one; }
132
Instantiate()133 void Instantiate() {
134 sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one));
135 sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one));
136 }
137 }
138
139 template <class>
140 struct Foo {
141 template <class _Other>
142 using rebind_alloc = _Other;
143 };
144 template <class _Alloc>
145 struct _Wrap_alloc {
146 template <class _Other>
147 using rebind_alloc = typename Foo<_Alloc>::template rebind_alloc<_Other>;
148 template <class>
149 using rebind = _Wrap_alloc;
150 };
151 _Wrap_alloc<int>::rebind<int> w;
152
153 // CHECK: Miscellaneous Ungrouped Timers
154 // CHECK-DAG: LLVM IR Generation Time
155 // CHECK-DAG: Code Generation Time
156 // CHECK: Total
157 // CHECK: Clang front-end time report
158 // CHECK: Clang front-end timer
159 // CHECK: Total
160