re PR libstdc++/89477 (Incorrect CTAD deduction guides for set and multiset)
authorFrançois Dumont <fdumont@gcc.gnu.org>
Fri, 8 Mar 2019 05:53:09 +0000 (05:53 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Fri, 8 Mar 2019 05:53:09 +0000 (05:53 +0000)
2019-03-08  François Dumont  <fdumont@gcc.gnu.org>

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.

From-SVN: r269479

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/map.h
libstdc++-v3/include/debug/multimap.h
libstdc++-v3/include/debug/multiset.h
libstdc++-v3/include/debug/set.h
libstdc++-v3/include/debug/unordered_map
libstdc++-v3/include/debug/unordered_set

index d98a591f3a36edbb2cbc9024795d772c0401526c..9b876d0307dcca443454811db50803b3add219be 100644 (file)
@@ -1,5 +1,16 @@
 2019-03-08  François Dumont  <fdumont@gcc.gnu.org>
 
+       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.
index 5063325cb971a57ad418524bc5ad5e8f2f8c7b8c..80ca1bebbd2e3a027ba170c82e4d38aded34379d 100644 (file)
@@ -700,34 +700,36 @@ namespace __debug
 
 #if __cpp_deduction_guides >= 201606
 
- template<typename _InputIterator,
-         typename _Compare = less<__iter_key_t<_InputIterator>>,
-         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 _Key, typename _Tp, typename _Compare = less<_Key>,
-         typename _Allocator = allocator<pair<const _Key, _Tp>>,
-         typename = _RequireAllocator<_Allocator>>
-   map(initializer_list<pair<_Key, _Tp>>,
-       _Compare = _Compare(), _Allocator = _Allocator())
-   -> map<_Key, _Tp, _Compare, _Allocator>;
-
- template <typename _InputIterator, typename _Allocator,
+  template<typename _InputIterator,
+          typename _Compare = less<__iter_key_t<_InputIterator>>,
+          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>;
-
- template<typename _Key, typename _Tp, typename _Allocator,
-         typename = _RequireAllocator<_Allocator>>
-   map(initializer_list<pair<_Key, _Tp>>, _Allocator)
-   -> map<_Key, _Tp, less<_Key>, _Allocator>;
+    map(_InputIterator, _InputIterator,
+       _Compare = _Compare(), _Allocator = _Allocator())
+    -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>,
+          _Compare, _Allocator>;
+
+  template<typename _Key, typename _Tp, typename _Compare = less<_Key>,
+          typename _Allocator = allocator<pair<const _Key, _Tp>>,
+          typename = _RequireNotAllocator<_Compare>,
+          typename = _RequireAllocator<_Allocator>>
+    map(initializer_list<pair<_Key, _Tp>>,
+       _Compare = _Compare(), _Allocator = _Allocator())
+    -> map<_Key, _Tp, _Compare, _Allocator>;
+
+  template <typename _InputIterator, typename _Allocator,
+           typename = _RequireInputIter<_InputIterator>,
+           typename = _RequireAllocator<_Allocator>>
+    map(_InputIterator, _InputIterator, _Allocator)
+    -> map<__iter_key_t<_InputIterator>, __iter_val_t<_InputIterator>,
+          less<__iter_key_t<_InputIterator>>, _Allocator>;
+
+  template<typename _Key, typename _Tp, typename _Allocator,
+          typename = _RequireAllocator<_Allocator>>
+    map(initializer_list<pair<_Key, _Tp>>, _Allocator)
+    -> map<_Key, _Tp, less<_Key>, _Allocator>;
 
 #endif
 
index 38659aaba26f7a0f91aa12083cf96808d1e0eace..560aa7dda9512ae01cddb849c1a0008f3c172b60 100644 (file)
@@ -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 _Key, typename _Tp, typename _Compare = less<_Key>,
           typename _Allocator = allocator<pair<const _Key, _Tp>>,
+          typename = _RequireNotAllocator<_Compare>,
           typename = _RequireAllocator<_Allocator>>
     multimap(initializer_list<pair<_Key, _Tp>>,
             _Compare = _Compare(), _Allocator = _Allocator())
index 19dc8ea6a1e0bdf9015d90f0ddeec9fc9e0b9f88..8fb11f871ac9d38640292340e7fe13595c7f7fc5 100644 (file)
@@ -555,32 +555,34 @@ namespace __debug
           typename _Allocator =
             allocator<typename iterator_traits<_InputIterator>::value_type>,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocator<_Compare>,
           typename = _RequireAllocator<_Allocator>>
-   multiset(_InputIterator, _InputIterator,
-           _Compare = _Compare(), _Allocator = _Allocator())
-   -> multiset<typename iterator_traits<_InputIterator>::value_type,
-              _Compare, _Allocator>;
-
- template<typename _Key,
-         typename _Compare = less<_Key>,
-         typename _Allocator = allocator<_Key>,
-         typename = _RequireAllocator<_Allocator>>
-   multiset(initializer_list<_Key>,
-           _Compare = _Compare(), _Allocator = _Allocator())
-   -> multiset<_Key, _Compare, _Allocator>;
-
- template<typename _InputIterator, typename _Allocator,
-         typename = _RequireInputIter<_InputIterator>,
-         typename = _RequireAllocator<_Allocator>>
-   multiset(_InputIterator, _InputIterator, _Allocator)
-   -> multiset<typename iterator_traits<_InputIterator>::value_type,
-              less<typename iterator_traits<_InputIterator>::value_type>,
-              _Allocator>;
-
- template<typename _Key, typename _Allocator,
-         typename = _RequireAllocator<_Allocator>>
-   multiset(initializer_list<_Key>, _Allocator)
-   -> multiset<_Key, less<_Key>, _Allocator>;
+    multiset(_InputIterator, _InputIterator,
+            _Compare = _Compare(), _Allocator = _Allocator())
+    -> multiset<typename iterator_traits<_InputIterator>::value_type,
+               _Compare, _Allocator>;
+
+  template<typename _Key,
+          typename _Compare = less<_Key>,
+          typename _Allocator = allocator<_Key>,
+          typename = _RequireNotAllocator<_Compare>,
+          typename = _RequireAllocator<_Allocator>>
+    multiset(initializer_list<_Key>,
+            _Compare = _Compare(), _Allocator = _Allocator())
+    -> multiset<_Key, _Compare, _Allocator>;
+
+  template<typename _InputIterator, typename _Allocator,
+          typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireAllocator<_Allocator>>
+    multiset(_InputIterator, _InputIterator, _Allocator)
+    -> multiset<typename iterator_traits<_InputIterator>::value_type,
+               less<typename iterator_traits<_InputIterator>::value_type>,
+               _Allocator>;
+
+  template<typename _Key, typename _Allocator,
+          typename = _RequireAllocator<_Allocator>>
+    multiset(initializer_list<_Key>, _Allocator)
+    -> multiset<_Key, less<_Key>, _Allocator>;
 
 #endif
 
index 88b84905ba2da0a719c79388bd553e6c98a47c6f..9f16a9190b85431ea7d7cfd5fd020eba037cb024 100644 (file)
@@ -567,31 +567,33 @@ namespace __debug
           typename _Allocator =
             allocator<typename iterator_traits<_InputIterator>::value_type>,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocator<_Compare>,
           typename = _RequireAllocator<_Allocator>>
     set(_InputIterator, _InputIterator,
-       _Compare = _Compare(), _Allocator = _Allocator())
-   -> set<typename iterator_traits<_InputIterator>::value_type,
-         _Compare, _Allocator>;
-
- template<typename _Key, typename _Compare = less<_Key>,
-         typename _Allocator = allocator<_Key>,
-         typename = _RequireAllocator<_Allocator>>
-   set(initializer_list<_Key>,
-       _Compare = _Compare(), _Allocator = _Allocator())
-   -> set<_Key, _Compare, _Allocator>;
-
- template<typename _InputIterator, typename _Allocator,
-         typename = _RequireInputIter<_InputIterator>,
-         typename = _RequireAllocator<_Allocator>>
-   set(_InputIterator, _InputIterator, _Allocator)
-   -> set<typename iterator_traits<_InputIterator>::value_type,
-         less<typename iterator_traits<_InputIterator>::value_type>,
-         _Allocator>;
-
- template<typename _Key, typename _Allocator,
-         typename = _RequireAllocator<_Allocator>>
-   set(initializer_list<_Key>, _Allocator)
-   -> set<_Key, less<_Key>, _Allocator>;
+       _Compare = _Compare(), _Allocator = _Allocator())
+    -> set<typename iterator_traits<_InputIterator>::value_type,
+          _Compare, _Allocator>;
+
+  template<typename _Key, typename _Compare = less<_Key>,
+          typename _Allocator = allocator<_Key>,
+          typename = _RequireNotAllocator<_Compare>,
+          typename = _RequireAllocator<_Allocator>>
+    set(initializer_list<_Key>,
+       _Compare = _Compare(), _Allocator = _Allocator())
+    -> set<_Key, _Compare, _Allocator>;
+
+  template<typename _InputIterator, typename _Allocator,
+          typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireAllocator<_Allocator>>
+    set(_InputIterator, _InputIterator, _Allocator)
+    -> set<typename iterator_traits<_InputIterator>::value_type,
+          less<typename iterator_traits<_InputIterator>::value_type>,
+          _Allocator>;
+
+  template<typename _Key, typename _Allocator,
+          typename = _RequireAllocator<_Allocator>>
+    set(initializer_list<_Key>, _Allocator)
+    -> set<_Key, less<_Key>, _Allocator>;
 
 #endif
 
