PR libstdc++/48101 improve errors for invalid container specializations
authorJonathan Wakely <jwakely@redhat.com>
Tue, 21 Nov 2017 20:47:09 +0000 (20:47 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 21 Nov 2017 20:47:09 +0000 (20:47 +0000)
PR libstdc++/48101
* include/bits/allocator.h (allocator<const _Tp>)
(allocator<volatile _Tp>, allocator<const volatile _Tp>): Add partial
specializations.
* include/bits/forward_list.h (forward_list): Add static assertions.
* include/bits/hashtable.h (__cache_default): Use
__is_nothrow_invocable instead of __is_noexcept_hash.
(_Hashtable): Add static assertions.
* include/bits/hashtable_policy.h (__is_noexcept_hash): Remove.
* include/bits/stl_deque.h (deque): Add static assertions.
* include/bits/stl_function.h (_Identity<const _Tp>): Add partial
specialization.
* include/bits/stl_list.h (list): Add static assertions.
* include/bits/stl_map.h (map): Likewise.
* include/bits/stl_multimap.h (multimap): Likewise.
* include/bits/stl_multiset.h (multiset): Likewise.
* include/bits/stl_set.h (set): Likewise.
* include/bits/stl_tree.h (_Rb_tree): Likewise.
* include/bits/stl_vector.h (vector): Likewise.
* include/bits/unordered_map.h (unordered_map, unordered_multimap):
Use typename instead of class in template-parameter-list and remove
spaces.
* include/bits/unordered_set.h (unordered_set, unordered_multiset):
Likewise.
* testsuite/23_containers/deque/48101-2_neg.cc: New test.
* testsuite/23_containers/deque/48101_neg.cc: New test.
* testsuite/23_containers/forward_list/48101-2_neg.cc: New test.
* testsuite/23_containers/forward_list/48101_neg.cc: New test.
* testsuite/23_containers/list/48101-2_neg.cc: New test.
* testsuite/23_containers/list/48101_neg.cc: New test.
* testsuite/23_containers/map/48101-2_neg.cc: New test.
* testsuite/23_containers/map/48101_neg.cc: New test.
* testsuite/23_containers/map/operations/31440.cc: Fix comparison
object to have const-qualified call operator.
* testsuite/23_containers/multimap/48101-2_neg.cc: New test.
* testsuite/23_containers/multimap/48101_neg.cc: New test.
* testsuite/23_containers/multiset/48101-2_neg.cc: New test.
* testsuite/23_containers/multiset/48101_neg.cc: New test.
* testsuite/23_containers/set/48101-2_neg.cc: New test.
* testsuite/23_containers/set/48101_neg.cc: New test.
* testsuite/23_containers/unordered_map/48101-2_neg.cc: New test.
* testsuite/23_containers/unordered_map/48101_neg.cc: New test.
* testsuite/23_containers/unordered_multimap/48101-2_neg.cc: New test.
* testsuite/23_containers/unordered_multimap/48101_neg.cc: New test.
* testsuite/23_containers/unordered_multiset/48101-2_neg.cc: New test.
* testsuite/23_containers/unordered_multiset/48101_neg.cc: New test.
* testsuite/23_containers/unordered_set/48101-2_neg.cc: New test.
* testsuite/23_containers/unordered_set/48101_neg.cc: New test.
* testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust
dg-error line number.
* testsuite/23_containers/vector/48101-2_neg.cc: New test.
* testsuite/23_containers/vector/48101_neg.cc: New test.

From-SVN: r255035

42 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/allocator.h
libstdc++-v3/include/bits/forward_list.h
libstdc++-v3/include/bits/hashtable.h
libstdc++-v3/include/bits/hashtable_policy.h
libstdc++-v3/include/bits/stl_deque.h
libstdc++-v3/include/bits/stl_function.h
libstdc++-v3/include/bits/stl_list.h
libstdc++-v3/include/bits/stl_map.h
libstdc++-v3/include/bits/stl_multimap.h
libstdc++-v3/include/bits/stl_multiset.h
libstdc++-v3/include/bits/stl_set.h
libstdc++-v3/include/bits/stl_tree.h
libstdc++-v3/include/bits/stl_vector.h
libstdc++-v3/include/bits/unordered_map.h
libstdc++-v3/include/bits/unordered_set.h
libstdc++-v3/testsuite/23_containers/deque/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/deque/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/forward_list/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/forward_list/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/list/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/list/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/map/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/map/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/map/operations/31440.cc
libstdc++-v3/testsuite/23_containers/multimap/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/multimap/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/multiset/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/multiset/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/set/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/set/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_map/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_map/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_multimap/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_multiset/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_set/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_set/48101_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/unordered_set/instantiation_neg.cc
libstdc++-v3/testsuite/23_containers/vector/48101-2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/vector/48101_neg.cc [new file with mode: 0644]

index cecc73b2a3d44a6caf1cb28a76ea97233a41478c..c2f870a17704a76c51342dafd50a6b22fcca48a1 100644 (file)
@@ -1,3 +1,58 @@
+2017-11-21  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/48101
+       * include/bits/allocator.h (allocator<const _Tp>)
+       (allocator<volatile _Tp>, allocator<const volatile _Tp>): Add partial
+       specializations.
+       * include/bits/forward_list.h (forward_list): Add static assertions.
+       * include/bits/hashtable.h (__cache_default): Use
+       __is_nothrow_invocable instead of __is_noexcept_hash.
+       (_Hashtable): Add static assertions.
+       * include/bits/hashtable_policy.h (__is_noexcept_hash): Remove.
+       * include/bits/stl_deque.h (deque): Add static assertions.
+       * include/bits/stl_function.h (_Identity<const _Tp>): Add partial
+       specialization.
+       * include/bits/stl_list.h (list): Add static assertions.
+       * include/bits/stl_map.h (map): Likewise.
+       * include/bits/stl_multimap.h (multimap): Likewise.
+       * include/bits/stl_multiset.h (multiset): Likewise.
+       * include/bits/stl_set.h (set): Likewise.
+       * include/bits/stl_tree.h (_Rb_tree): Likewise.
+       * include/bits/stl_vector.h (vector): Likewise.
+       * include/bits/unordered_map.h (unordered_map, unordered_multimap):
+       Use typename instead of class in template-parameter-list and remove
+       spaces.
+       * include/bits/unordered_set.h (unordered_set, unordered_multiset):
+       Likewise.
+       * testsuite/23_containers/deque/48101-2_neg.cc: New test.
+       * testsuite/23_containers/deque/48101_neg.cc: New test.
+       * testsuite/23_containers/forward_list/48101-2_neg.cc: New test.
+       * testsuite/23_containers/forward_list/48101_neg.cc: New test.
+       * testsuite/23_containers/list/48101-2_neg.cc: New test.
+       * testsuite/23_containers/list/48101_neg.cc: New test.
+       * testsuite/23_containers/map/48101-2_neg.cc: New test.
+       * testsuite/23_containers/map/48101_neg.cc: New test.
+       * testsuite/23_containers/map/operations/31440.cc: Fix comparison
+       object to have const-qualified call operator.
+       * testsuite/23_containers/multimap/48101-2_neg.cc: New test.
+       * testsuite/23_containers/multimap/48101_neg.cc: New test.
+       * testsuite/23_containers/multiset/48101-2_neg.cc: New test.
+       * testsuite/23_containers/multiset/48101_neg.cc: New test.
+       * testsuite/23_containers/set/48101-2_neg.cc: New test.
+       * testsuite/23_containers/set/48101_neg.cc: New test.
+       * testsuite/23_containers/unordered_map/48101-2_neg.cc: New test.
+       * testsuite/23_containers/unordered_map/48101_neg.cc: New test.
+       * testsuite/23_containers/unordered_multimap/48101-2_neg.cc: New test.
+       * testsuite/23_containers/unordered_multimap/48101_neg.cc: New test.
+       * testsuite/23_containers/unordered_multiset/48101-2_neg.cc: New test.
+       * testsuite/23_containers/unordered_multiset/48101_neg.cc: New test.
+       * testsuite/23_containers/unordered_set/48101-2_neg.cc: New test.
+       * testsuite/23_containers/unordered_set/48101_neg.cc: New test.
+       * testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust
+       dg-error line number.
+       * testsuite/23_containers/vector/48101-2_neg.cc: New test.
+       * testsuite/23_containers/vector/48101_neg.cc: New test.
+
 2017-11-21  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * doc/xml/manual/using.xml (manual.intro.using.macros): Move
index 20813864c6271548b53753bf841228eb36fc4f4d..b5a2bad07c0f46e0cc17be1248baaff5868656dc 100644 (file)
@@ -105,7 +105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    *  @tparam  _Tp  Type of allocated object.
    */
   template<typename _Tp>
-    class allocator: public __allocator_base<_Tp>
+    class allocator : public __allocator_base<_Tp>
     {
    public:
       typedef size_t     size_type;
@@ -165,6 +165,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     _GLIBCXX_USE_NOEXCEPT
     { return false; }
 
+  // Invalid allocator<cv T> partial specializations.
+  // allocator_traits::rebind_alloc can be used to form a valid allocator type.
+  template<typename _Tp>
+    class allocator<const _Tp>
+    {
+    public:
+      typedef _Tp value_type;
+      template<typename _Up> allocator(const allocator<_Up>&) { }
+    };
+
+  template<typename _Tp>
+    class allocator<volatile _Tp>
+    {
+    public:
+      typedef _Tp value_type;
+      template<typename _Up> allocator(const allocator<_Up>&) { }
+    };
+
+  template<typename _Tp>
+    class allocator<const volatile _Tp>
+    {
+    public:
+      typedef _Tp value_type;
+      template<typename _Up> allocator(const allocator<_Up>&) { }
+    };
+
   /// @} group allocator
 
   // Inhibit implicit instantiations for required instantiations,
index 855a72815ae715f34f7ef5e8425222e1d298f280..96494cc20de574d6b319394104bb2b04700e5b6e 100644 (file)
@@ -406,9 +406,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  specialized algorithms %unique to linked lists, such as
    *  splicing, sorting, and in-place reversal.
    */
-  template<typename _Tp, typename _Alloc = allocator<_Tp> >
+  template<typename _Tp, typename _Alloc = allocator<_Tp>>
     class forward_list : private _Fwd_list_base<_Tp, _Alloc>
     {
+      static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
+         "std::forward_list must have a non-const, non-volatile value_type");
+#ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
+         "std::forward_list must have the same value_type as its allocator");
+#endif
+
     private:
       typedef _Fwd_list_base<_Tp, _Alloc>                  _Base;
       typedef _Fwd_list_node<_Tp>                          _Node;
index e0806dc93a155e83d1a3020ff2fa8b172ddd490d..a9473c16bde500121a524938a9002a5e7cba3808 100644 (file)
@@ -46,7 +46,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       =  __not_<__and_<// Do not cache for fast hasher.
                       __is_fast_hash<_Hash>,
                       // Mandatory to have erase not throwing.
-                      __detail::__is_noexcept_hash<_Tp, _Hash>>>;
+                      __is_nothrow_invocable<const _Hash&, const _Tp&>>>;
 
   /**
    *  Primary class template _Hashtable.
@@ -186,6 +186,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                       __detail::_Hash_node<_Value,
                                            _Traits::__hash_cached::value>>>
     {
+      static_assert(is_same<typename remove_cv<_Value>::type, _Value>::value,
+         "unordered container must have a non-const, non-volatile value_type");
+#ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Value>{},
+         "unordered container must have the same value_type as its allocator");
+#endif
+      static_assert(__is_invocable<const _H1&, const _Key&>{},
+         "hash function must be invocable with an argument of key type");
+      static_assert(__is_invocable<const _Equal&, const _Key&, const _Key&>{},
+         "key equality predicate must be invocable with two arguments of "
+         "key type");
+
       using __traits_type = _Traits;
       using __hash_cached = typename __traits_type::__hash_cached;
       using __node_type = __detail::_Hash_node<_Value, __hash_cached::value>;
index e19f92abd76f0d39067776d95e0157b1d9da8147..4dd0e1717f86e30fc75b6cbc7793e4c2439ded5a 100644 (file)
@@ -79,12 +79,6 @@ namespace __detail
       return __distance_fw(__first, __last, _Tag());
     }
 
-  // Helper type used to detect whether the hash functor is noexcept.
-  template <typename _Key, typename _Hash>
-    struct __is_noexcept_hash : std::__bool_constant<
-       noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
-    { };
-
   struct _Identity
   {
     template<typename _Tp>
index 48b2bc7f5ebb952fe143301b09bcc39b93b4c59c..93c82ca8909b99c39c63f2eda4163bd3551de24d 100644 (file)
@@ -840,6 +840,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L
+      static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
+         "std::deque must have a non-const, non-volatile value_type");
+# ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
+         "std::deque must have the same value_type as its allocator");
+# endif
+#endif
+
       typedef _Deque_base<_Tp, _Alloc>                 _Base;
       typedef typename _Base::_Tp_alloc_type           _Tp_alloc_type;
       typedef typename _Base::_Alloc_traits            _Alloc_traits;
index 4fbcdb91f56bac09b7769c50f03df8cafe283fdb..5cd8e3aeb7c2f8f42b6ea03c232b515d2b15367c 100644 (file)
@@ -867,7 +867,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename _Tp>
     struct _Identity
-    : public unary_function<_Tp,_Tp>
+    : public unary_function<_Tp, _Tp>
     {
       _Tp&
       operator()(_Tp& __x) const
@@ -878,6 +878,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return __x; }
     };
 
+  // Partial specialization, avoids confusing errors in e.g. std::set<const T>.
+  template<typename _Tp> struct _Identity<const _Tp> : _Identity<_Tp> { };
+
   template<typename _Pair>
     struct _Select1st
     : public unary_function<_Pair, typename _Pair::first_type>
index be5bb5e5b68dc45430a114a6670ce875f0c70f4c..8ed97f7c8b0a3092fd9cce49059e0a0eb49f78de 100644 (file)
@@ -571,6 +571,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L
+      static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
+         "std::list must have a non-const, non-volatile value_type");
+# ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
+         "std::list must have the same value_type as its allocator");
+# endif
+#endif
+
       typedef _List_base<_Tp, _Alloc>                  _Base;
       typedef typename _Base::_Tp_alloc_type           _Tp_alloc_type;
       typedef typename _Base::_Tp_alloc_traits         _Tp_alloc_traits;
index 8a9e6c9c3296363428cc63c6bfcabdcd805f70b9..bec6c47c08658bd1a3c202633cba58da3d4ecaf5 100644 (file)
@@ -118,6 +118,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L && defined(__STRICT_ANSI__)
+      static_assert(is_same<typename _Alloc::value_type, value_type>::value,
+         "std::map must have the same value_type as its allocator");
+#endif
+
     public:
       class value_compare
       : public std::binary_function<value_type, value_type, bool>
index 1a16bf982e3e11563f6d1d72c4db093912322ddb..24ac4a3c1865c6e804312812ada335eb31fc006d 100644 (file)
@@ -117,6 +117,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L && defined(__STRICT_ANSI__)
+      static_assert(is_same<typename _Alloc::value_type, value_type>::value,
+         "std::multimap must have the same value_type as its allocator");
+#endif
+
     public:
       class value_compare
       : public std::binary_function<value_type, value_type, bool>
index d34b6758e18dd74e0a72c5fca657df016988d20b..ff7d3dca5869868012907bd48ababe0eafd4cc83 100644 (file)
@@ -106,6 +106,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L
+      static_assert(is_same<typename remove_cv<_Key>::type, _Key>::value,
+         "std::multiset must have a non-const, non-volatile value_type");
+# ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Key>::value,
+         "std::multiset must have the same value_type as its allocator");
+# endif
+#endif
+
     public:
       // typedefs:
       typedef _Key     key_type;
index 3a7992c4dab420ff01a97032d202bf5c8ecedc78..e07d78124eb88a7342e49cafcaa05fcfe839ea12 100644 (file)
@@ -104,6 +104,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L
+      static_assert(is_same<typename remove_cv<_Key>::type, _Key>::value,
+         "std::set must have a non-const, non-volatile value_type");
+# ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Key>::value,
+         "std::set must have the same value_type as its allocator");
+# endif
+#endif
+
     public:
       // typedefs:
       //@{
index c2417f1f8ccc2682a75f15dc425200c4e062d4c6..ff36618bccfc13ca0f511289243e9718122f4402 100644 (file)
@@ -448,6 +448,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       typedef __gnu_cxx::__alloc_traits<_Node_allocator> _Alloc_traits;
 
+#if __cplusplus >= 201103L
+      static_assert(__is_invocable<const _Compare&, const _Key&, const _Key&>{},
+         "comparison object must be invocable with two arguments of key type");
+#endif
+
     protected:
       typedef _Rb_tree_node_base*              _Base_ptr;
       typedef const _Rb_tree_node_base*        _Const_Base_ptr;
index c7634216c013da49e4b84c85c3cb4e6bea1c80f9..aeeba820020d6cc9e19f0ae2469317cac5565e39 100644 (file)
@@ -347,6 +347,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
 #endif
 
+#if __cplusplus >= 201103L
+      static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
+         "std::vector must have a non-const, non-volatile value_type");
+# ifdef __STRICT_ANSI__
+      static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
+         "std::vector must have the same value_type as its allocator");
+# endif
+#endif
+
       typedef _Vector_base<_Tp, _Alloc>                        _Base;
       typedef typename _Base::_Tp_alloc_type           _Tp_alloc_type;
       typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>        _Alloc_traits;
index 385e4bd4df4dc0f9ea6a3f7a3ce7af849aca300c..cb5bcb89a163d9ee4866df434fbfa77d1cb20e02 100644 (file)
@@ -95,10 +95,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  Base is _Hashtable, dispatched at compile time via template
    *  alias __umap_hashtable.
    */
-  template<class _Key, class _Tp,
-          class _Hash = hash<_Key>,
-          class _Pred = std::equal_to<_Key>,
-          class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
+  template<typename _Key, typename _Tp,
+          typename _Hash = hash<_Key>,
+          typename _Pred = equal_to<_Key>,
+          typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
     class unordered_map
     {
       typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
@@ -1229,10 +1229,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  Base is _Hashtable, dispatched at compile time via template
    *  alias __ummap_hashtable.
    */
-  template<class _Key, class _Tp,
-          class _Hash = hash<_Key>,
-          class _Pred = std::equal_to<_Key>,
-          class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
+  template<typename _Key, typename _Tp,
+          typename _Hash = hash<_Key>,
+          typename _Pred = equal_to<_Key>,
+          typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
     class unordered_multimap
     {
       typedef __ummap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
index 416dbbcfb96770403fef80981860ec01ff6180b4..550548c42db5a7e7e8514a1ac27d8fcc3fc758b6 100644 (file)
@@ -90,10 +90,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  Base is _Hashtable, dispatched at compile time via template
    *  alias __uset_hashtable.
    */
-  template<class _Value,
-          class _Hash = hash<_Value>,
-          class _Pred = std::equal_to<_Value>,
-          class _Alloc = std::allocator<_Value> >
+  template<typename _Value,
+          typename _Hash = hash<_Value>,
+          typename _Pred = equal_to<_Value>,
+          typename _Alloc = allocator<_Value>>
     class unordered_set
     {
       typedef __uset_hashtable<_Value, _Hash, _Pred, _Alloc>  _Hashtable;
@@ -888,10 +888,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
    *  Base is _Hashtable, dispatched at compile time via template
    *  alias __umset_hashtable.
    */
-  template<class _Value,
-          class _Hash = hash<_Value>,
-          class _Pred = std::equal_to<_Value>,
-          class _Alloc = std::allocator<_Value> >
+  template<typename _Value,
+          typename _Hash = hash<_Value>,
+          typename _Pred = equal_to<_Value>,
+          typename _Alloc = allocator<_Value>>
     class unordered_multiset
     {
       typedef __umset_hashtable<_Value, _Hash, _Pred, _Alloc>  _Hashtable;
diff --git a/libstdc++-v3/testsuite/23_containers/deque/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..7bb6373
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <deque>
+
+void
+test01()
+{
+  std::deque<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/deque/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/48101_neg.cc
new file mode 100644 (file)
index 0000000..57327e0
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <deque>
+
+void
+test01()
+{
+  std::deque<const int> c;
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..a830d7a
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <forward_list>
+
+void
+test01()
+{
+  std::forward_list<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/48101_neg.cc
new file mode 100644 (file)
index 0000000..268c06d
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <forward_list>
+
+void
+test01()
+{
+  std::forward_list<const int> c;
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }
diff --git a/libstdc++-v3/testsuite/23_containers/list/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..bce7e34
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <list>
+
+void
+test01()
+{
+  std::list<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/list/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/list/48101_neg.cc
new file mode 100644 (file)
index 0000000..9652e07
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <list>
+
+void
+test01()
+{
+  std::list<const int> c;
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }
diff --git a/libstdc++-v3/testsuite/23_containers/map/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/map/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..dcb4335
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <map>
+
+void
+test01()
+{
+  std::map<int, int, std::less<int>, std::allocator<int>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/map/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/map/48101_neg.cc
new file mode 100644 (file)
index 0000000..75821fa
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <map>
+
+void
+test01()
+{
+  std::map<int, int, std::less<int*>> c;      // { dg-error "here" }
+  std::map<int, int, std::allocator<int>> c2; // { dg-error "here" }
+}
+
+// { dg-error "comparison object must be invocable" "" { target *-*-* } 0 }
index 6401bfe5a31e5d478b8f5979be43f0da2aac4555..531c74d74180be3d755b2ead23ae4883067a8df5 100644 (file)
@@ -38,7 +38,7 @@ private:
 
 struct MemoTable::dagNodeLt
 {
-  bool operator()(const DagNode*, const DagNode*);
+  bool operator()(const DagNode*, const DagNode*) const;
 };
 
 class MemoTable::MemoMap
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/multimap/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..2b8db2c
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <map>
+
+void
+test01()
+{
+  std::multimap<int, int, std::less<int>, std::allocator<int>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/multimap/48101_neg.cc
new file mode 100644 (file)
index 0000000..a303c75
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <map>
+
+void
+test01()
+{
+  std::multimap<int, int, std::less<int*>> c;      // { dg-error "here" }
+  std::multimap<int, int, std::allocator<int>> c2; // { dg-error "here" }
+}
+
+// { dg-error "comparison object must be invocable" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/multiset/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..c9bb1f4
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <set>
+
+void
+test01()
+{
+  std::multiset<int, std::less<int>, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/multiset/48101_neg.cc
new file mode 100644 (file)
index 0000000..3697d32
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <set>
+
+void
+test01()
+{
+  std::multiset<const int> c;             // { dg-error "here" }
+  std::multiset<int, std::less<long*>> c2; // { dg-error "here" }
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-error "comparison object must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }
diff --git a/libstdc++-v3/testsuite/23_containers/set/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/set/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..925d4ad
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <set>
+
+void
+test01()
+{
+  std::set<int, std::less<int>, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/set/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/set/48101_neg.cc
new file mode 100644 (file)
index 0000000..258fab8
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <set>
+
+void
+test01()
+{
+  std::set<const int> c;             // { dg-error "here" }
+  std::set<int, std::less<long*>> c2; // { dg-error "here" }
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-error "comparison object must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..847ac80
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_map<int, int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/48101_neg.cc
new file mode 100644 (file)
index 0000000..6180c2d
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_map<int, int, equal_to<int>, hash<int>> c2;  // { dg-error "here" }
+}
+
+// { dg-error "hash function must be invocable" "" { target *-*-* } 0 }
+// { dg-error "key equality predicate must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "use of deleted function" }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..6b2660a
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multimap<int, int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101_neg.cc
new file mode 100644 (file)
index 0000000..538d1dc
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multimap<int, int, equal_to<int>, hash<int>> c2; // { dg-error "here" }
+}
+
+// { dg-error "hash function must be invocable" "" { target *-*-* } 0 }
+// { dg-error "key equality predicate must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "use of deleted function" }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..6dccaa7
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multiset<int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101_neg.cc
new file mode 100644 (file)
index 0000000..3ec61dd
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multiset<const int, hash<int>> c;          // { dg-error "here" }
+  unordered_multiset<int, equal_to<int>, hash<int>> c2; // { dg-error "here" }
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-error "hash function must be invocable" "" { target *-*-* } 0 }
+// { dg-error "key equality predicate must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "use of deleted function" }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..1221b8a
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_set<int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/48101_neg.cc
new file mode 100644 (file)
index 0000000..d74370b
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_set<const int, hash<int>> c;           // { dg-error "here" }
+  unordered_set<int, equal_to<int>, hash<int>> c2;  // { dg-error "here" }
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-error "hash function must be invocable" "" { target *-*-* } 0 }
+// { dg-error "key equality predicate must be invocable" "" { target *-*-* } 0 }
+// { dg-prune-output "use of deleted function" }
index ac4477d6d9276d20e00b1ebc68f89f83da23b279..60e5b2b7982e71bef4b586e645b2f11ee2888d2e 100644 (file)
@@ -18,7 +18,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-error "with noexcept" "" { target *-*-* } 268 }
+// { dg-error "qualify your functors .* with noexcept" "" { target *-*-* } 0 }
 
 #include <unordered_set>
 
diff --git a/libstdc++-v3/testsuite/23_containers/vector/48101-2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/48101-2_neg.cc
new file mode 100644 (file)
index 0000000..0a54a48
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/vector/48101_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/48101_neg.cc
new file mode 100644 (file)
index 0000000..ed70156
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <vector>
+
+void
+test01()
+{
+  std::vector<const int> c;
+}
+
+// { dg-error "non-const, non-volatile value_type" "" { target *-*-* } 0 }
+// { dg-prune-output "std::allocator<.* has no member named " }