• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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