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