[gcc r17-2453] libstdc++: Mark std::indirect and std::polymorphic with _GLIBCXX_NO_SPECIALIZATIONS [PR120635]

Jakub Jelinek via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <20260716115941.A4D084BA5439__29968.0372163252$1784203187$gmane$org@sourceware.org>
https://gcc.gnu.org/g:874605e8c44ca4823cedb2881cdbd91f38cff5bc

commit r17-2453-g874605e8c44ca4823cedb2881cdbd91f38cff5bc
Author: Jakub Jelinek <[email protected]>
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  <[email protected]>
    
            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 <[email protected]>

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" }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.