Hi!

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.

Tested on x86_64-linux, ok for trunk?

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.

--- libstdc++-v3/include/bits/indirect.h.jj     2026-04-24 14:30:10.752144148 
+0200
+++ libstdc++-v3/include/bits/indirect.h        2026-07-16 11:24:31.563762066 
+0200
@@ -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>);
--- libstdc++-v3/testsuite/std/memory/indirect/specialization.cc.jj     
2026-07-16 11:57:09.678788363 +0200
+++ libstdc++-v3/testsuite/std/memory/indirect/specialization.cc        
2026-07-16 12:41:25.312399734 +0200
@@ -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" }
--- libstdc++-v3/testsuite/std/memory/polymorphic/specialization.cc.jj  
2026-07-16 11:57:09.679876265 +0200
+++ libstdc++-v3/testsuite/std/memory/polymorphic/specialization.cc     
2026-07-16 12:41:35.006279624 +0200
@@ -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" }

        Jakub

Reply via email to