libstdc++: Fix CTAD for debug sequence containers

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.
This commit is contained in:
Jonathan Wakely 2021-08-17 18:19:27 +01:00
parent c883d1dcde
commit 085c2f8f0e
4 changed files with 24 additions and 4 deletions

View 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
@ -668,6 +668,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>

View 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)
{ }
@ -854,6 +854,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>

View 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
@ -921,6 +921,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>

View File

@ -181,7 +181,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
@ -811,6 +811,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