diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d98a591f3a3..9b876d0307d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,16 @@ 2019-03-08 François Dumont + PR libstdc++/89477 + * include/debug/map.h (map): Use _RequireNotAllocator to constrain + parameters in deduction guides. + * include/debug/multimap.h (multimap): Likewise. + * include/debug/set.h (multimap): Likewise. + * include/debug/multiset.h (multimap): Likewise. + * include/debug/unordered_map (unordered_map): Likewise. + (unordered_multimap): Likewise. + * include/debug/unordered_set (unordered_set): Likewise. + (unordered_multiset): Likewise. + PR libstdc++/89608 * include/debug/unordered_map (unordered_map<>::_M_check_rehashed): Invalidate all iterators in case of rehash. diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index 5063325cb97..80ca1bebbd2 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -700,34 +700,36 @@ namespace __debug #if __cpp_deduction_guides >= 201606 - template>, - typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, - typename = _RequireInputIter<_InputIterator>, - typename = _RequireAllocator<_Allocator>> - map(_InputIterator, _InputIterator, - _Compare = _Compare(), _Allocator = _Allocator()) - -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>, - _Compare, _Allocator>; - - template, - typename _Allocator = allocator>, - typename = _RequireAllocator<_Allocator>> - map(initializer_list>, - _Compare = _Compare(), _Allocator = _Allocator()) - -> map<_Key, _Tp, _Compare, _Allocator>; - - template >, + typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocator<_Compare>, typename = _RequireAllocator<_Allocator>> - map(_InputIterator, _InputIterator, _Allocator) - -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>, - less<__iter_key_t<_InputIterator>>, _Allocator>; + map(_InputIterator, _InputIterator, + _Compare = _Compare(), _Allocator = _Allocator()) + -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>, + _Compare, _Allocator>; - template> - map(initializer_list>, _Allocator) - -> map<_Key, _Tp, less<_Key>, _Allocator>; + template, + typename _Allocator = allocator>, + typename = _RequireNotAllocator<_Compare>, + typename = _RequireAllocator<_Allocator>> + map(initializer_list>, + _Compare = _Compare(), _Allocator = _Allocator()) + -> map<_Key, _Tp, _Compare, _Allocator>; + + template , + typename = _RequireAllocator<_Allocator>> + map(_InputIterator, _InputIterator, _Allocator) + -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>, + less<__iter_key_t<_InputIterator>>, _Allocator>; + + template> + map(initializer_list>, _Allocator) + -> map<_Key, _Tp, less<_Key>, _Allocator>; #endif diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 38659aaba26..560aa7dda95 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -585,6 +585,7 @@ namespace __debug typename _Compare = less<__iter_key_t<_InputIterator>>, typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocator<_Compare>, typename = _RequireAllocator<_Allocator>> multimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator()) @@ -593,6 +594,7 @@ namespace __debug template, typename _Allocator = allocator>, + typename = _RequireNotAllocator<_Compare>, typename = _RequireAllocator<_Allocator>> multimap(initializer_list>, _Compare = _Compare(), _Allocator = _Allocator()) diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 19dc8ea6a1e..8fb11f871ac 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -555,32 +555,34 @@ namespace __debug typename _Allocator = allocator::value_type>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocator<_Compare>, typename = _RequireAllocator<_Allocator>> - multiset(_InputIterator, _InputIterator, - _Compare = _Compare(), _Allocator = _Allocator()) - -> multiset::value_type, - _Compare, _Allocator>; + multiset(_InputIterator, _InputIterator, + _Compare = _Compare(), _Allocator = _Allocator()) + -> multiset::value_type, + _Compare, _Allocator>; - template, - typename _Allocator = allocator<_Key>, - typename = _RequireAllocator<_Allocator>> - multiset(initializer_list<_Key>, - _Compare = _Compare(), _Allocator = _Allocator()) - -> multiset<_Key, _Compare, _Allocator>; + template, + typename _Allocator = allocator<_Key>, + typename = _RequireNotAllocator<_Compare>, + typename = _RequireAllocator<_Allocator>> + multiset(initializer_list<_Key>, + _Compare = _Compare(), _Allocator = _Allocator()) + -> multiset<_Key, _Compare, _Allocator>; - template, - typename = _RequireAllocator<_Allocator>> - multiset(_InputIterator, _InputIterator, _Allocator) - -> multiset::value_type, - less::value_type>, - _Allocator>; + template, + typename = _RequireAllocator<_Allocator>> + multiset(_InputIterator, _InputIterator, _Allocator) + -> multiset::value_type, + less::value_type>, + _Allocator>; - template> - multiset(initializer_list<_Key>, _Allocator) - -> multiset<_Key, less<_Key>, _Allocator>; + template> + multiset(initializer_list<_Key>, _Allocator) + -> multiset<_Key, less<_Key>, _Allocator>; #endif diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 88b84905ba2..9f16a9190b8 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -567,31 +567,33 @@ namespace __debug typename _Allocator = allocator::value_type>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocator<_Compare>, typename = _RequireAllocator<_Allocator>> set(_InputIterator, _InputIterator, - _Compare = _Compare(), _Allocator = _Allocator()) - -> set::value_type, - _Compare, _Allocator>; + _Compare = _Compare(), _Allocator = _Allocator()) + -> set::value_type, + _Compare, _Allocator>; - template, - typename _Allocator = allocator<_Key>, - typename = _RequireAllocator<_Allocator>> - set(initializer_list<_Key>, - _Compare = _Compare(), _Allocator = _Allocator()) - -> set<_Key, _Compare, _Allocator>; + template, + typename _Allocator = allocator<_Key>, + typename = _RequireNotAllocator<_Compare>, + typename = _RequireAllocator<_Allocator>> + set(initializer_list<_Key>, + _Compare = _Compare(), _Allocator = _Allocator()) + -> set<_Key, _Compare, _Allocator>; - template, - typename = _RequireAllocator<_Allocator>> - set(_InputIterator, _InputIterator, _Allocator) - -> set::value_type, - less::value_type>, - _Allocator>; + template, + typename = _RequireAllocator<_Allocator>> + set(_InputIterator, _InputIterator, _Allocator) + -> set::value_type, + less::value_type>, + _Allocator>; - template> - set(initializer_list<_Key>, _Allocator) - -> set<_Key, less<_Key>, _Allocator>; + template> + set(initializer_list<_Key>, _Allocator) + -> set<_Key, less<_Key>, _Allocator>; #endif diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index 0a7485d6e18..d844ee9fa0e 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -651,6 +651,8 @@ namespace __debug typename _Pred = equal_to<__iter_key_t<_InputIterator>>, typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_map(_InputIterator, _InputIterator, typename unordered_map::size_type = {}, @@ -662,6 +664,8 @@ namespace __debug template, typename _Pred = equal_to<_Key>, typename _Allocator = allocator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_map(initializer_list>, typename unordered_map::size_type = {}, @@ -691,6 +695,7 @@ namespace __debug template, + typename = _RequireNotAllocatorOrIntegral<_Hash>, typename = _RequireAllocator<_Allocator>> unordered_map(_InputIterator, _InputIterator, typename unordered_map::size_type, @@ -712,6 +717,7 @@ namespace __debug -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; template, typename = _RequireAllocator<_Allocator>> unordered_map(initializer_list>, typename unordered_map::size_type, @@ -752,7 +758,8 @@ namespace __debug : public __gnu_debug::_Safe_container< unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>, _Alloc, __gnu_debug::_Safe_unordered_container>, - public _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc> + public _GLIBCXX_STD_C::unordered_multimap< + _Key, _Tp, _Hash, _Pred, _Alloc> { typedef _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc> _Base; @@ -1250,6 +1257,8 @@ namespace __debug typename _Pred = equal_to<__iter_key_t<_InputIterator>>, typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_multimap(_InputIterator, _InputIterator, unordered_multimap::size_type = {}, @@ -1262,6 +1271,8 @@ namespace __debug template, typename _Pred = equal_to<_Key>, typename _Allocator = allocator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_multimap(initializer_list>, unordered_multimap::size_type = {}, @@ -1290,6 +1301,7 @@ namespace __debug template, + typename = _RequireNotAllocatorOrIntegral<_Hash>, typename = _RequireAllocator<_Allocator>> unordered_multimap(_InputIterator, _InputIterator, unordered_multimap::size_type, _Hash, @@ -1311,6 +1323,7 @@ namespace __debug -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; template, typename = _RequireAllocator<_Allocator>> unordered_multimap(initializer_list>, unordered_multimap::size_type, diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index a593143aa93..ecc084e3846 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -533,12 +533,14 @@ namespace __debug template::value_type>, + hash::value_type>, typename _Pred = - equal_to::value_type>, + equal_to::value_type>, typename _Allocator = - allocator::value_type>, + allocator::value_type>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_set(_InputIterator, _InputIterator, unordered_set::size_type = {}, @@ -549,6 +551,8 @@ namespace __debug template, typename _Pred = equal_to<_Tp>, typename _Allocator = allocator<_Tp>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_set(initializer_list<_Tp>, unordered_set::size_type = {}, @@ -569,6 +573,7 @@ namespace __debug template, + typename = _RequireNotAllocatorOrIntegral<_Hash>, typename = _RequireAllocator<_Allocator>> unordered_set(_InputIterator, _InputIterator, unordered_set::size_type, @@ -586,6 +591,7 @@ namespace __debug -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; template, typename = _RequireAllocator<_Allocator>> unordered_set(initializer_list<_Tp>, unordered_set::size_type, _Hash, _Allocator) @@ -1087,12 +1093,14 @@ namespace __debug template::value_type>, + hash::value_type>, typename _Pred = - equal_to::value_type>, + equal_to::value_type>, typename _Allocator = - allocator::value_type>, + allocator::value_type>, typename = _RequireInputIter<_InputIterator>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_multiset(_InputIterator, _InputIterator, unordered_multiset::size_type = {}, @@ -1104,6 +1112,8 @@ namespace __debug template, typename _Pred = equal_to<_Tp>, typename _Allocator = allocator<_Tp>, + typename = _RequireNotAllocatorOrIntegral<_Hash>, + typename = _RequireNotAllocator<_Pred>, typename = _RequireAllocator<_Allocator>> unordered_multiset(initializer_list<_Tp>, unordered_multiset::size_type = {}, @@ -1125,6 +1135,7 @@ namespace __debug template, + typename = _RequireNotAllocatorOrIntegral<_Hash>, typename = _RequireAllocator<_Allocator>> unordered_multiset(_InputIterator, _InputIterator, unordered_multiset::size_type, @@ -1144,6 +1155,7 @@ namespace __debug -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; template, typename = _RequireAllocator<_Allocator>> unordered_multiset(initializer_list<_Tp>, unordered_multiset::size_type, _Hash, _Allocator)