[llvm] [cross-project-tests][DebugInfo] Make simplified-template-names test runnable on Darwin (PR #168725)
Michael Buch via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 07:40:24 PST 2025
https://github.com/Michael137 created https://github.com/llvm/llvm-project/pull/168725
The test was failing on Darwin for two reasons:
1. `-fdebug-type-sections` is not a recognized flag on Darwin
2. We fail to reconstitute the name if the template parameter has a type that has a preferred_name. With LLDB tuning the type of such a parameter is a typedef (not a canonical type that the typedef points to)
This patch addresses (1). Which means we can at least XFAIL the test.
To fix (2) we might need to make the `DWARFTypePrinter` aware of non-canonical `DW_AT_type`s of template parameters.
>From c23070b214ff22e06b1fd76bdf953aba126e10c3 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Wed, 19 Nov 2025 15:32:19 +0000
Subject: [PATCH] [cross-project-tests][DebugInfo] Make
simplified-template-names test runnable on Darwin
---
.../Inputs/simplified_template_names.cpp | 272 +++++++++++++
...simplified_template_names-debug-types.test | 9 +
.../simplified_template_names.cpp | 360 ------------------
.../simplified_template_names.test | 6 +
4 files changed, 287 insertions(+), 360 deletions(-)
create mode 100644 cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/Inputs/simplified_template_names.cpp
create mode 100644 cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names-debug-types.test
delete mode 100644 cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
create mode 100644 cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.test
diff --git a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/Inputs/simplified_template_names.cpp b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/Inputs/simplified_template_names.cpp
new file mode 100644
index 0000000000000..344005ee98141
--- /dev/null
+++ b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/Inputs/simplified_template_names.cpp
@@ -0,0 +1,272 @@
+#include <cstddef>
+#include <cstdint>
+template <typename... Ts> struct t1 {};
+template <typename... Ts> struct t2;
+struct udt {};
+namespace ns {
+struct udt {};
+namespace inner {
+template <typename T> struct ttp {};
+struct udt {};
+} // namespace inner
+template <template <typename> class T> void ttp_user() {}
+enum Enumeration : int { Enumerator1, Enumerator2, Enumerator3 = 1 };
+enum class EnumerationClass { Enumerator1, Enumerator2, Enumerator3 = 1 };
+enum : int { AnonEnum1, AnonEnum2, AnonEnum3 = 1 };
+enum EnumerationSmall : unsigned char { kNeg = 0xff };
+} // namespace ns
+template <typename... Ts> void f1() {
+ t1<Ts...> v1;
+ t2<Ts...> *v2;
+}
+template <bool b, int i> void f2() {}
+template <typename T, T... A> void f3() {}
+template <typename T, unsigned = 3> void f4() {}
+template <typename T, bool b = false> struct t3 {};
+extern template class t3<int>;
+template class t3<int>;
+struct outer_class {
+ struct inner_class {};
+};
+int i = 3;
+template <unsigned N> struct t4 {};
+namespace {
+struct t5 {};
+enum LocalEnum { LocalEnum1 };
+} // namespace
+template <typename... T1, typename T2 = int> void f5() {}
+template <typename T1, typename... T2> void f6() {}
+struct t6 {
+ template <typename T> void operator<<(int) {}
+ template <typename T> void operator<(int) {}
+ template <typename T> void operator<=(int) {}
+ template <typename T = int> operator t1<float> *() { return nullptr; }
+ template <typename T> void operator-(int) {}
+ template <typename T> void operator*(int) {}
+ template <typename T> void operator/(int) {}
+ template <typename T> void operator%(int) {}
+ template <typename T> void operator^(int) {}
+ template <typename T> void operator&(int) {}
+ template <typename T> void operator|(int) {}
+ template <typename T> void operator~() {}
+ template <typename T> void operator!() {}
+ template <typename T> void operator=(int) {}
+ template <typename T> void operator>(int) {}
+ template <typename T> void operator,(int) {}
+ template <typename T> void operator()() {}
+ template <typename T> void operator[](int) {}
+ template <typename T> void operator<=>(int) {}
+ template <typename T> void *operator new(std::size_t, T) {
+ __builtin_unreachable();
+ }
+ template <typename T> void operator delete(void *, T) {}
+ template <typename T> void *operator new[](std::size_t, T) {
+ __builtin_unreachable();
+ }
+ template <typename T> void operator delete[](void *, T) {}
+ template <typename T> int operator co_await() { __builtin_unreachable(); }
+};
+void operator"" _suff(unsigned long long) {}
+template <template <typename...> class T> void f7() {}
+template <template <typename...> class T, typename T2> void f8() {}
+template <typename T> struct t7;
+using t7i = t7<int>;
+template <typename T> struct __attribute__((__preferred_name__(t7i))) t7 {};
+struct t8 {
+ void mem();
+};
+namespace ns {
+inline namespace inl {
+template <typename T> struct t9 {};
+} // namespace inl
+} // namespace ns
+template <typename T> void (*f9())() { return nullptr; }
+struct t10 {
+ template <typename T = void> t10() {}
+};
+
+template <typename T> void operator_not_really() {}
+
+template <typename T, T... A> struct t11 {};
+
+struct t12 {
+ t11<LocalEnum, LocalEnum1> v1;
+};
+
+template <decltype(ns::AnonEnum1)> void f10() {}
+
+int main() {
+ struct {
+ } A;
+ auto L = [] {};
+ f1<int>();
+ f1<float>();
+ f1<bool>();
+ f1<double>();
+ f1<long>();
+ f1<short>();
+ f1<unsigned>();
+ f1<unsigned long long>();
+ f1<long long>();
+ f1<udt>();
+ f1<ns::udt>();
+ f1<ns::udt *>();
+ f1<ns::inner::udt>();
+ f1<t1<int>>();
+ f1<int, float>();
+ f1<int *>();
+ f1<int &>();
+ f1<int &&>();
+ f1<const int>();
+ f1<int[3]>();
+ f1<void>();
+ f1<outer_class::inner_class>();
+ f1<unsigned long>();
+ f2<true, 3>();
+ f3<ns::Enumeration, ns::Enumerator3, (ns::Enumeration)2>();
+ f3<ns::EnumerationClass, ns::EnumerationClass::Enumerator3,
+ (ns::EnumerationClass)2>();
+ f3<ns::EnumerationSmall, ns::kNeg>();
+ f3<decltype(ns::AnonEnum1), ns::AnonEnum3, (decltype(ns::AnonEnum1))2>();
+ f3<LocalEnum, LocalEnum1>();
+ f3<int *, &i>();
+ f3<int *, nullptr>();
+ t4<3> v2;
+ f3<unsigned long, 1>();
+ f3<unsigned long long, 1>();
+ f3<long, 1>();
+ f3<unsigned int, 1>();
+ f3<short, 1>();
+ f3<unsigned char, (char)0>();
+ f3<signed char, (char)0>();
+ f3<unsigned short, 1, 2>();
+ f3<char, 0, 1, 6, 7, 13, 14, 31, 32, 33, (char)127, (char)128>();
+ f3<__int128, ((__int128)9223372036854775807) * 2>();
+ f4<unsigned int>();
+ f1<t3<int>>();
+ f1<t3<t3<int>>>();
+ f1<decltype(L)>();
+ t3<decltype(L)> v1;
+ f1<t3<t3<decltype(L)>>>();
+ f1<int(float)>();
+ f1<void(...)>();
+ f1<void(int, ...)>();
+ f1<const int &>();
+ f1<const int *&>();
+ f1<t5>();
+ f1<decltype(nullptr)>();
+ f1<long *, long *>();
+ f1<long *, udt *>();
+ f1<void *const>();
+ f1<const void *const *>();
+ f1<void()>();
+ f1<void (*)()>();
+ f1<decltype(&L)>();
+ f1<decltype(A)>();
+ f1<decltype(&A)>();
+ f5<t1<int>>();
+ f5<>();
+ f6<t1<int>>();
+ f1<>();
+ f1<const void *, const void *>();
+ f1<t1<int *> *>();
+ f1<int *[]>();
+ t6 v6;
+ v6.operator<< <int>(1);
+ v6.operator< <int>(1);
+ v6.operator<= <int>(1);
+ v6.operator t1<float> *();
+ v6.operator- <int>(3);
+ v6.operator* <int>(3);
+ v6.operator/ <int>(3);
+ v6.operator% <int>(3);
+ v6.operator^ <int>(3);
+ v6.operator& <int>(3);
+ v6.operator| <int>(3);
+ v6.operator~ <int>();
+ v6.operator! <int>();
+ v6.operator= <int>(3);
+ v6.operator><int>(3);
+ v6.operator, <int>(3);
+ v6.operator()<int>();
+ v6.operator[]<int>(3);
+ v6.operator<=> <int>(3);
+ t6::operator new(0, 0);
+ t6::operator new[](0, 0);
+ t6::operator delete(nullptr, 0);
+ t6::operator delete[](nullptr, 0);
+ v6.operator co_await <int>();
+ 42_suff;
+ struct t7 {};
+ f1<t7>();
+ f1<int (&)[3]>();
+ f1<int (*)[3]>();
+ f7<t1>();
+ f8<t1, int>();
+ using namespace ns;
+ ttp_user<inner::ttp>();
+ f1<int *, decltype(nullptr) *>();
+ t7i x;
+ f1<t7i>();
+ f7<ns::inl::t9>();
+ f1<_Atomic(int)>();
+ f1<int, long, volatile char>();
+ f1<__attribute__((__vector_size__(sizeof(int) * 2))) int>();
+ f1<int *const volatile>();
+ f1<const volatile void>();
+ f1<t1<decltype(L)>>();
+ t10 v3;
+ f1<void (::udt::*)() const>();
+ f1<void (::udt::*)() volatile &>();
+ f1<void (::udt::*)() const volatile &&>();
+ f9<int>();
+ f1<void (*const)()>();
+ f1<char const(&)[1]>();
+ f1<void() const &>();
+ f1<void() volatile &&>();
+ f1<void() const volatile>();
+ f1<int *const[1]>();
+ f1<int *const(&)[1]>();
+ f1<void (::udt::*const &)()>();
+ f1<void (*(int))(float)>();
+ f1<t1<int>[1]>();
+ f1<void (*)() noexcept>();
+ f1<void(decltype(A))>();
+ struct t8 {
+ decltype(A) m;
+ };
+ f1<void(t8, decltype(A))>();
+ f1<void(t8)>();
+ operator_not_really<int>();
+ t12 v4;
+ f1<_BitInt(3)>();
+ f1<const unsigned _BitInt(5)>();
+ f1<void(t1<>, t1<>)>();
+ f1<int t1<>::*>();
+ void fcc() __attribute__((swiftcall));
+ f1<decltype(fcc)>();
+ int fnrt() __attribute__((noreturn));
+ f1<decltype(fnrt)>();
+ f10<ns::AnonEnum1>();
+}
+void t8::mem() {
+ struct t7 {};
+ f1<t7>();
+ f1<decltype(&t8::mem)>();
+}
+namespace complex_type_units {
+void external_function();
+namespace {
+struct internal_type;
+}
+template <void (*)() = external_function> struct t2;
+template <typename = t2<>> class t3 {};
+template <typename = internal_type, typename = t3<>> struct t4 {};
+struct t5 {
+ t4<> v1;
+};
+void f1() {
+ t5 v1;
+ t3<> v2;
+}
+} // namespace complex_type_units
diff --git a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names-debug-types.test b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names-debug-types.test
new file mode 100644
index 0000000000000..74ce8f466b9ae
--- /dev/null
+++ b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names-debug-types.test
@@ -0,0 +1,9 @@
+// debug-types are not available for MachO.
+//
+// UNSUPPORTED: system-darwin
+//
+// RUN: %clang %target_itanium_abi_host_triple %p/Inputs/simplified_template_names.cpp -c -o - -gdwarf-4 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -fdebug-types-section \
+// RUN: | llvm-dwarfdump --verify -
+//
+// RUN: %clang %target_itanium_abi_host_triple %p/Inputs/simplified_template_names.cpp -c -o - -gdwarf-5 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -fdebug-types-section \
+// RUN: | llvm-dwarfdump --verify -
diff --git a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
deleted file mode 100644
index 956c7e37f0225..0000000000000
--- a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
+++ /dev/null
@@ -1,360 +0,0 @@
-// UNSUPPORTED: system-darwin
-// 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 \
-// RUN: | llvm-dwarfdump --verify -
-// 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 \
-// RUN: | llvm-dwarfdump --verify -
-// 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 \
-// RUN: | llvm-dwarfdump --verify -
-// 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 \
-// RUN: | llvm-dwarfdump --verify -
-
-#include <cstdint>
-#include <cstddef>
-template<typename ...Ts>
-struct t1 {
-};
-template<typename ...Ts>
-struct t2;
-struct udt {
-};
-namespace ns {
-struct udt {
-};
-namespace inner {
-template<typename T> struct ttp { };
-struct udt { };
-}
-template<template<typename> class T>
-void ttp_user() { }
-enum Enumeration : int { Enumerator1, Enumerator2, Enumerator3 = 1 };
-enum class EnumerationClass { Enumerator1, Enumerator2, Enumerator3 = 1 };
-enum : int { AnonEnum1, AnonEnum2, AnonEnum3 = 1 };
-enum EnumerationSmall : unsigned char { kNeg = 0xff };
-}
-template <typename... Ts>
-void f1() {
- t1<Ts...> v1;
- t2<Ts...> *v2;
-}
-template<bool b, int i>
-void f2() {
-}
-template<typename T, T ...A>
-void f3() {
-}
-template<typename T, unsigned = 3>
-void f4() {
-}
-template<typename T, bool b = false>
-struct t3 { };
-extern template class t3<int>;
-template class t3<int>;
-struct outer_class {
- struct inner_class {
- };
-};
-int i = 3;
-template<unsigned N>
-struct t4 { };
-namespace {
-struct t5 { };
-enum LocalEnum { LocalEnum1 };
-}
-template<typename ...T1, typename T2 = int>
-void f5() { }
-template<typename T1, typename ...T2>
-void f6() { }
-struct t6 {
- template<typename T>
- void operator<<(int) {
- }
- template<typename T>
- void operator<(int) {
- }
- template<typename T>
- void operator<=(int) {
- }
- template<typename T = int>
- operator t1<float>*() {
- return nullptr;
- }
- template<typename T>
- void operator-(int) {
- }
- template<typename T>
- void operator*(int) {
- }
- template<typename T>
- void operator/(int) {
- }
- template<typename T>
- void operator%(int) {
- }
- template<typename T>
- void operator^(int) {
- }
- template<typename T>
- void operator&(int) {
- }
- template<typename T>
- void operator|(int) {
- }
- template<typename T>
- void operator~() {
- }
- template<typename T>
- void operator!() {
- }
- template<typename T>
- void operator=(int) {
- }
- template<typename T>
- void operator>(int) {
- }
- template<typename T>
- void operator,(int) {
- }
- template<typename T>
- void operator()() {
- }
- template<typename T>
- void operator[](int) {
- }
- template<typename T>
- void operator<=>(int) {
- }
- template<typename T>
- void* operator new(std::size_t, T) {
- __builtin_unreachable();
- }
- template<typename T>
- void operator delete(void*, T) {
- }
- template<typename T>
- void* operator new[](std::size_t, T) {
- __builtin_unreachable();
- }
- template<typename T>
- void operator delete[](void*, T) {
- }
- template<typename T>
- int operator co_await() { __builtin_unreachable(); }
-
-};
-void operator"" _suff(unsigned long long) {}
-template<template<typename...> class T> void f7() { }
-template<template<typename...> class T, typename T2> void f8() { }
-template<typename T>
-struct t7;
-using t7i = t7<int>;
-template<typename T>
-struct
-__attribute__((__preferred_name__(t7i)))
-t7 {
-};
-struct t8 {
- void mem();
-};
-namespace ns {
-inline namespace inl {
-template<typename T> struct t9 { };
-}
-}
-template<typename T>
-void (*f9())() {
- return nullptr;
-}
-struct t10 {
- template<typename T = void>
- t10() { }
-};
-
-template<typename T>
-void operator_not_really() {
-}
-
-template<typename T, T ...A>
-struct t11 {
-};
-
-struct t12 {
- t11<LocalEnum, LocalEnum1> v1;
-};
-
-template<decltype(ns::AnonEnum1)>
-void f10() {
-}
-
-int main() {
- struct { } A;
- auto L = []{};
- f1<int>();
- f1<float>();
- f1<bool>();
- f1<double>();
- f1<long>();
- f1<short>();
- f1<unsigned>();
- f1<unsigned long long>();
- f1<long long>();
- f1<udt>();
- f1<ns::udt>();
- f1<ns::udt*>();
- f1<ns::inner::udt>();
- f1<t1<int>>();
- f1<int, float>();
- f1<int *>();
- f1<int &>();
- f1<int &&>();
- f1<const int>();
- f1<int[3]>();
- f1<void>();
- f1<outer_class::inner_class>();
- f1<unsigned long>();
- f2<true, 3>();
- f3<ns::Enumeration, ns::Enumerator3, (ns::Enumeration)2>();
- f3<ns::EnumerationClass, ns::EnumerationClass::Enumerator3, (ns::EnumerationClass)2>();
- f3<ns::EnumerationSmall, ns::kNeg>();
- f3<decltype(ns::AnonEnum1), ns::AnonEnum3, (decltype(ns::AnonEnum1))2>();
- f3<LocalEnum, LocalEnum1>();
- f3<int*, &i>();
- f3<int*, nullptr>();
- t4<3> v2;
- f3<unsigned long, 1>();
- f3<unsigned long long, 1>();
- f3<long, 1>();
- f3<unsigned int, 1>();
- f3<short, 1>();
- f3<unsigned char, (char)0>();
- f3<signed char, (char)0>();
- f3<unsigned short, 1, 2>();
- f3<char, 0, 1, 6, 7, 13, 14, 31, 32, 33, (char)127, (char)128>();
- f3<__int128, ((__int128)9223372036854775807) * 2>();
- f4<unsigned int>();
- f1<t3<int>>();
- f1<t3<t3<int>>>();
- f1<decltype(L)>();
- t3<decltype(L)> v1;
- f1<t3<t3<decltype(L)>>>();
- f1<int(float)>();
- f1<void(...)>();
- f1<void(int, ...)>();
- f1<const int &>();
- f1<const int *&>();
- f1<t5>();
- f1<decltype(nullptr)>();
- f1<long*, long*>();
- f1<long*, udt*>();
- f1<void *const>();
- f1<const void *const *>();
- f1<void()>();
- f1<void(*)()>();
- f1<decltype(&L)>();
- f1<decltype(A)>();
- f1<decltype(&A)>();
- f5<t1<int>>();
- f5<>();
- f6<t1<int>>();
- f1<>();
- f1<const void*, const void*>();
- f1<t1<int*>*>();
- f1<int *[]>();
- t6 v6;
- v6.operator<< <int>(1);
- v6.operator< <int>(1);
- v6.operator<= <int>(1);
- v6.operator t1<float>*();
- v6.operator- <int>(3);
- v6.operator* <int>(3);
- v6.operator/ <int>(3);
- v6.operator% <int>(3);
- v6.operator^ <int>(3);
- v6.operator& <int>(3);
- v6.operator| <int>(3);
- v6.operator~ <int>();
- v6.operator! <int>();
- v6.operator= <int>(3);
- v6.operator> <int>(3);
- v6.operator, <int>(3);
- v6.operator() <int>();
- v6.operator[] <int>(3);
- v6.operator<=> <int>(3);
- t6::operator new(0, 0);
- t6::operator new[](0, 0);
- t6::operator delete(nullptr, 0);
- t6::operator delete[](nullptr, 0);
- v6.operator co_await<int>();
- 42_suff;
- struct t7 { };
- f1<t7>();
- f1<int(&)[3]>();
- f1<int(*)[3]>();
- f7<t1>();
- f8<t1, int>();
- using namespace ns;
- ttp_user<inner::ttp>();
- f1<int*, decltype(nullptr)*>();
- t7i x;
- f1<t7i>();
- f7<ns::inl::t9>();
- f1<_Atomic(int)>();
- f1<int, long, volatile char>();
- f1<__attribute__((__vector_size__(sizeof(int) * 2))) int>();
- f1<int *const volatile>();
- f1<const volatile void>();
- f1<t1<decltype(L)>>();
- t10 v3;
- f1<void (::udt::*)() const>();
- f1<void (::udt::*)() volatile &>();
- f1<void (::udt::*)() const volatile &&>();
- f9<int>();
- f1<void (*const)()>();
- f1<char const (&)[1]>();
- f1<void () const &>();
- f1<void () volatile &&>();
- f1<void () const volatile>();
- f1<int *const[1]>();
- f1<int *const(&)[1]>();
- f1<void (::udt::* const&)()>();
- f1<void (*(int))(float)>();
- f1<t1<int>[1]>();
- f1<void (*)() noexcept>();
- f1<void (decltype(A))>();
- struct t8 { decltype(A) m; };
- f1<void(t8, decltype(A))>();
- f1<void(t8)>();
- operator_not_really<int>();
- t12 v4;
- f1<_BitInt(3)>();
- f1<const unsigned _BitInt(5)>();
- f1<void(t1<>, t1<>)>();
- f1<int t1<>::*>();
- void fcc() __attribute__((swiftcall));
- f1<decltype(fcc)>();
- int fnrt() __attribute__((noreturn));
- f1<decltype(fnrt)>();
- f10<ns::AnonEnum1>();
-}
-void t8::mem() {
- struct t7 { };
- f1<t7>();
- f1<decltype(&t8::mem)>();
-}
-namespace complex_type_units {
-void external_function();
-namespace {
-struct internal_type;
-}
-template <void (*)() = external_function> struct t2;
-template <typename = t2<>> class t3 {};
-template <typename = internal_type, typename = t3<>>
-struct t4 {
-};
-struct t5 {
- t4<> v1;
-};
-void f1() {
- t5 v1;
- t3<> v2;
-}
-}
diff --git a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.test b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.test
new file mode 100644
index 0000000000000..0adb2403db304
--- /dev/null
+++ b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.test
@@ -0,0 +1,6 @@
+// XFAIL: system-darwin
+// RUN: %clang %target_itanium_abi_host_triple %p/Inputs/simplified_template_names.cpp -c -o - -gdwarf-4 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -gtemplate-alias \
+// RUN: | llvm-dwarfdump --verify -
+//
+// RUN: %clang %target_itanium_abi_host_triple %p/Inputs/simplified_template_names.cpp -c -o - -gdwarf-4 -Xclang -gsimple-template-names=mangled -Xclang -debug-forward-template-params -std=c++20 -gmlt -fdebug-info-for-profiling -gtemplate-alias \
+// RUN: | llvm-dwarfdump --verify -
More information about the llvm-commits
mailing list