From c0e865f73ddee2e7247a23a7d57ad80261861d35 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 19 Feb 2025 14:46:32 +0000 Subject: [PATCH] libstdc++: Workaround Clang bug with __array_rank built-in [PR118559] We started using the __array_rank built-in with r15-1252-g6f0dfa6f1acdf7 but that built-in is buggy in versions of Clang up to and including 19. libstdc++-v3/ChangeLog: PR libstdc++/118559 * include/std/type_traits (rank, rank_v): Do not use __array_rank for Clang 19 and older. --- libstdc++-v3/include/std/type_traits | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 33892818257..676cdf2d7e6 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1484,7 +1484,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }; /// rank -#if _GLIBCXX_USE_BUILTIN_TRAIT(__array_rank) +#if _GLIBCXX_USE_BUILTIN_TRAIT(__array_rank) \ + && (!defined(__clang__) || __clang_major__ >= 20) // PR118559 template struct rank : public integral_constant { }; @@ -3656,7 +3657,8 @@ template template inline constexpr size_t alignment_of_v = alignment_of<_Tp>::value; -#if _GLIBCXX_USE_BUILTIN_TRAIT(__array_rank) +#if _GLIBCXX_USE_BUILTIN_TRAIT(__array_rank) \ + && (!defined(__clang__) || __clang_major__ >= 20) // PR118559 template inline constexpr size_t rank_v = __array_rank(_Tp); #else