Hi, this is my error message:
In file included from z.cc:1: /code/build-llvm/bin/../include/c++/v1/ext/hash_map:213:5: warning: Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> [-W#warnings] # warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> ^ /code/build-llvm/bin/../include/c++/v1/ext/hash_map:432:57: error: '__non_const_iterator' is a private member of 'std::__1::__hash_const_iterator<std::__1::__hash_node<std::__1::pair<int, int>, void *> *>' __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) ^ /code/build-llvm/bin/../include/c++/v1/ext/hash_map:659:16: note: in instantiation of template class '__gnu_cxx::__hash_map_const_iterator<std::__1::__hash_const_iterator<std::__1::__hash_node<std::__1::pair<int, int>, void *> *> >' requested here insert(__u.begin(), __u.end()); ^ z.cc:4:16: note: in instantiation of member function '__gnu_cxx::hash_map<int, int, __gnu_cxx::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, int> > >::hash_map' requested here template class hash_map<int, int>; ^ /code/build-llvm/bin/../include/c++/v1/__hash_table:383:39: note: implicitly declared private here typedef __hash_iterator<_NodePtr> __non_const_iterator; ^ 1 warning and 1 error generated. and this is my test case: #include <ext/hash_map> namespace __gnu_cxx { template class hash_map<int, int>; } On Sat, Feb 13, 2016 at 12:17 AM, Eric Fiselier <e...@efcs.ca> wrote: >> The "hash_map" part of the name means they belong to "<unordered_map>", >> and the actual type is defined in that header. > > Woops, Sorry I guess the name is used in both "std::__1::" in unordered_map > and "__gnu_cxx::" in <ext/hash_map>. My intention in the changes was to > forward declare "std::__1::__hash_map_iterator". > > On Sat, Feb 13, 2016 at 1:11 AM, Eric Fiselier <e...@efcs.ca> wrote: >> >> > hash_map still looks broken to me. >> >> Uh oh, Sorry :-S. The original breakage was caused by the removal of a >> typedef "hash_map" used, but I'm sure I fixed that. >> >> > should not they be prefixed with __gnu_cxx:: ? >> >> No, they are in the correct namespace. The "hash_map" part of the name >> means they belong to "<unordered_map>", and the actual type is defined in >> that header. >> >> Could you give me more information about the breakage your seeing? The >> actual compiler diagnostics if possible? I also committed other sizable >> changes to <__hash_table> in r260513 so that may be related. >> >> Let me know if you need this reverted. If possible I would like to hold >> off, at least until more is known. >> >> /Eric >> >> On Fri, Feb 12, 2016 at 1:31 PM, Evgenii Stepanov >> <eugeni.stepa...@gmail.com> wrote: >>> >>> Hi, >>> >>> hash_map still looks broken to me. >>> I don't have a simple reproducer, but these declarations in __hash_table: >>> >>> template <class _HashIterator> class _LIBCPP_TYPE_VIS_ONLY >>> __hash_map_iterator; >>> template <class _HashIterator> class _LIBCPP_TYPE_VIS_ONLY >>> __hash_map_const_iterator; >>> >>> should not they be prefixed with __gnu_cxx:: ? >>> >>> Clang says that std::__1::__hash_const_iterator and >>> __gnu_cxx::__hash_map_const_iterator are not friends and >>> __non_const_iterator at ext/hash_map:432 is private. >>> >>> >>> On Wed, Feb 10, 2016 at 12:46 PM, Eric Fiselier via cfe-commits >>> <cfe-commits@lists.llvm.org> wrote: >>> > Author: ericwf >>> > Date: Wed Feb 10 14:46:23 2016 >>> > New Revision: 260431 >>> > >>> > URL: http://llvm.org/viewvc/llvm-project?rev=260431&view=rev >>> > Log: >>> > Recommit r260012 - Cleanup node-type handling in the unordered >>> > containers. >>> > >>> > This time I kept <ext/hash_map> working! >>> > >>> > This patch is the first in a series of patches that's meant to better >>> > support unordered_map. unordered_map has a special "value_type" that >>> > differs from pair<const Key, Value>. In order to meet the >>> > EmplaceConstructible >>> > and CopyInsertable requirements we need to teach __hash_table about >>> > this >>> > special value_type. >>> > >>> > This patch creates a "__hash_node_types" traits class that contains >>> > all of the typedefs needed by the unordered containers and it's >>> > iterators. >>> > These typedefs include ones for each node type and node pointer type, >>> > as well as special typedefs for "unordered_map"'s value type. >>> > >>> > As a result of this change all of the unordered containers now all >>> > support >>> > incomplete types. >>> > >>> > As a drive-by fix I changed the difference_type in __hash_table to >>> > always >>> > be ptrdiff_t. There is a corresponding change to size_type but it >>> > cannot >>> > take affect until an ABI break. >>> > >>> > This patch will be followed up shortly with fixes for various >>> > unordered_map >>> > bugs and problems. >>> > >>> > Added: >>> > libcxx/trunk/test/libcxx/containers/unord/key_value_traits.pass.cpp >>> > >>> > libcxx/trunk/test/std/containers/unord/iterator_difference_type.pass.cpp >>> > >>> > libcxx/trunk/test/std/containers/unord/unord.map/incomplete_type.pass.cpp >>> > >>> > libcxx/trunk/test/std/containers/unord/unord.multimap/incomplete.pass.cpp >>> > >>> > libcxx/trunk/test/std/containers/unord/unord.multiset/incomplete.pass.cpp >>> > >>> > libcxx/trunk/test/std/containers/unord/unord.set/incomplete.pass.cpp >>> > Modified: >>> > libcxx/trunk/include/__config >>> > libcxx/trunk/include/__hash_table >>> > libcxx/trunk/include/ext/hash_map >>> > libcxx/trunk/include/unordered_map >>> > >>> > Modified: libcxx/trunk/include/__config >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=260431&r1=260430&r2=260431&view=diff >>> > >>> > ============================================================================== >>> > --- libcxx/trunk/include/__config (original) >>> > +++ libcxx/trunk/include/__config Wed Feb 10 14:46:23 2016 >>> > @@ -42,6 +42,7 @@ >>> > // Fix undefined behavior in how std::list stores it's linked nodes. >>> > #define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB >>> > #define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB >>> > +#define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE >>> > #endif >>> > >>> > #define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y >>> > >>> > Modified: libcxx/trunk/include/__hash_table >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__hash_table?rev=260431&r1=260430&r2=260431&view=diff >>> > >>> > ============================================================================== >>> > --- libcxx/trunk/include/__hash_table (original) >>> > +++ libcxx/trunk/include/__hash_table Wed Feb 10 14:46:23 2016 >>> > @@ -17,6 +17,7 @@ >>> > #include <iterator> >>> > #include <algorithm> >>> > #include <cmath> >>> > +#include <utility> >>> > >>> > #include <__undef_min_max> >>> > #include <__undef___deallocate> >>> > @@ -49,10 +50,10 @@ struct __hash_node >>> > typename __rebind_pointer<_VoidPtr, __hash_node<_Tp, >>> > _VoidPtr> >::type >>> > > >>> > { >>> > - typedef _Tp value_type; >>> > + typedef _Tp __node_value_type; >>> > >>> > size_t __hash_; >>> > - value_type __value_; >>> > + __node_value_type __value_; >>> > }; >>> > >>> > inline _LIBCPP_INLINE_VISIBILITY >>> > @@ -77,23 +78,126 @@ __next_hash_pow2(size_t __n) >>> > } >>> > >>> > template <class _Tp, class _Hash, class _Equal, class _Alloc> class >>> > __hash_table; >>> > + >>> > +template <class _NodePtr> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_iterator; >>> > template <class _ConstNodePtr> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_const_iterator; >>> > +template <class _NodePtr> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_local_iterator; >>> > +template <class _ConstNodePtr> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_const_local_iterator; >>> > template <class _HashIterator> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_map_iterator; >>> > template <class _HashIterator> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_map_const_iterator; >>> > >>> > +#if __cplusplus >= 201103L >>> > +template <class _Key, class _Tp> >>> > +union __hash_value_type; >>> > +#else >>> > +template <class _Key, class _Tp> >>> > +struct __hash_value_type; >>> > +#endif >>> > + >>> > +template <class _Tp> >>> > +struct __key_value_types { >>> > + static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, >>> > ""); >>> > + typedef _Tp key_type; >>> > + typedef _Tp __node_value_type; >>> > + typedef _Tp __container_value_type; >>> > + static const bool __is_map = false; >>> > +}; >>> > + >>> > +template <class _Key, class _Tp> >>> > +struct __key_value_types<__hash_value_type<_Key, _Tp> > { >>> > + typedef _Key key_type; >>> > + typedef _Tp mapped_type; >>> > + typedef __hash_value_type<_Key, _Tp> >>> > __node_value_type; >>> > + typedef pair<const _Key, _Tp> >>> > __container_value_type; >>> > + typedef __container_value_type >>> > __map_value_type; >>> > + static const bool __is_map = true; >>> > +}; >>> > + >>> > +template <class _Tp, class _AllocPtr, class _KVTypes = >>> > __key_value_types<_Tp>, >>> > + bool = _KVTypes::__is_map> >>> > +struct __map_pointer_types {}; >>> > + >>> > +template <class _Tp, class _AllocPtr, class _KVTypes> >>> > +struct __map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> { >>> > + typedef typename _KVTypes::__map_value_type _Mv; >>> > + typedef typename __rebind_pointer<_AllocPtr, _Mv>::type >>> > + >>> > __map_value_type_pointer; >>> > + typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type >>> > + >>> > __const_map_value_type_pointer; >>> > +}; >>> > + >>> > +template <class _NodePtr, class _NodeT = typename >>> > pointer_traits<_NodePtr>::element_type> >>> > +struct __hash_node_types; >>> > + >>> > +template <class _NodePtr, class _Tp, class _VoidPtr> >>> > +struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> > >>> > + : public __key_value_types<_Tp>, __map_pointer_types<_Tp, >>> > _VoidPtr> >>> > + >>> > +{ >>> > + typedef __key_value_types<_Tp> __base; >>> > + >>> > +public: >>> > + typedef ptrdiff_t difference_type; >>> > + typedef size_t size_type; >>> > + >>> > + typedef typename __rebind_pointer<_NodePtr, void>::type >>> > __void_pointer; >>> > + >>> > + typedef typename pointer_traits<_NodePtr>::element_type >>> > __node_type; >>> > + typedef _NodePtr >>> > __node_pointer; >>> > + >>> > + typedef __hash_node_base<__node_pointer> >>> > __node_base_type; >>> > + typedef typename __rebind_pointer<_NodePtr, __node_base_type>::type >>> > + >>> > __node_base_pointer; >>> > + >>> > + typedef _Tp >>> > __node_value_type; >>> > + typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type >>> > + >>> > __node_value_type_pointer; >>> > + typedef typename __rebind_pointer<_VoidPtr, const >>> > __node_value_type>::type >>> > + >>> > __const_node_value_type_pointer; >>> > +private: >>> > + static_assert(!is_const<__node_type>::value, >>> > + "_NodePtr should never be a pointer to const"); >>> > + static_assert((is_same<typename >>> > pointer_traits<_VoidPtr>::element_type, void>::value), >>> > + "_VoidPtr does not point to unqualified void type"); >>> > + static_assert((is_same<typename __rebind_pointer<_VoidPtr, >>> > __node_type>::type, >>> > + _NodePtr>::value), "_VoidPtr does not rebind >>> > to _NodePtr."); >>> > +}; >>> > + >>> > + >>> > + >>> > +template <class _HashIterator> >>> > +struct __hash_node_types_from_iterator; >>> > +template <class _NodePtr> >>> > +struct __hash_node_types_from_iterator<__hash_iterator<_NodePtr> > : >>> > __hash_node_types<_NodePtr> {}; >>> > +template <class _NodePtr> >>> > +struct __hash_node_types_from_iterator<__hash_const_iterator<_NodePtr> >>> > > : __hash_node_types<_NodePtr> {}; >>> > +template <class _NodePtr> >>> > +struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> >>> > > : __hash_node_types<_NodePtr> {}; >>> > +template <class _NodePtr> >>> > +struct >>> > __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : >>> > __hash_node_types<_NodePtr> {}; >>> > + >>> > + >>> > +template <class _NodeValueTp, class _VoidPtr> >>> > +struct __make_hash_node_types { >>> > + typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp; >>> > + typedef typename __rebind_pointer<_VoidPtr, _NodeTp>::type _NodePtr; >>> > + typedef __hash_node_types<_NodePtr> type; >>> > +}; >>> > + >>> > template <class _NodePtr> >>> > class _LIBCPP_TYPE_VIS_ONLY __hash_iterator >>> > { >>> > - typedef _NodePtr __node_pointer; >>> > + typedef __hash_node_types<_NodePtr> _NodeTypes; >>> > + typedef _NodePtr __node_pointer; >>> > >>> > __node_pointer __node_; >>> > >>> > public: >>> > - typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef typename >>> > pointer_traits<__node_pointer>::element_type::value_type value_type; >>> > - typedef typename pointer_traits<__node_pointer>::difference_type >>> > difference_type; >>> > - typedef value_type& reference; >>> > - typedef typename __rebind_pointer<__node_pointer, >>> > value_type>::type pointer; >>> > + typedef forward_iterator_tag >>> > iterator_category; >>> > + typedef typename _NodeTypes::__node_value_type value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > + typedef value_type& reference; >>> > + typedef typename _NodeTypes::__node_value_type_pointer pointer; >>> > >>> > _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT >>> > #if _LIBCPP_STD_VER > 11 >>> > @@ -202,25 +306,22 @@ private: >>> > template <class, class, class, class, class> friend class >>> > _LIBCPP_TYPE_VIS_ONLY unordered_multimap; >>> > }; >>> > >>> > -template <class _ConstNodePtr> >>> > +template <class _NodePtr> >>> > class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator >>> > { >>> > - typedef _ConstNodePtr __node_pointer; >>> > - >>> > - __node_pointer __node_; >>> > - >>> > - typedef typename remove_const< >>> > - typename pointer_traits<__node_pointer>::element_type >>> > - >::type __node; >>> > + static_assert(!is_const<typename >>> > pointer_traits<_NodePtr>::element_type>::value, ""); >>> > + typedef __hash_node_types<_NodePtr> _NodeTypes; >>> > + typedef _NodePtr __node_pointer; >>> > + typedef __hash_iterator<_NodePtr> __non_const_iterator; >>> > + __node_pointer __node_; >>> > >>> > public: >>> > - typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef typename __node::value_type value_type; >>> > - typedef typename pointer_traits<__node_pointer>::difference_type >>> > difference_type; >>> > - typedef const value_type& reference; >>> > - typedef typename __rebind_pointer<__node_pointer, const >>> > value_type>::type pointer; >>> > - typedef typename __rebind_pointer<__node_pointer, __node>::type >>> > __non_const_node_pointer; >>> > - typedef __hash_iterator<__non_const_node_pointer> >>> > __non_const_iterator; >>> > + typedef forward_iterator_tag >>> > iterator_category; >>> > + typedef typename _NodeTypes::__node_value_type >>> > value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > + typedef const value_type& >>> > reference; >>> > + typedef typename _NodeTypes::__const_node_value_type_pointer >>> > pointer; >>> > + >>> > >>> > _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT >>> > #if _LIBCPP_STD_VER > 11 >>> > @@ -336,24 +437,22 @@ private: >>> > template <class, class, class, class, class> friend class >>> > _LIBCPP_TYPE_VIS_ONLY unordered_multimap; >>> > }; >>> > >>> > -template <class _ConstNodePtr> class _LIBCPP_TYPE_VIS_ONLY >>> > __hash_const_local_iterator; >>> > - >>> > template <class _NodePtr> >>> > class _LIBCPP_TYPE_VIS_ONLY __hash_local_iterator >>> > { >>> > - typedef _NodePtr __node_pointer; >>> > + typedef __hash_node_types<_NodePtr> _NodeTypes; >>> > + typedef _NodePtr __node_pointer; >>> > >>> > __node_pointer __node_; >>> > size_t __bucket_; >>> > size_t __bucket_count_; >>> > >>> > - typedef pointer_traits<__node_pointer> __pointer_traits; >>> > public: >>> > typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef typename __pointer_traits::element_type::value_type >>> > value_type; >>> > - typedef typename __pointer_traits::difference_type >>> > difference_type; >>> > + typedef typename _NodeTypes::__node_value_type >>> > value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > typedef value_type& >>> > reference; >>> > - typedef typename __rebind_pointer<__node_pointer, >>> > value_type>::type pointer; >>> > + typedef typename _NodeTypes::__node_value_type_pointer >>> > pointer; >>> > >>> > _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT >>> > { >>> > @@ -476,7 +575,8 @@ private: >>> > template <class _ConstNodePtr> >>> > class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator >>> > { >>> > - typedef _ConstNodePtr __node_pointer; >>> > + typedef __hash_node_types<_ConstNodePtr> _NodeTypes; >>> > + typedef _ConstNodePtr __node_pointer; >>> > >>> > __node_pointer __node_; >>> > size_t __bucket_; >>> > @@ -491,14 +591,11 @@ class _LIBCPP_TYPE_VIS_ONLY __hash_const >>> > typedef __hash_local_iterator<__non_const_node_pointer> >>> > >>> > __non_const_iterator; >>> > public: >>> > - typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef typename remove_const< >>> > - typename >>> > __pointer_traits::element_type::value_type >>> > - >::type value_type; >>> > - typedef typename __pointer_traits::difference_type >>> > difference_type; >>> > - typedef const value_type& reference; >>> > - typedef typename __rebind_pointer<__node_pointer, const >>> > value_type>::type >>> > - pointer; >>> > + typedef forward_iterator_tag >>> > iterator_category; >>> > + typedef typename _NodeTypes::__node_value_type >>> > value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > + typedef const value_type& >>> > reference; >>> > + typedef typename _NodeTypes::__const_node_value_type_pointer >>> > pointer; >>> > >>> > >>> > _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT >>> > @@ -686,7 +783,7 @@ class __hash_node_destructor >>> > { >>> > typedef _Alloc >>> > allocator_type; >>> > typedef allocator_traits<allocator_type> >>> > __alloc_traits; >>> > - typedef typename __alloc_traits::value_type::value_type >>> > value_type; >>> > + >>> > public: >>> > typedef typename __alloc_traits::pointer pointer; >>> > private: >>> > @@ -728,23 +825,42 @@ public: >>> > >>> > private: >>> > typedef allocator_traits<allocator_type> __alloc_traits; >>> > + typedef typename >>> > + __make_hash_node_types<value_type, typename >>> > __alloc_traits::void_pointer>::type >>> > + >>> > _NodeTypes; >>> > public: >>> > typedef value_type& reference; >>> > typedef const value_type& const_reference; >>> > typedef typename __alloc_traits::pointer pointer; >>> > typedef typename __alloc_traits::const_pointer const_pointer; >>> > +#ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE >>> > typedef typename __alloc_traits::size_type size_type; >>> > - typedef typename __alloc_traits::difference_type difference_type; >>> > +#else >>> > + typedef typename _NodeTypes::size_type size_type; >>> > +#endif >>> > + typedef typename _NodeTypes::difference_type difference_type; >>> > public: >>> > // Create __node >>> > - typedef __hash_node<value_type, typename >>> > __alloc_traits::void_pointer> __node; >>> > + >>> > + typedef typename _NodeTypes::__node_type __node; >>> > typedef typename __rebind_alloc_helper<__alloc_traits, >>> > __node>::type __node_allocator; >>> > typedef allocator_traits<__node_allocator> __node_traits; >>> > - typedef typename __node_traits::pointer __node_pointer; >>> > - typedef typename __node_traits::pointer >>> > __node_const_pointer; >>> > - typedef __hash_node_base<__node_pointer> __first_node; >>> > - typedef typename __rebind_pointer<__node_pointer, >>> > __first_node>::type >>> > - __node_base_pointer; >>> > + typedef typename _NodeTypes::__node_pointer __node_pointer; >>> > + typedef typename _NodeTypes::__node_pointer >>> > __node_const_pointer; >>> > + typedef typename _NodeTypes::__node_base_type __first_node; >>> > + typedef typename _NodeTypes::__node_base_pointer >>> > __node_base_pointer; >>> > + >>> > +private: >>> > + // check for sane allocator pointer rebinding semantics. Rebinding >>> > the >>> > + // allocator for a new pointer type should be exactly the same as >>> > rebinding >>> > + // the pointer using 'pointer_traits'. >>> > + static_assert((is_same<__node_pointer, typename >>> > __node_traits::pointer>::value), >>> > + "Allocator does not rebind pointers in a sane >>> > manner."); >>> > + typedef typename __rebind_alloc_helper<__node_traits, >>> > __first_node>::type >>> > + __node_base_allocator; >>> > + typedef allocator_traits<__node_base_allocator> >>> > __node_base_traits; >>> > + static_assert((is_same<__node_base_pointer, typename >>> > __node_base_traits::pointer>::value), >>> > + "Allocator does not rebind pointers in a sane >>> > manner."); >>> > >>> > private: >>> > >>> > @@ -755,10 +871,10 @@ private: >>> > typedef typename __bucket_list_deleter::pointer >>> > __node_pointer_pointer; >>> > >>> > // --- Member data begin --- >>> > - __bucket_list __bucket_list_; >>> > - __compressed_pair<__first_node, __node_allocator> __p1_; >>> > - __compressed_pair<size_type, hasher> __p2_; >>> > - __compressed_pair<float, key_equal> __p3_; >>> > + __bucket_list >>> > __bucket_list_; >>> > + __compressed_pair<__first_node, __node_allocator> __p1_; >>> > + __compressed_pair<size_type, hasher> __p2_; >>> > + __compressed_pair<float, key_equal> __p3_; >>> > // --- Member data end --- >>> > >>> > _LIBCPP_INLINE_VISIBILITY >>> > >>> > Modified: libcxx/trunk/include/ext/hash_map >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/ext/hash_map?rev=260431&r1=260430&r2=260431&view=diff >>> > >>> > ============================================================================== >>> > --- libcxx/trunk/include/ext/hash_map (original) >>> > +++ libcxx/trunk/include/ext/hash_map Wed Feb 10 14:46:23 2016 >>> > @@ -309,7 +309,7 @@ class __hash_map_node_destructor >>> > { >>> > typedef _Alloc allocator_type; >>> > typedef allocator_traits<allocator_type> __alloc_traits; >>> > - typedef typename __alloc_traits::value_type::value_type >>> > value_type; >>> > + typedef typename __alloc_traits::value_type::__node_value_type >>> > value_type; >>> > public: >>> > typedef typename __alloc_traits::pointer pointer; >>> > private: >>> > >>> > Modified: libcxx/trunk/include/unordered_map >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/unordered_map?rev=260431&r1=260430&r2=260431&view=diff >>> > >>> > ============================================================================== >>> > --- libcxx/trunk/include/unordered_map (original) >>> > +++ libcxx/trunk/include/unordered_map Wed Feb 10 14:46:23 2016 >>> > @@ -384,6 +384,7 @@ template <class _Key, class _Cp, class _ >>> > class __unordered_map_hasher >>> > : private _Hash >>> > { >>> > + typedef typename __key_value_types<_Cp>::__map_value_type _PairT; >>> > public: >>> > _LIBCPP_INLINE_VISIBILITY >>> > __unordered_map_hasher() >>> > @@ -414,6 +415,7 @@ class __unordered_map_hasher<_Key, _Cp, >>> > { >>> > _Hash __hash_; >>> > >>> > + typedef typename __key_value_types<_Cp>::__map_value_type _PairT; >>> > public: >>> > _LIBCPP_INLINE_VISIBILITY >>> > __unordered_map_hasher() >>> > @@ -455,6 +457,7 @@ template <class _Key, class _Cp, class _ >>> > class __unordered_map_equal >>> > : private _Pred >>> > { >>> > + typedef typename __key_value_types<_Cp>::__map_value_type _PairT; >>> > public: >>> > _LIBCPP_INLINE_VISIBILITY >>> > __unordered_map_equal() >>> > @@ -488,6 +491,7 @@ class __unordered_map_equal<_Key, _Cp, _ >>> > { >>> > _Pred __pred_; >>> > >>> > + typedef typename __key_value_types<_Cp>::__map_value_type _PairT; >>> > public: >>> > _LIBCPP_INLINE_VISIBILITY >>> > __unordered_map_equal() >>> > @@ -508,6 +512,9 @@ public: >>> > _LIBCPP_INLINE_VISIBILITY >>> > bool operator()(const _Key& __x, const _Cp& __y) const >>> > {return __pred_(__x, __y.__cc.first);} >>> > + _LIBCPP_INLINE_VISIBILITY >>> > + bool operator()(const _Key& __x, const _PairT& __y) const >>> > + {return __pred_(__x, __y.first);} >>> > void swap(__unordered_map_equal&__y) >>> > _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) >>> > { >>> > @@ -531,12 +538,11 @@ class __hash_map_node_destructor >>> > { >>> > typedef _Alloc allocator_type; >>> > typedef allocator_traits<allocator_type> __alloc_traits; >>> > - typedef typename __alloc_traits::value_type::value_type >>> > value_type; >>> > + >>> > public: >>> > - typedef typename __alloc_traits::pointer pointer; >>> > + >>> > + typedef typename __alloc_traits::pointer pointer; >>> > private: >>> > - typedef typename value_type::value_type::first_type >>> > first_type; >>> > - typedef typename value_type::value_type::second_type >>> > second_type; >>> > >>> > allocator_type& __na_; >>> > >>> > @@ -656,15 +662,14 @@ class _LIBCPP_TYPE_VIS_ONLY __hash_map_i >>> > { >>> > _HashIterator __i_; >>> > >>> > - typedef const typename >>> > _HashIterator::value_type::value_type::first_type key_type; >>> > - typedef typename >>> > _HashIterator::value_type::value_type::second_type mapped_type; >>> > + typedef __hash_node_types_from_iterator<_HashIterator> >>> > _NodeTypes; >>> > + >>> > public: >>> > typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef pair<key_type, mapped_type> >>> > value_type; >>> > - typedef typename _HashIterator::difference_type >>> > difference_type; >>> > + typedef typename _NodeTypes::__map_value_type >>> > value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > typedef value_type& >>> > reference; >>> > - typedef typename __rebind_pointer<typename _HashIterator::pointer, >>> > value_type>::type >>> > - pointer; >>> > + typedef typename _NodeTypes::__map_value_type_pointer >>> > pointer; >>> > >>> > _LIBCPP_INLINE_VISIBILITY >>> > __hash_map_iterator() _NOEXCEPT {} >>> > @@ -706,15 +711,14 @@ class _LIBCPP_TYPE_VIS_ONLY __hash_map_c >>> > { >>> > _HashIterator __i_; >>> > >>> > - typedef const typename >>> > _HashIterator::value_type::value_type::first_type key_type; >>> > - typedef typename >>> > _HashIterator::value_type::value_type::second_type mapped_type; >>> > + typedef __hash_node_types_from_iterator<_HashIterator> >>> > _NodeTypes; >>> > + >>> > public: >>> > typedef forward_iterator_tag >>> > iterator_category; >>> > - typedef pair<key_type, mapped_type> >>> > value_type; >>> > - typedef typename _HashIterator::difference_type >>> > difference_type; >>> > + typedef typename _NodeTypes::__map_value_type >>> > value_type; >>> > + typedef typename _NodeTypes::difference_type >>> > difference_type; >>> > typedef const value_type& >>> > reference; >>> > - typedef typename __rebind_pointer<typename _HashIterator::pointer, >>> > const value_type>::type >>> > - pointer; >>> > + typedef typename _NodeTypes::__const_map_value_type_pointer >>> > pointer; >>> > >>> > _LIBCPP_INLINE_VISIBILITY >>> > __hash_map_const_iterator() _NOEXCEPT {} >>> > @@ -796,8 +800,8 @@ private: >>> > public: >>> > typedef typename __alloc_traits::pointer pointer; >>> > typedef typename __alloc_traits::const_pointer const_pointer; >>> > - typedef typename __alloc_traits::size_type size_type; >>> > - typedef typename __alloc_traits::difference_type difference_type; >>> > + typedef typename __table::size_type size_type; >>> > + typedef typename __table::difference_type difference_type; >>> > >>> > typedef __hash_map_iterator<typename __table::iterator> >>> > iterator; >>> > typedef __hash_map_const_iterator<typename >>> > __table::const_iterator> const_iterator; >>> > @@ -1641,11 +1645,14 @@ private: >>> > typedef __hash_map_node_destructor<__node_allocator> _Dp; >>> > typedef unique_ptr<__node, _Dp> >>> > __node_holder; >>> > typedef allocator_traits<allocator_type> >>> > __alloc_traits; >>> > + static_assert((is_same<typename __node_traits::size_type, >>> > + typename __alloc_traits::size_type>::value), >>> > + "Allocator uses different size_type for different >>> > types"); >>> > public: >>> > typedef typename __alloc_traits::pointer pointer; >>> > typedef typename __alloc_traits::const_pointer const_pointer; >>> > - typedef typename __alloc_traits::size_type size_type; >>> > - typedef typename __alloc_traits::difference_type difference_type; >>> > + typedef typename __table::size_type size_type; >>> > + typedef typename __table::difference_type difference_type; >>> > >>> > typedef __hash_map_iterator<typename __table::iterator> >>> > iterator; >>> > typedef __hash_map_const_iterator<typename >>> > __table::const_iterator> const_iterator; >>> > >>> > Added: >>> > libcxx/trunk/test/libcxx/containers/unord/key_value_traits.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/containers/unord/key_value_traits.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- libcxx/trunk/test/libcxx/containers/unord/key_value_traits.pass.cpp >>> > (added) >>> > +++ libcxx/trunk/test/libcxx/containers/unord/key_value_traits.pass.cpp >>> > Wed Feb 10 14:46:23 2016 >>> > @@ -0,0 +1,59 @@ >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +#include <__hash_table> >>> > +#include <unordered_map> >>> > +#include <unordered_set> >>> > +#include <type_traits> >>> > + >>> > +#include "test_macros.h" >>> > +#include "min_allocator.h" >>> > + >>> > +void testKeyValueTrait() { >>> > + { >>> > + typedef int Tp; >>> > + typedef std::__key_value_types<Tp> Traits; >>> > + static_assert((std::is_same<Traits::key_type, int>::value), ""); >>> > + static_assert((std::is_same<Traits::__node_value_type, >>> > Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__container_value_type, >>> > Tp>::value), ""); >>> > + static_assert(Traits::__is_map == false, ""); >>> > + } >>> > + { >>> > + typedef std::pair<int, int> Tp; >>> > + typedef std::__key_value_types<Tp> Traits; >>> > + static_assert((std::is_same<Traits::key_type, Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__node_value_type, >>> > Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__container_value_type, >>> > Tp>::value), ""); >>> > + static_assert(Traits::__is_map == false, ""); >>> > + } >>> > + { >>> > + typedef std::pair<const int, int> Tp; >>> > + typedef std::__key_value_types<Tp> Traits; >>> > + static_assert((std::is_same<Traits::key_type, Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__node_value_type, >>> > Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__container_value_type, >>> > Tp>::value), ""); >>> > + static_assert(Traits::__is_map == false, ""); >>> > + } >>> > + { >>> > + typedef std::__hash_value_type<int, int> Tp; >>> > + typedef std::__key_value_types<Tp> Traits; >>> > + static_assert((std::is_same<Traits::key_type, int>::value), ""); >>> > + static_assert((std::is_same<Traits::mapped_type, int>::value), >>> > ""); >>> > + static_assert((std::is_same<Traits::__node_value_type, >>> > Tp>::value), ""); >>> > + static_assert((std::is_same<Traits::__container_value_type, >>> > + std::pair<const int, int> >::value), >>> > ""); >>> > + static_assert((std::is_same<Traits::__map_value_type, >>> > + std::pair<const int, int> >::value), >>> > ""); >>> > + static_assert(Traits::__is_map == true, ""); >>> > + } >>> > +} >>> > + >>> > +int main() { >>> > + testKeyValueTrait(); >>> > +} >>> > >>> > Added: >>> > libcxx/trunk/test/std/containers/unord/iterator_difference_type.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/iterator_difference_type.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > libcxx/trunk/test/std/containers/unord/iterator_difference_type.pass.cpp >>> > (added) >>> > +++ >>> > libcxx/trunk/test/std/containers/unord/iterator_difference_type.pass.cpp >>> > Wed >>> > Feb 10 14:46:23 2016 >>> > @@ -0,0 +1,154 @@ >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +#include <unordered_map> >>> > +#include <unordered_set> >>> > +#include <type_traits> >>> > + >>> > +#include "test_macros.h" >>> > +#include "min_allocator.h" >>> > +#include "test_allocator.h" >>> > + >>> > + >>> > +template <class Map, class ValueTp, class PtrT, class CPtrT> >>> > +void testUnorderedMap() { >>> > + typedef typename Map::difference_type Diff; >>> > + { >>> > + typedef typename Map::iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, >>> > ValueTp&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, PtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + } >>> > + { >>> > + typedef typename Map::const_iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, ValueTp >>> > const&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, CPtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + } >>> > + { >>> > + typedef typename Map::local_iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, >>> > ValueTp&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, PtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + } >>> > + { >>> > + typedef typename Map::const_local_iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, ValueTp >>> > const&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, CPtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + } >>> > +} >>> > + >>> > + >>> > +template <class Set, class ValueTp, class CPtrT> >>> > +void testUnorderedSet() { >>> > + static_assert((std::is_same<typename Set::iterator, >>> > + typename Set::const_iterator>::value), >>> > ""); >>> > + static_assert((std::is_same<typename Set::local_iterator, >>> > + typename >>> > Set::const_local_iterator>::value), ""); >>> > + typedef typename Set::difference_type Diff; >>> > + { >>> > + typedef typename Set::iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, ValueTp >>> > const&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, CPtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + >>> > + } >>> > + { >>> > + typedef typename Set::local_iterator It; >>> > + static_assert((std::is_same<typename It::value_type, >>> > ValueTp>::value), ""); >>> > + static_assert((std::is_same<typename It::reference, ValueTp >>> > const&>::value), ""); >>> > + static_assert((std::is_same<typename It::pointer, CPtrT>::value), >>> > ""); >>> > + static_assert((std::is_same<typename It::difference_type, >>> > Diff>::value), ""); >>> > + } >>> > +} >>> > + >>> > +int main() { >>> > + { >>> > + typedef std::unordered_map<int, int> Map; >>> > + typedef std::pair<const int, int> ValueTp; >>> > + testUnorderedMap<Map, ValueTp, ValueTp*, ValueTp const*>(); >>> > + } >>> > + { >>> > + typedef std::pair<const int, int> ValueTp; >>> > + typedef test_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_map<int, int, std::hash<int>, >>> > std::equal_to<int>, Alloc> Map; >>> > + testUnorderedMap<Map, ValueTp, ValueTp*, ValueTp const*>(); >>> > + } >>> > +#if TEST_STD_VER >= 11 >>> > + { >>> > + typedef std::pair<const int, int> ValueTp; >>> > + typedef min_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_map<int, int, std::hash<int>, >>> > std::equal_to<int>, Alloc> Map; >>> > + testUnorderedMap<Map, ValueTp, min_pointer<ValueTp>, >>> > min_pointer<const ValueTp>>(); >>> > + } >>> > +#endif >>> > + { >>> > + typedef std::unordered_multimap<int, int> Map; >>> > + typedef std::pair<const int, int> ValueTp; >>> > + testUnorderedMap<Map, ValueTp, ValueTp*, ValueTp const*>(); >>> > + } >>> > + { >>> > + typedef std::pair<const int, int> ValueTp; >>> > + typedef test_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_multimap<int, int, std::hash<int>, >>> > std::equal_to<int>, Alloc> Map; >>> > + testUnorderedMap<Map, ValueTp, ValueTp*, ValueTp const*>(); >>> > + } >>> > +#if TEST_STD_VER >= 11 >>> > + { >>> > + typedef std::pair<const int, int> ValueTp; >>> > + typedef min_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_multimap<int, int, std::hash<int>, >>> > std::equal_to<int>, Alloc> Map; >>> > + testUnorderedMap<Map, ValueTp, min_pointer<ValueTp>, >>> > min_pointer<const ValueTp>>(); >>> > + } >>> > +#endif >>> > + { >>> > + typedef int ValueTp; >>> > + typedef std::unordered_set<ValueTp> Set; >>> > + testUnorderedSet<Set, ValueTp, ValueTp const*>(); >>> > + } >>> > + { >>> > + typedef int ValueTp; >>> > + typedef test_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_set<ValueTp, std::hash<ValueTp>, >>> > std::equal_to<ValueTp>, Alloc> Set; >>> > + testUnorderedSet<Set, ValueTp, ValueTp const*>(); >>> > + } >>> > +#if TEST_STD_VER >= 11 >>> > + { >>> > + typedef int ValueTp; >>> > + typedef min_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_set<ValueTp, std::hash<ValueTp>, >>> > std::equal_to<ValueTp>, Alloc> Set; >>> > + testUnorderedSet<Set, ValueTp, min_pointer<const ValueTp>>(); >>> > + } >>> > +#endif >>> > + { >>> > + typedef int ValueTp; >>> > + typedef std::unordered_multiset<ValueTp> Set; >>> > + testUnorderedSet<Set, ValueTp, ValueTp const*>(); >>> > + } >>> > + { >>> > + typedef int ValueTp; >>> > + typedef test_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_multiset<ValueTp, std::hash<ValueTp>, >>> > std::equal_to<ValueTp>, Alloc> Set; >>> > + testUnorderedSet<Set, ValueTp, ValueTp const*>(); >>> > + } >>> > +#if TEST_STD_VER >= 11 >>> > + { >>> > + typedef int ValueTp; >>> > + typedef min_allocator<ValueTp> Alloc; >>> > + typedef std::unordered_multiset<ValueTp, std::hash<ValueTp>, >>> > std::equal_to<ValueTp>, Alloc> Set; >>> > + testUnorderedSet<Set, ValueTp, min_pointer<const ValueTp>>(); >>> > + } >>> > +#endif >>> > +} >>> > >>> > Added: >>> > libcxx/trunk/test/std/containers/unord/unord.map/incomplete_type.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/incomplete_type.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > libcxx/trunk/test/std/containers/unord/unord.map/incomplete_type.pass.cpp >>> > (added) >>> > +++ >>> > libcxx/trunk/test/std/containers/unord/unord.map/incomplete_type.pass.cpp >>> > Wed Feb 10 14:46:23 2016 >>> > @@ -0,0 +1,37 @@ >>> > + >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +// <unordered_map> >>> > + >>> > +// Check that std::unordered_map and it's iterators can be >>> > instantiated with an incomplete >>> > +// type. >>> > + >>> > +#include <unordered_map> >>> > + >>> > +template <class Tp> >>> > +struct MyHash { >>> > + MyHash() {} >>> > + std::size_t operator()(Tp const&) const {return 42;} >>> > +}; >>> > + >>> > +struct A { >>> > + typedef std::unordered_map<A, A, MyHash<A> > Map; >>> > + Map m; >>> > + Map::iterator it; >>> > + Map::const_iterator cit; >>> > + Map::local_iterator lit; >>> > + Map::const_local_iterator clit; >>> > +}; >>> > + >>> > +inline bool operator==(A const& L, A const& R) { return &L == &R; } >>> > + >>> > +int main() { >>> > + A a; >>> > +} >>> > >>> > Added: >>> > libcxx/trunk/test/std/containers/unord/unord.multimap/incomplete.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/incomplete.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > libcxx/trunk/test/std/containers/unord/unord.multimap/incomplete.pass.cpp >>> > (added) >>> > +++ >>> > libcxx/trunk/test/std/containers/unord/unord.multimap/incomplete.pass.cpp >>> > Wed Feb 10 14:46:23 2016 >>> > @@ -0,0 +1,37 @@ >>> > + >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +// <unordered_map> >>> > + >>> > +// Check that std::unordered_multimap and it's iterators can be >>> > instantiated with an incomplete >>> > +// type. >>> > + >>> > +#include <unordered_map> >>> > + >>> > +template <class Tp> >>> > +struct MyHash { >>> > + MyHash() {} >>> > + std::size_t operator()(Tp const&) const {return 42;} >>> > +}; >>> > + >>> > +struct A { >>> > + typedef std::unordered_multimap<A, A, MyHash<A> > Map; >>> > + Map m; >>> > + Map::iterator it; >>> > + Map::const_iterator cit; >>> > + Map::local_iterator lit; >>> > + Map::const_local_iterator clit; >>> > +}; >>> > + >>> > +inline bool operator==(A const& L, A const& R) { return &L == &R; } >>> > + >>> > +int main() { >>> > + A a; >>> > +} >>> > >>> > Added: >>> > libcxx/trunk/test/std/containers/unord/unord.multiset/incomplete.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multiset/incomplete.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > libcxx/trunk/test/std/containers/unord/unord.multiset/incomplete.pass.cpp >>> > (added) >>> > +++ >>> > libcxx/trunk/test/std/containers/unord/unord.multiset/incomplete.pass.cpp >>> > Wed Feb 10 14:46:23 2016 >>> > @@ -0,0 +1,38 @@ >>> > + >>> > + >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +// <unordered_set> >>> > + >>> > +// Check that std::unordered_multiset and it's iterators can be >>> > instantiated with an incomplete >>> > +// type. >>> > + >>> > +#include <unordered_set> >>> > + >>> > +template <class Tp> >>> > +struct MyHash { >>> > + MyHash() {} >>> > + std::size_t operator()(Tp const&) const {return 42;} >>> > +}; >>> > + >>> > +struct A { >>> > + typedef std::unordered_multiset<A, MyHash<A> > Map; >>> > + Map m; >>> > + Map::iterator it; >>> > + Map::const_iterator cit; >>> > + Map::local_iterator lit; >>> > + Map::const_local_iterator clit; >>> > +}; >>> > + >>> > +inline bool operator==(A const& L, A const& R) { return &L == &R; } >>> > + >>> > +int main() { >>> > + A a; >>> > +} >>> > >>> > Added: >>> > libcxx/trunk/test/std/containers/unord/unord.set/incomplete.pass.cpp >>> > URL: >>> > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.set/incomplete.pass.cpp?rev=260431&view=auto >>> > >>> > ============================================================================== >>> > --- >>> > libcxx/trunk/test/std/containers/unord/unord.set/incomplete.pass.cpp >>> > (added) >>> > +++ >>> > libcxx/trunk/test/std/containers/unord/unord.set/incomplete.pass.cpp Wed >>> > Feb >>> > 10 14:46:23 2016 >>> > @@ -0,0 +1,38 @@ >>> > + >>> > + >>> > >>> > +//===----------------------------------------------------------------------===// >>> > +// >>> > +// The LLVM Compiler Infrastructure >>> > +// >>> > +// This file is dual licensed under the MIT and the University of >>> > Illinois Open >>> > +// Source Licenses. See LICENSE.TXT for details. >>> > +// >>> > >>> > +//===----------------------------------------------------------------------===// >>> > + >>> > +// <unordered_set> >>> > + >>> > +// Check that std::unordered_set and it's iterators can be >>> > instantiated with an incomplete >>> > +// type. >>> > + >>> > +#include <unordered_set> >>> > + >>> > +template <class Tp> >>> > +struct MyHash { >>> > + MyHash() {} >>> > + std::size_t operator()(Tp const&) const {return 42;} >>> > +}; >>> > + >>> > +struct A { >>> > + typedef std::unordered_set<A, MyHash<A> > Map; >>> > + Map m; >>> > + Map::iterator it; >>> > + Map::const_iterator cit; >>> > + Map::local_iterator lit; >>> > + Map::const_local_iterator clit; >>> > +}; >>> > + >>> > +inline bool operator==(A const& L, A const& R) { return &L == &R; } >>> > + >>> > +int main() { >>> > + A a; >>> > +} >>> > >>> > >>> > _______________________________________________ >>> > cfe-commits mailing list >>> > cfe-commits@lists.llvm.org >>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits