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)
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
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>
: _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)
{ }
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>
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
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>
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
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