https://gcc.gnu.org/g:4598d7fcbde6dd87274a91a247134ba3c12be0cd

commit r17-807-g4598d7fcbde6dd87274a91a247134ba3c12be0cd
Author: Jonathan Wakely <[email protected]>
Date:   Thu May 21 18:58:14 2026 +0100

    libstdc++: Add missing constraints to vector and deque deduction guides
    
    The standard requires that these deduction guides are constrained to
    only accept a type that qualifies as an allocator for the second
    templates argument.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/stl_deque.h: Add missing constraint on allocator
            type in deduction guide.
            * include/bits/stl_vector.h: Likewise.
            * include/debug/deque: Likewise.
            * include/debug/vector: Likewise.
            * testsuite/23_containers/deque/cons/deduction_c++23.cc: Check
            that deduction fails for a type which does not qualify as an
            allocator.
            * testsuite/23_containers/vector/cons/deduction_c++23.cc:
            Likewise.
    
    Reviewed-by: Tomasz KamiƄski <[email protected]>

Diff:
---
 libstdc++-v3/include/bits/stl_deque.h                      |  2 +-
 libstdc++-v3/include/bits/stl_vector.h                     |  2 +-
 libstdc++-v3/include/debug/deque                           |  2 +-
 libstdc++-v3/include/debug/vector                          |  2 +-
 .../testsuite/23_containers/deque/cons/deduction_c++23.cc  | 14 ++++++++++++++
 .../testsuite/23_containers/vector/cons/deduction_c++23.cc | 14 ++++++++++++++
 6 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/bits/stl_deque.h 
b/libstdc++-v3/include/bits/stl_deque.h
index aebe865ffc1a..28f61d2ccd37 100644
--- a/libstdc++-v3/include/bits/stl_deque.h
+++ b/libstdc++-v3/include/bits/stl_deque.h
@@ -2414,7 +2414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
 #if __glibcxx_containers_ranges // C++ >= 23
   template<ranges::input_range _Rg,
-          typename _Alloc = allocator<ranges::range_value_t<_Rg>>>
+          __allocator_like _Alloc = allocator<ranges::range_value_t<_Rg>>>
     deque(from_range_t, _Rg&&, _Alloc = _Alloc())
       -> deque<ranges::range_value_t<_Rg>, _Alloc>;
 #endif
diff --git a/libstdc++-v3/include/bits/stl_vector.h 
b/libstdc++-v3/include/bits/stl_vector.h
index 0c9b74fdbb24..9ddf35502e69 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -2383,7 +2383,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
 #if __glibcxx_containers_ranges // C++ >= 23
   template<ranges::input_range _Rg,
-          typename _Alloc = allocator<ranges::range_value_t<_Rg>>>
+          __allocator_like _Alloc = allocator<ranges::range_value_t<_Rg>>>
     vector(from_range_t, _Rg&&, _Alloc = _Alloc())
       -> vector<ranges::range_value_t<_Rg>, _Alloc>;
 #endif
diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque
index 9fba4ffc4997..00b4220051e7 100644
--- a/libstdc++-v3/include/debug/deque
+++ b/libstdc++-v3/include/debug/deque
@@ -715,7 +715,7 @@ namespace __debug
 
 #if __glibcxx_containers_ranges // C++ >= 23
   template<ranges::input_range _Rg,
-          typename _Alloc = allocator<ranges::range_value_t<_Rg>>>
+          __allocator_like _Alloc = allocator<ranges::range_value_t<_Rg>>>
     deque(from_range_t, _Rg&&, _Alloc = _Alloc())
       -> deque<ranges::range_value_t<_Rg>, _Alloc>;
 #endif
diff --git a/libstdc++-v3/include/debug/vector 
b/libstdc++-v3/include/debug/vector
index 61e5ff78a7a4..56645d1e92c3 100644
--- a/libstdc++-v3/include/debug/vector
+++ b/libstdc++-v3/include/debug/vector
@@ -1001,7 +1001,7 @@ namespace __debug
 
 #if __glibcxx_containers_ranges // C++ >= 23
   template<ranges::input_range _Rg,
-          typename _Alloc = allocator<ranges::range_value_t<_Rg>>>
+          __allocator_like _Alloc = allocator<ranges::range_value_t<_Rg>>>
     vector(from_range_t, _Rg&&, _Alloc = _Alloc())
       -> vector<ranges::range_value_t<_Rg>, _Alloc>;
 #endif
diff --git a/libstdc++-v3/testsuite/23_containers/deque/cons/deduction_c++23.cc 
b/libstdc++-v3/testsuite/23_containers/deque/cons/deduction_c++23.cc
new file mode 100644
index 000000000000..5893de92dc6f
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/cons/deduction_c++23.cc
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++23 } }
+
+#include <deque>
+#include <testsuite_iterators.h>
+
+using Range = __gnu_test::test_input_range<int>;
+
+template<typename Alloc>
+concept can_deduce_deque = requires(Range r, Alloc a) {
+  std::deque(std::from_range, r, a);
+};
+
+// Deduction should fail because int does not qualify as an allocator.
+static_assert( ! can_deduce_deque<int> );
diff --git 
a/libstdc++-v3/testsuite/23_containers/vector/cons/deduction_c++23.cc 
b/libstdc++-v3/testsuite/23_containers/vector/cons/deduction_c++23.cc
new file mode 100644
index 000000000000..1a442a8ed5c2
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/cons/deduction_c++23.cc
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++23 } }
+
+#include <vector>
+#include <testsuite_iterators.h>
+
+using Range = __gnu_test::test_input_range<int>;
+
+template<typename Alloc>
+concept can_deduce_vector = requires(Range r, Alloc a) {
+  std::vector(std::from_range, r, a);
+};
+
+// Deduction should fail because int does not qualify as an allocator.
+static_assert( ! can_deduce_vector<int> );

Reply via email to