]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix CTAD for debug sequence containers
authorJonathan Wakely <jwakely@redhat.com>
Tue, 17 Aug 2021 17:19:27 +0000 (18:19 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 12 Oct 2021 10:45:45 +0000 (11:45 +0100)
This fixes some 23_containers/*/cons/deduction.cc failures seen with
-std=c++17/-D_GLIBCXX_DEBUG, caused by non-immediate errors when
substituting template arguments into an incorrect specialization of the
std::__cxx1998 base class. This happens because the size_type member of
the debug container is _Base_type::size_type, so is non-deducible, and
the deduced types get substituted into _Base_type, triggering the
static_assert that checks the allocator's value_type matches the
container's.

The solution is to make the C(size_type, const T&, const Alloc&)
constructors of the debug sequence containers non-deducible. In order to
make CTAD work again deduction guides that use std::size_t for the first
argument are added.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* include/debug/deque (deque(size_type, const T&, const A&)):
Prevent class template argument deduction and replace with a
deduction guide.
* include/debug/forward_list (forward_list(size_type, const T&, const A&)):
Likewise.
* include/debug/list (list(size_type, const T&, const A&)):
Likewise.
* include/debug/vector (vector(size_type, const T&, const A&)):
Likewise.

(cherry picked from commit 085c2f8f0e13d7c1515ce86755a52a31faf0cf47)

libstdc++-v3/include/debug/deque
libstdc++-v3/include/debug/forward_list
libstdc++-v3/include/debug/list
libstdc++-v3/include/debug/vector

index 227d083da0476848cfae04d842feda97371e04d9..4d19ec8f5fbbf495822e40d023cc85aec96c19fe 100644 (file)
@@ -130,7 +130,7 @@ namespace __debug
       deque(size_type __n, const _Allocator& __a = _Allocator())
       : _Base(__n, __a) { }
 
-      deque(size_type __n, const _Tp& __value,
+      deque(size_type __n, const __type_identity_t<_Tp>& __value,
            const _Allocator& __a = _Allocator())
       : _Base(__n, __value, __a) { }
 #else
@@ -650,6 +650,11 @@ namespace __debug
           typename = _RequireAllocator<_Allocator>>
     deque(_InputIterator, _InputIterator, _Allocator = _Allocator())
       -> deque<_ValT, _Allocator>;
+
+  template<typename _Tp, typename _Allocator = allocator<_Tp>,
+          typename = _RequireAllocator<_Allocator>>
+    deque(size_t, _Tp, _Allocator = _Allocator())
+      -> deque<_Tp, _Allocator>;
 #endif
 
   template<typename _Tp, typename _Alloc>
index 16f0531dce70a7b593a511616215e7bdecbf6e53..46e8eb90916a59b0645f97528a1fd8d7a466a5f9 100644 (file)
@@ -251,7 +251,7 @@ namespace __debug
       : _Base(__n, __al)
       { }
 
-      forward_list(size_type __n, const _Tp& __value,
+      forward_list(size_type __n, const __type_identity_t<_Tp>& __value,
                   const allocator_type& __al = allocator_type())
       : _Base(__n, __value, __al)
       { }
@@ -843,6 +843,11 @@ namespace __debug
           typename = _RequireAllocator<_Allocator>>
     forward_list(_InputIterator, _InputIterator, _Allocator = _Allocator())
       -> forward_list<_ValT, _Allocator>;
+
+  template<typename _Tp, typename _Allocator = allocator<_Tp>,
+          typename = _RequireAllocator<_Allocator>>
+    forward_list(size_t, _Tp, _Allocator = _Allocator())
+      -> forward_list<_Tp, _Allocator>;
 #endif
 
   template<typename _Tp, typename _Alloc>
index 01fe43fc7df960ce5a603fa53f1d98a9bd9496e9..5e0adad3aead875f4cf571ea49758d9d5f7e8f89 100644 (file)
@@ -135,7 +135,7 @@ namespace __debug
       list(size_type __n, const allocator_type& __a = allocator_type())
       : _Base(__n, __a) { }
 
-      list(size_type __n, const _Tp& __value,
+      list(size_type __n, const __type_identity_t<_Tp>& __value,
           const _Allocator& __a = _Allocator())
       : _Base(__n, __value, __a) { }
 #else
@@ -905,6 +905,11 @@ namespace __debug
           typename = _RequireAllocator<_Allocator>>
     list(_InputIterator, _InputIterator, _Allocator = _Allocator())
       -> list<_ValT, _Allocator>;
+
+  template<typename _Tp, typename _Allocator = allocator<_Tp>,
+          typename = _RequireAllocator<_Allocator>>
+    list(size_t, _Tp, _Allocator = _Allocator())
+      -> list<_Tp, _Allocator>;
 #endif
 
   template<typename _Tp, typename _Alloc>
index 987bba17c2b83027bbc486e9a02f82e523c657fa..c6bdc3458eb5ce222cba2d5feace3a96f21ef233 100644 (file)
@@ -182,7 +182,7 @@ namespace __debug
       vector(size_type __n, const _Allocator& __a = _Allocator())
       : _Base(__n, __a), _Safe_vector(__n) { }
 
-      vector(size_type __n, const _Tp& __value,
+      vector(size_type __n, const __type_identity_t<_Tp>& __value,
             const _Allocator& __a = _Allocator())
       : _Base(__n, __value, __a) { }
 #else
@@ -793,6 +793,11 @@ namespace __debug
           typename = _RequireAllocator<_Allocator>>
     vector(_InputIterator, _InputIterator, _Allocator = _Allocator())
       -> vector<_ValT, _Allocator>;
+
+  template<typename _Tp, typename _Allocator = allocator<_Tp>,
+          typename = _RequireAllocator<_Allocator>>
+    vector(size_t, _Tp, _Allocator = _Allocator())
+      -> vector<_Tp, _Allocator>;
 #endif
 
 } // namespace __debug