1// UNSUPPORTED: system-darwin
2// 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 \
3// RUN: | llvm-dwarfdump --verify -
4// 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 -gmlt -fdebug-info-for-profiling \
5// RUN: | llvm-dwarfdump --verify -
6// 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 \
7// RUN: | llvm-dwarfdump --verify -
8// 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 \
9// RUN: | llvm-dwarfdump --verify -
10
11#include <cstdint>
12#include <cstddef>
13template<typename ...Ts>
14struct t1 {
15};
16template<typename ...Ts>
17struct t2;
18struct udt {
19};
20namespace ns {
21struct udt {
22};
23namespace inner {
24template<typename T> struct ttp { };
25struct udt { };
26}
27template<template<typename> class T>
28void ttp_user() { }
29enum Enumeration : int { Enumerator1, Enumerator2, Enumerator3 = 1 };
30enum class EnumerationClass { Enumerator1, Enumerator2, Enumerator3 = 1 };
31enum : int { AnonEnum1, AnonEnum2, AnonEnum3 = 1 };
32enum EnumerationSmall : unsigned char { kNeg = 0xff };
33}
34template <typename... Ts>
35void f1() {
36 t1<Ts...> v1;
37 t2<Ts...> *v2;
38}
39template<bool b, int i>
40void f2() {
41}
42template<typename T, T ...A>
43void f3() {
44}
45template<typename T, unsigned = 3>
46void f4() {
47}
48template<typename T, bool b = false>
49struct t3 { };
50extern template class t3<int>;
51template class t3<int>;
52struct outer_class {
53 struct inner_class {
54 };
55};
56int i = 3;
57template<unsigned N>
58struct t4 { };
59namespace {
60struct t5 { };
61enum LocalEnum { LocalEnum1 };
62}
63template<typename ...T1, typename T2 = int>
64void f5() { }
65template<typename T1, typename ...T2>
66void f6() { }
67struct t6 {
68 template<typename T>
69 void operator<<(int) {
70 }
71 template<typename T>
72 void operator<(int) {
73 }
74 template<typename T>
75 void operator<=(int) {
76 }
77 template<typename T = int>
78 operator t1<float>*() {
79 return nullptr;
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&(int) {
98 }
99 template<typename T>
100 void operator|(int) {
101 }
102 template<typename T>
103 void operator~() {
104 }
105 template<typename T>
106 void operator!() {
107 }
108 template<typename T>
109 void operator=(int) {
110 }
111 template<typename T>
112 void operator>(int) {
113 }
114 template<typename T>
115 void operator,(int) {
116 }
117 template<typename T>
118 void operator()() {
119 }
120 template<typename T>
121 void operator[](int) {
122 }
123 template<typename T>
124 void operator<=>(int) {
125 }
126 template<typename T>
127 void* operator new(std::size_t, T) {
128 __builtin_unreachable();
129 }
130 template<typename T>
131 void operator delete(void*, T) {
132 }
133 template<typename T>
134 void* operator new[](std::size_t, T) {
135 __builtin_unreachable();
136 }
137 template<typename T>
138 void operator delete[](void*, T) {
139 }
140 template<typename T>
141 int operator co_await() { __builtin_unreachable(); }
142
143};
144void operator"" _suff(unsigned long long) {}
145template<template<typename...> class T> void f7() { }
146template<template<typename...> class T, typename T2> void f8() { }
147template<typename T>
148struct t7;
149using t7i = t7<int>;
150template<typename T>
151struct
152__attribute__((__preferred_name__(t7i)))
153t7 {
154};
155struct t8 {
156 void mem();
157};
158namespace ns {
159inline namespace inl {
160template<typename T> struct t9 { };
161}
162}
163template<typename T>
164void (*f9())() {
165 return nullptr;
166}
167struct t10 {
168 template<typename T = void>
169 t10() { }
170};
171
172template<typename T>
173void operator_not_really() {
174}
175
176template<typename T, T ...A>
177struct t11 {
178};
179
180struct t12 {
181 t11<LocalEnum, LocalEnum1> v1;
182};
183
184template<decltype(ns::AnonEnum1)>
185void f10() {
186}
187
188int main() {
189 struct { } A;
190 auto L = []{};
191 f1<int>();
192 f1<float>();
193 f1<bool>();
194 f1<double>();
195 f1<long>();
196 f1<short>();
197 f1<unsigned>();
198 f1<unsigned long long>();
199 f1<long long>();
200 f1<udt>();
201 f1<ns::udt>();
202 f1<ns::udt*>();
203 f1<ns::inner::udt>();
204 f1<t1<int>>();
205 f1<int, float>();
206 f1<int *>();
207 f1<int &>();
208 f1<int &&>();
209 f1<const int>();
210 f1<int[3]>();
211 f1<void>();
212 f1<outer_class::inner_class>();
213 f1<unsigned long>();
214 f2<true, 3>();
215 f3<ns::Enumeration, ns::Enumerator3, (ns::Enumeration)2>();
216 f3<ns::EnumerationClass, ns::EnumerationClass::Enumerator3, (ns::EnumerationClass)2>();
217 f3<ns::EnumerationSmall, ns::kNeg>();
218 f3<decltype(ns::AnonEnum1), ns::AnonEnum3, (decltype(ns::AnonEnum1))2>();
219 f3<LocalEnum, LocalEnum1>();
220 f3<int*, &i>();
221 f3<int*, nullptr>();
222 t4<3> v2;
223 f3<unsigned long, 1>();
224 f3<unsigned long long, 1>();
225 f3<long, 1>();
226 f3<unsigned int, 1>();
227 f3<short, 1>();
228 f3<unsigned char, (char)0>();
229 f3<signed char, (char)0>();
230 f3<unsigned short, 1, 2>();
231 f3<char, 0, 1, 6, 7, 13, 14, 31, 32, 33, (char)127, (char)128>();
232 f3<__int128, ((__int128)9223372036854775807) * 2>();
233 f4<unsigned int>();
234 f1<t3<int>>();
235 f1<t3<t3<int>>>();
236 f1<decltype(L)>();
237 t3<decltype(L)> v1;
238 f1<t3<t3<decltype(L)>>>();
239 f1<int(float)>();
240 f1<void(...)>();
241 f1<void(int, ...)>();
242 f1<const int &>();
243 f1<const int *&>();
244 f1<t5>();
245 f1<decltype(nullptr)>();
246 f1<long*, long*>();
247 f1<long*, udt*>();
248 f1<void *const>();
249 f1<const void *const *>();
250 f1<void()>();
251 f1<void(*)()>();
252 f1<decltype(&L)>();
253 f1<decltype(A)>();
254 f1<decltype(&A)>();
255 f5<t1<int>>();
256 f5<>();
257 f6<t1<int>>();
258 f1<>();
259 f1<const void*, const void*>();
260 f1<t1<int*>*>();
261 f1<int *[]>();
262 t6 v6;
263 v6.operator<< <int>(1);
264 v6.operator< <int>(1);
265 v6.operator<= <int>(1);
266 v6.operator t1<float>*();
267 v6.operator- <int>(3);
268 v6.operator* <int>(3);
269 v6.operator/ <int>(3);
270 v6.operator% <int>(3);
271 v6.operator^ <int>(3);
272 v6.operator& <int>(3);
273 v6.operator| <int>(3);
274 v6.operator~ <int>();
275 v6.operator! <int>();
276 v6.operator= <int>(3);
277 v6.operator> <int>(3);
278 v6.operator, <int>(3);
279 v6.operator() <int>();
280 v6.operator[] <int>(3);
281 v6.operator<=> <int>(3);
282 t6::operator new(0, 0);
283 t6::operator new[](0, 0);
284 t6::operator delete(nullptr, 0);
285 t6::operator delete[](nullptr, 0);
286 v6.operator co_await<int>();
287 42_suff;
288 struct t7 { };
289 f1<t7>();
290 f1<int(&)[3]>();
291 f1<int(*)[3]>();
292 f7<t1>();
293 f8<t1, int>();
294 using namespace ns;
295 ttp_user<inner::ttp>();
296 f1<int*, decltype(nullptr)*>();
297 t7i x;
298 f1<t7i>();
299 f7<ns::inl::t9>();
300 f1<_Atomic(int)>();
301 f1<int, long, volatile char>();
302 f1<__attribute__((__vector_size__(sizeof(int) * 2))) int>();
303 f1<int *const volatile>();
304 f1<const volatile void>();
305 f1<t1<decltype(L)>>();
306 t10 v3;
307 f1<void (::udt::*)() const>();
308 f1<void (::udt::*)() volatile &>();
309 f1<void (::udt::*)() const volatile &&>();
310 f9<int>();
311 f1<void (*const)()>();
312 f1<char const (&)[1]>();
313 f1<void () const &>();
314 f1<void () volatile &&>();
315 f1<void () const volatile>();
316 f1<int *const[1]>();
317 f1<int *const(&)[1]>();
318 f1<void (::udt::* const&)()>();
319 f1<void (*(int))(float)>();
320 f1<t1<int>[1]>();
321 f1<void (*)() noexcept>();
322 f1<void (decltype(A))>();
323 struct t8 { decltype(A) m; };
324 f1<void(t8, decltype(A))>();
325 f1<void(t8)>();
326 operator_not_really<int>();
327 t12 v4;
328 f1<_BitInt(3)>();
329 f1<const unsigned _BitInt(5)>();
330 f1<void(t1<>, t1<>)>();
331 f1<int t1<>::*>();
332 void fcc() __attribute__((swiftcall));
333 f1<decltype(fcc)>();
334 int fnrt() __attribute__((noreturn));
335 f1<decltype(fnrt)>();
336 f10<ns::AnonEnum1>();
337}
338void t8::mem() {
339 struct t7 { };
340 f1<t7>();
341 f1<decltype(&t8::mem)>();
342}
343namespace complex_type_units {
344void external_function();
345namespace {
346struct internal_type;
347}
348template <void (*)() = external_function> struct t2;
349template <typename = t2<>> class t3 {};
350template <typename = internal_type, typename = t3<>>
351struct t4 {
352};
353struct t5 {
354 t4<> v1;
355};
356void f1() {
357 t5 v1;
358 t3<> v2;
359}
360}
361

source code of cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp