diff options
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/allocator.h | 28 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/forward_list.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/hashtable.h | 14 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/hashtable_policy.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_deque.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_function.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_list.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_map.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multimap.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multiset.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_set.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_tree.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_vector.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/unordered_map.h | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/unordered_set.h | 16 |
15 files changed, 128 insertions, 26 deletions
diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 2081386..b5a2bad 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -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, diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h index 855a728..96494cc 100644 --- a/libstdc++-v3/include/bits/forward_list.h +++ b/libstdc++-v3/include/bits/forward_list.h @@ -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; diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index e0806dc..a9473c1 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -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>; diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h index e19f92a..4dd0e17 100644 --- a/libstdc++-v3/include/bits/hashtable_policy.h +++ b/libstdc++-v3/include/bits/hashtable_policy.h @@ -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> diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 48b2bc7..93c82ca 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -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; diff --git a/libstdc++-v3/include/bits/stl_function.h b/libstdc++-v3/include/bits/stl_function.h index 4fbcdb9..5cd8e3a 100644 --- a/libstdc++-v3/include/bits/stl_function.h +++ b/libstdc++-v3/include/bits/stl_function.h @@ -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> diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index be5bb5e..8ed97f7 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -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; diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index 8a9e6c9..bec6c47 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -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> diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index 1a16bf9..24ac4a3 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -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> diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index d34b675..ff7d3dc 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -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; diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 3a7992c..e07d781 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -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: //@{ diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index c2417f1..ff36618 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -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; diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index c763421..aeeba82 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -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; diff --git a/libstdc++-v3/include/bits/unordered_map.h b/libstdc++-v3/include/bits/unordered_map.h index 385e4bd..cb5bcb8 100644 --- a/libstdc++-v3/include/bits/unordered_map.h +++ b/libstdc++-v3/include/bits/unordered_map.h @@ -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; diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index 416dbbc..550548c 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -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; |