Currently the definition of the C++ template "__is_specialization_of"
is inside the header file "std/format".
I propose two reasons to move this to "bits/utility.h":
(1) To avoid code duplication, as other parts of libstdc++ may need it
in the future. Currently my implementation of "std::chimeric_ptr"
requires it.
(2) At some point, "std::is_specialization_of" will be added to
libstdc++, so again we want to avoid code duplication.
Note that when it's moved from 'std/format' to 'bits/utility.h', it
needs to be protected with "if __cplusplus >= 201402L".
Here is the patch:
>From 76712db0fd1c7ab8c9067b344e6e3398ae3a053c Mon Sep 17 00:00:00 2001
From: Thomas PK Healy
Date: Thu, 8 Jan 2026 10:34:03 +0000
Subject: [PATCH] Relocate __is_specialization_of to bits/utility.h header
---
libstdc++-v3/include/bits/utility.h | 7 +++++++
libstdc++-v3/include/std/format | 6 ------
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/libstdc++-v3/include/bits/utility.h
b/libstdc++-v3/include/bits/utility.h
index bd6b18d54dd3f..ec70d495587ea 100644
--- a/libstdc++-v3/include/bits/utility.h
+++ b/libstdc++-v3/include/bits/utility.h
@@ -329,6 +329,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline constexpr bool __is_nontype_v<nontype_t<__val>> = true;
#endif
+#if __cplusplus >= 201402L
+ template<typename _Tp, template<typename...> class _Class>
+ constexpr bool __is_specialization_of = false;
+ template<template<typename...> class _Class, typename... _Args>
+ constexpr bool __is_specialization_of<_Class<_Args...>, _Class> = true;
+#endif
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 2e4463c65969b..50315c6e9a778 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -427,12 +427,6 @@ namespace __format
size_t _M_num_args = 0;
};
-/// @cond undocumented
- template<typename _Tp, template<typename...> class _Class>
- constexpr bool __is_specialization_of = false;
- template<template<typename...> class _Class, typename... _Args>
- constexpr bool __is_specialization_of<_Class<_Args...>, _Class> = true;
-
namespace __format
{
// pre: first != last