[gcc r17-2453] libstdc++: Mark std::indirect and std::polymorphic with _GLIBCXX_NO_SPECIALIZATIONS [PR120635]
Jakub Jelinek
jakub@gcc.gnu.org
Thu Jul 16 11:59:41 GMT 2026
https://gcc.gnu.org/g:874605e8c44ca4823cedb2881cdbd91f38cff5bc
commit r17-2453-g874605e8c44ca4823cedb2881cdbd91f38cff5bc
Author: Jakub Jelinek <jakub@redhat.com>
Date: Thu Jul 16 13:58:52 2026 +0200
libstdc++: Mark std::indirect and std::polymorphic with _GLIBCXX_NO_SPECIALIZATIONS [PR120635]
The following marks these two templates with [[_Clang::no_specializations]]
because the P3019R14 paper which introduced them already added the
restrictions that they shouldn't be specialized by users.
I think I'll defer the rest to others (i.e. P2652R2 - std::allocator_traits,
P0912R5 - std::coroutine_handle and LWG4535 - <simd>).
2026-07-16 Jakub Jelinek <jakub@redhat.com>
PR c++/120635
* include/bits/indirect.h (std::indirect, std::polymorphic): Add
_GLIBCXX_NO_SPECIALIZATIONS.
* testsuite/std/memory/indirect/specialization.cc: New test.
* testsuite/std/memory/polymorphic/specialization.cc: New test.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Diff:
---
libstdc++-v3/include/bits/indirect.h | 4 ++--
.../testsuite/std/memory/indirect/specialization.cc | 13 +++++++++++++
.../testsuite/std/memory/polymorphic/specialization.cc | 13 +++++++++++++
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/libstdc++-v3/include/bits/indirect.h b/libstdc++-v3/include/bits/indirect.h
index 5be6713eaf3f..cb6e9535a8e1 100644
--- a/libstdc++-v3/include/bits/indirect.h
+++ b/libstdc++-v3/include/bits/indirect.h
@@ -68,7 +68,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// [indirect], class template indirect
template<typename _Tp, typename _Alloc>
- class indirect
+ class _GLIBCXX_NO_SPECIALIZATIONS indirect
{
static_assert(is_object_v<_Tp>);
static_assert(!is_array_v<_Tp>);
@@ -467,7 +467,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// [polymorphic], class template polymorphic
template<typename _Tp, typename _Alloc>
- class polymorphic
+ class _GLIBCXX_NO_SPECIALIZATIONS polymorphic
{
static_assert(is_object_v<_Tp>);
static_assert(!is_array_v<_Tp>);
diff --git a/libstdc++-v3/testsuite/std/memory/indirect/specialization.cc b/libstdc++-v3/testsuite/std/memory/indirect/specialization.cc
new file mode 100644
index 000000000000..4a32975238b5
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/memory/indirect/specialization.cc
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++26 } }
+
+#include <memory>
+
+struct A {};
+template<typename T>
+struct B {};
+
+template<>
+class std::indirect<A, std::pmr::polymorphic_allocator <A>> {}; // { dg-error "cannot be specialized" }
+
+template<typename T>
+class std::indirect<B<T>, std::pmr::polymorphic_allocator <B<T>>> {}; // { dg-error "cannot be specialized" }
diff --git a/libstdc++-v3/testsuite/std/memory/polymorphic/specialization.cc b/libstdc++-v3/testsuite/std/memory/polymorphic/specialization.cc
new file mode 100644
index 000000000000..2247f1b9bd1d
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/memory/polymorphic/specialization.cc
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++26 } }
+
+#include <memory>
+
+struct A {};
+template<typename T>
+struct B {};
+
+template<>
+class std::polymorphic<A, std::pmr::polymorphic_allocator <A>> {}; // { dg-error "cannot be specialized" }
+
+template<typename T>
+class std::polymorphic<B<T>, std::pmr::polymorphic_allocator <B<T>>> {}; // { dg-error "cannot be specialized" }
More information about the Libstdc++-cvs
mailing list