index 0a7485d6e18e8787916f12cc18aa1cc6e24c5480..d844ee9fa0e0f81133955dce56cd4d11ab937114 100644 (file)
@@ -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<int, int>::size_type = {},
@@ -662,6 +664,8 @@ namespace __debug
   template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
           typename _Pred = equal_to<_Key>,
           typename _Allocator = allocator<pair<const _Key, _Tp>>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
+          typename = _RequireNotAllocator<_Pred>,
           typename = _RequireAllocator<_Allocator>>
     unordered_map(initializer_list<pair<_Key, _Tp>>,
                  typename unordered_map<int, int>::size_type = {},
@@ -691,6 +695,7 @@ namespace __debug
 
   template<typename _InputIterator, typename _Hash, typename _Allocator,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_map(_InputIterator, _InputIterator,
                  typename unordered_map<int, int>::size_type,
@@ -712,6 +717,7 @@ namespace __debug
     -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
 
   template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_map(initializer_list<pair<_Key, _Tp>>,
                  typename unordered_map<int, int>::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<int, int>::size_type = {},
@@ -1262,6 +1271,8 @@ namespace __debug
   template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
           typename _Pred = equal_to<_Key>,
           typename _Allocator = allocator<pair<const _Key, _Tp>>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
+          typename = _RequireNotAllocator<_Pred>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multimap(initializer_list<pair<_Key, _Tp>>,
                       unordered_multimap<int, int>::size_type = {},
@@ -1290,6 +1301,7 @@ namespace __debug
 
   template<typename _InputIterator, typename _Hash, typename _Allocator,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multimap(_InputIterator, _InputIterator,
                       unordered_multimap<int, int>::size_type, _Hash,
@@ -1311,6 +1323,7 @@ namespace __debug
     -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
 
   template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multimap(initializer_list<pair<_Key, _Tp>>,
                       unordered_multimap<int, int>::size_type,
index a593143aa93872fe45f5309a5f77cc45536aab7e..ecc084e3846b75f4ccb622bcf7ead4546980fddd 100644 (file)
@@ -533,12 +533,14 @@ namespace __debug
 
   template<typename _InputIterator,
           typename _Hash =
-          hash<typename iterator_traits<_InputIterator>::value_type>,
+            hash<typename iterator_traits<_InputIterator>::value_type>,
           typename _Pred =
-          equal_to<typename iterator_traits<_InputIterator>::value_type>,
+            equal_to<typename iterator_traits<_InputIterator>::value_type>,
           typename _Allocator =
-          allocator<typename iterator_traits<_InputIterator>::value_type>,
+            allocator<typename iterator_traits<_InputIterator>::value_type>,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
+          typename = _RequireNotAllocator<_Pred>,
           typename = _RequireAllocator<_Allocator>>
     unordered_set(_InputIterator, _InputIterator,
                  unordered_set<int>::size_type = {},
@@ -549,6 +551,8 @@ namespace __debug
   template<typename _Tp, typename _Hash = hash<_Tp>,
           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<int>::size_type = {},
@@ -569,6 +573,7 @@ namespace __debug
 
   template<typename _InputIterator, typename _Hash, typename _Allocator,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_set(_InputIterator, _InputIterator,
                  unordered_set<int>::size_type,
@@ -586,6 +591,7 @@ namespace __debug
     -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>;
 
   template<typename _Tp, typename _Hash, typename _Allocator,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_set(initializer_list<_Tp>,
                  unordered_set<int>::size_type, _Hash, _Allocator)
@@ -1087,12 +1093,14 @@ namespace __debug
 
   template<typename _InputIterator,
           typename _Hash =
-          hash<typename iterator_traits<_InputIterator>::value_type>,
+            hash<typename iterator_traits<_InputIterator>::value_type>,
           typename _Pred =
-          equal_to<typename iterator_traits<_InputIterator>::value_type>,
+            equal_to<typename iterator_traits<_InputIterator>::value_type>,
           typename _Allocator =
-          allocator<typename iterator_traits<_InputIterator>::value_type>,
+            allocator<typename iterator_traits<_InputIterator>::value_type>,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
+          typename = _RequireNotAllocator<_Pred>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multiset(_InputIterator, _InputIterator,
                       unordered_multiset<int>::size_type = {},
@@ -1104,6 +1112,8 @@ namespace __debug
   template<typename _Tp, typename _Hash = hash<_Tp>,
           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<int>::size_type = {},
@@ -1125,6 +1135,7 @@ namespace __debug
 
   template<typename _InputIterator, typename _Hash, typename _Allocator,
           typename = _RequireInputIter<_InputIterator>,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multiset(_InputIterator, _InputIterator,
                       unordered_multiset<int>::size_type,
@@ -1144,6 +1155,7 @@ namespace __debug
     -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>;
 
   template<typename _Tp, typename _Hash, typename _Allocator,
+          typename = _RequireNotAllocatorOrIntegral<_Hash>,
           typename = _RequireAllocator<_Allocator>>
     unordered_multiset(initializer_list<_Tp>,
                       unordered_multiset<int>::size_type, _Hash, _Allocator)