1 // RUN: %clang %target_itanium_abi_host_triple %s -c -o - -gdwarf-4 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 \
2 // RUN:   | llvm-dwarfdump --verify -
3 // RUN: %clang %target_itanium_abi_host_triple %s -c -o - -gdwarf-4 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -fdebug-types-section \
4 // RUN:   | llvm-dwarfdump --verify -
5 // RUN: %clang %target_itanium_abi_host_triple %s -c -o - -gdwarf-5 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -fdebug-types-section \
6 // RUN:   | llvm-dwarfdump --verify -
7 #include <cstdint>
8 template<typename ...Ts>
9 struct t1 {
10 };
11 template<typename ...Ts>
12 struct t2;
13 struct udt {
14 };
15 namespace ns {
16 struct udt {
17 };
18 namespace inner {
19 template<typename T> struct ttp { };
20 struct udt { };
21 }
22 template<template<typename> class T>
23 void ttp_user() { }
24 enum Enumeration { Enumerator1, Enumerator2, Enumerator3 = 1 };
25 enum class EnumerationClass { Enumerator1, Enumerator2, Enumerator3 = 1 };
26 enum { AnonEnum1, AnonEnum2, AnonEnum3 = 1 };
27 enum EnumerationSmall : unsigned char { kNeg = 0xff };
28 }
29 template <typename... Ts>
30 void f1() {
31   t1<Ts...> v1;
32   t2<Ts...> *v2;
33 }
34 template<bool b, int i>
35 void f2() {
36 }
37 template<typename T, T ...A>
38 void f3() {
39 }
40 template<typename T, unsigned = 3>
41 void f4() {
42 }
43 template<typename T, bool b = false>
44 struct t3 { };
45 extern template class t3<int>;
46 template class t3<int>;
47 struct outer_class {
48   struct inner_class {
49   };
50 };
51 int i = 3;
52 template<unsigned N>
53 struct t4 { };
54 namespace {
55 struct t5 { };
56 }
57 template<typename ...T1, typename T2 = int>
58 void f5() { }
59 template<typename T1, typename ...T2>
60 void f6() { }
61 struct t6 {
62   template<typename T>
63   void operator<<(int) {
64   }
65   template<typename T>
66   void operator<(int) {
67   }
68   template<typename T>
69   void operator<=(int) {
70   }
71   template<typename T = int>
72   operator t1<float>*() {
73     return nullptr;
74   }
75   template<typename T>
76   void operator-(int) {
77   }
78   template<typename T>
79   void operator*(int) {
80   }
81   template<typename T>
82   void operator/(int) {
83   }
84   template<typename T>
85   void operator%(int) {
86   }
87   template<typename T>
88   void operator^(int) {
89   }
90   template<typename T>
91   void operator&(int) {
92   }
93   template<typename T>
94   void operator|(int) {
95   }
96   template<typename T>
97   void operator~() {
98   }
99   template<typename T>
100   void operator!() {
101   }
102   template<typename T>
103   void operator=(int) {
104   }
105   template<typename T>
106   void operator>(int) {
107   }
108   template<typename T>
109   void operator,(int) {
110   }
111   template<typename T>
112   void operator()() {
113   }
114   template<typename T>
115   void operator[](int) {
116   }
117   template<typename T>
118   void operator<=>(int) {
119   }
120   template<typename T>
121   void* operator new(std::size_t, T) {
122     __builtin_unreachable();
123   }
124   template<typename T>
125   void operator delete(void*, T) {
126   }
127   template<typename T>
128   void* operator new[](std::size_t, T) {
129     __builtin_unreachable();
130   }
131   template<typename T>
132   void operator delete[](void*, T) {
133   }
134   template<typename T>
135   int operator co_await() { __builtin_unreachable(); }
136 
137 };
138 void operator"" _suff(unsigned long long) {}
139 template<template<typename...> class T> void f7() { }
140 template<template<typename...> class T, typename T2> void f8() { }
141 template<typename T>
142 struct t7;
143 using t7i = t7<int>;
144 template<typename T>
145 struct
146 __attribute__((__preferred_name__(t7i)))
147 t7 {
148 };
149 struct t8 {
150   void mem();
151 };
152 namespace ns {
153 inline namespace inl {
154 template<typename T> struct t9 { };
155 }
156 }
157 template<typename T>
158 void (*f9())() {
159   return nullptr;
160 }
161 struct t10 {
162   template<typename T = void>
163   t10() { }
164 };
165 
166 template<typename T>
167 void operator_not_really() {
168 }
169 
170 int main() {
171   struct { } A;
172   auto L = []{};
173   f1<int>();
174   f1<float>();
175   f1<bool>();
176   f1<double>();
177   f1<long>();
178   f1<short>();
179   f1<unsigned>();
180   f1<unsigned long long>();
181   f1<long long>();
182   f1<udt>();
183   f1<ns::udt>();
184   f1<ns::udt*>();
185   f1<ns::inner::udt>();
186   f1<t1<int>>();
187   f1<int, float>();
188   f1<int *>();
189   f1<int &>();
190   f1<int &&>();
191   f1<const int>();
192   f1<int[3]>();
193   f1<void>();
194   f1<outer_class::inner_class>();
195   f1<unsigned long>();
196   f2<true, 3>();
197   f3<ns::Enumeration, ns::Enumerator3, (ns::Enumeration)2>();
198   f3<ns::EnumerationClass, ns::EnumerationClass::Enumerator3, (ns::EnumerationClass)2>();
199   f3<ns::EnumerationSmall, ns::kNeg>();
200   f3<decltype(ns::AnonEnum1), ns::AnonEnum3, (decltype(ns::AnonEnum1))2>();
201   f3<int*, &i>();
202   f3<int*, nullptr>();
203   t4<3> v2;
204   f3<unsigned long, 1>();
205   f3<unsigned long long, 1>();
206   f3<long, 1>();
207   f3<unsigned int, 1>();
208   f3<short, 1>();
209   f3<unsigned char, (char)0>();
210   f3<signed char, (char)0>();
211   f3<unsigned short, 1, 2>();
212   f3<char, 0, 1, 6, 7, 13, 14, 31, 32, 33, (char)127, (char)128>();
213   f3<__int128, ((__int128)9223372036854775807) * 2>();
214   f4<unsigned int>();
215   f1<t3<int>>();
216   f1<t3<t3<int>>>();
217   f1<decltype(L)>();
218   t3<decltype(L)> v1;
219   f1<int(float)>();
220   f1<const int &>();
221   f1<const int *&>();
222   f1<t5>();
223   f1<decltype(nullptr)>();
224   f1<long*, long*>();
225   f1<long*, udt*>();
226   f1<void *const>();
227   f1<const void *const *>();
228   f1<void()>();
229   f1<void(*)()>();
230   f1<decltype(&L)>();
231   f1<decltype(A)>();
232   f1<decltype(&A)>();
233   f5<t1<int>>();
234   f5<>();
235   f6<t1<int>>();
236   f1<>();
237   f1<const void*, const void*>();
238   f1<t1<int*>*>();
239   f1<int *[]>();
240   t6 v6;
241   v6.operator<< <int>(1);
242   v6.operator< <int>(1);
243   v6.operator<= <int>(1);
244   v6.operator t1<float>*();
245   v6.operator- <int>(3);
246   v6.operator* <int>(3);
247   v6.operator/ <int>(3);
248   v6.operator% <int>(3);
249   v6.operator^ <int>(3);
250   v6.operator& <int>(3);
251   v6.operator| <int>(3);
252   v6.operator~ <int>();
253   v6.operator! <int>();
254   v6.operator= <int>(3);
255   v6.operator> <int>(3);
256   v6.operator, <int>(3);
257   v6.operator() <int>();
258   v6.operator[] <int>(3);
259   v6.operator<=> <int>(3);
260   t6::operator new(0, 0);
261   t6::operator new[](0, 0);
262   t6::operator delete(nullptr, 0);
263   t6::operator delete[](nullptr, 0);
264   v6.operator co_await<int>();
265   42_suff;
266   struct t7 { };
267   f1<t7>();
268   f1<int(&)[3]>();
269   f1<int(*)[3]>();
270   f7<t1>();
271   f8<t1, int>();
272   using namespace ns;
273   ttp_user<inner::ttp>();
274   f1<int*, decltype(nullptr)*>();
275   t7i x;
276   f1<t7i>();
277   f7<ns::inl::t9>();
278   f1<_Atomic(int)>();
279   f1<int, long, volatile char>();
280   f1<__attribute__((__vector_size__(sizeof(int) * 2))) int>();
281   f1<int *const volatile>();
282   f1<const volatile void>();
283   f1<t1<decltype(L)>>();
284   t10 v3;
285   f1<void (::udt::*)() const>();
286   f1<void (::udt::*)() volatile &>();
287   f1<void (::udt::*)() const volatile &&>();
288   f9<int>();
289   f1<void (*const)()>();
290   f1<char const (&)[1]>();
291   f1<void () const &>();
292   f1<void () volatile &&>();
293   f1<void () const volatile>();
294   f1<int *const[1]>();
295   f1<int *const(&)[1]>();
296   f1<void (::udt::* const&)()>();
297   f1<void (*(int))(float)>();
298   f1<t1<int>[1]>();
299   f1<void (*)() noexcept>();
300   f1<void (decltype(A))>();
301   struct t8 { decltype(A) m; };
302   f1<void(t8, decltype(A))>();
303   f1<void(t8)>();
304   operator_not_really<int>();
305 }
306 void t8::mem() {
307   struct t7 { };
308   f1<t7>();
309   f1<decltype(&t8::mem)>();
310 }
311