I'd rather not take this actually, as it looks like a large change, isn't fixing a regression, and it's time to start wrapping up the release.
On Wed, Aug 17, 2016 at 3:46 AM, Dimitry Andric <dimi...@andric.com> wrote: > Marshall, this is maybe a good candidate for merging to release_39? > > -Dimitry > >> On 17 Aug 2016, at 07:58, Marshall Clow via cfe-commits >> <cfe-commits@lists.llvm.org> wrote: >> >> Author: marshall >> Date: Wed Aug 17 00:58:40 2016 >> New Revision: 278904 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=278904&view=rev >> Log: >> Support allocators with explicit conversion constructors. Fixes bug #29000 >> >> Modified: >> libcxx/trunk/include/map >> libcxx/trunk/include/unordered_map >> libcxx/trunk/test/std/containers/associative/map/map.cons/alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp >> libcxx/trunk/test/std/containers/associative/map/map.cons/default.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp >> libcxx/trunk/test/std/containers/associative/set/set.cons/default.pass.cpp >> libcxx/trunk/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp >> libcxx/trunk/test/std/containers/sequences/list/list.cons/default.pass.cpp >> >> libcxx/trunk/test/std/containers/sequences/vector.bool/construct_default.pass.cpp >> >> libcxx/trunk/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp >> >> libcxx/trunk/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp >> libcxx/trunk/test/std/strings/basic.string/string.cons/alloc.pass.cpp >> libcxx/trunk/test/support/min_allocator.h >> >> Modified: libcxx/trunk/include/map >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/map?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- libcxx/trunk/include/map (original) >> +++ libcxx/trunk/include/map Wed Aug 17 00:58:40 2016 >> @@ -873,7 +873,7 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> explicit map(const key_compare& __comp, const allocator_type& __a) >> - : __tree_(__vc(__comp), __a) {} >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} >> >> template <class _InputIterator> >> _LIBCPP_INLINE_VISIBILITY >> @@ -888,7 +888,7 @@ public: >> _LIBCPP_INLINE_VISIBILITY >> map(_InputIterator __f, _InputIterator __l, >> const key_compare& __comp, const allocator_type& __a) >> - : __tree_(__vc(__comp), __a) >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) >> { >> insert(__f, __l); >> } >> @@ -955,7 +955,7 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> map(initializer_list<value_type> __il, const key_compare& __comp, const >> allocator_type& __a) >> - : __tree_(__vc(__comp), __a) >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) >> { >> insert(__il.begin(), __il.end()); >> } >> @@ -977,13 +977,13 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> explicit map(const allocator_type& __a) >> - : __tree_(__a) >> + : __tree_(typename __base::allocator_type(__a)) >> { >> } >> >> _LIBCPP_INLINE_VISIBILITY >> map(const map& __m, const allocator_type& __a) >> - : __tree_(__m.__tree_.value_comp(), __a) >> + : __tree_(__m.__tree_.value_comp(), typename >> __base::allocator_type(__a)) >> { >> insert(__m.begin(), __m.end()); >> } >> @@ -1034,7 +1034,7 @@ public: >> const mapped_type& at(const key_type& __k) const; >> >> _LIBCPP_INLINE_VISIBILITY >> - allocator_type get_allocator() const _NOEXCEPT {return >> __tree_.__alloc();} >> + allocator_type get_allocator() const _NOEXCEPT {return >> allocator_type(__tree_.__alloc());} >> _LIBCPP_INLINE_VISIBILITY >> key_compare key_comp() const {return >> __tree_.value_comp().key_comp();} >> _LIBCPP_INLINE_VISIBILITY >> @@ -1367,7 +1367,7 @@ map<_Key, _Tp, _Compare, _Allocator>::__ >> >> template <class _Key, class _Tp, class _Compare, class _Allocator> >> map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& >> __a) >> - : __tree_(_VSTD::move(__m.__tree_), __a) >> + : __tree_(_VSTD::move(__m.__tree_), typename >> __base::allocator_type(__a)) >> { >> if (__a != __m.get_allocator()) >> { >> @@ -1599,7 +1599,7 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> explicit multimap(const key_compare& __comp, const allocator_type& __a) >> - : __tree_(__vc(__comp), __a) {} >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} >> >> template <class _InputIterator> >> _LIBCPP_INLINE_VISIBILITY >> @@ -1614,7 +1614,7 @@ public: >> _LIBCPP_INLINE_VISIBILITY >> multimap(_InputIterator __f, _InputIterator __l, >> const key_compare& __comp, const allocator_type& __a) >> - : __tree_(__vc(__comp), __a) >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) >> { >> insert(__f, __l); >> } >> @@ -1682,7 +1682,7 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> multimap(initializer_list<value_type> __il, const key_compare& __comp, >> const allocator_type& __a) >> - : __tree_(__vc(__comp), __a) >> + : __tree_(__vc(__comp), typename __base::allocator_type(__a)) >> { >> insert(__il.begin(), __il.end()); >> } >> @@ -1704,13 +1704,13 @@ public: >> >> _LIBCPP_INLINE_VISIBILITY >> explicit multimap(const allocator_type& __a) >> - : __tree_(__a) >> + : __tree_(typename __base::allocator_type(__a)) >> { >> } >> >> _LIBCPP_INLINE_VISIBILITY >> multimap(const multimap& __m, const allocator_type& __a) >> - : __tree_(__m.__tree_.value_comp(), __a) >> + : __tree_(__m.__tree_.value_comp(), typename >> __base::allocator_type(__a)) >> { >> insert(__m.begin(), __m.end()); >> } >> @@ -1752,7 +1752,7 @@ public: >> size_type max_size() const _NOEXCEPT {return __tree_.max_size();} >> >> _LIBCPP_INLINE_VISIBILITY >> - allocator_type get_allocator() const _NOEXCEPT {return >> __tree_.__alloc();} >> + allocator_type get_allocator() const _NOEXCEPT {return >> allocator_type(__tree_.__alloc());} >> _LIBCPP_INLINE_VISIBILITY >> key_compare key_comp() const {return __tree_.value_comp().key_comp();} >> _LIBCPP_INLINE_VISIBILITY >> @@ -1923,7 +1923,7 @@ private: >> #ifndef _LIBCPP_CXX03_LANG >> template <class _Key, class _Tp, class _Compare, class _Allocator> >> multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const >> allocator_type& __a) >> - : __tree_(_VSTD::move(__m.__tree_), __a) >> + : __tree_(_VSTD::move(__m.__tree_), typename >> __base::allocator_type(__a)) >> { >> if (__a != __m.get_allocator()) >> { >> >> Modified: libcxx/trunk/include/unordered_map >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/unordered_map?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- libcxx/trunk/include/unordered_map (original) >> +++ libcxx/trunk/include/unordered_map Wed Aug 17 00:58:40 2016 >> @@ -1185,7 +1185,7 @@ template <class _Key, class _Tp, class _ >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> size_type __n, const hasher& __hf, const key_equal& __eql, >> const allocator_type& __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1197,7 +1197,7 @@ template <class _Key, class _Tp, class _ >> inline >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> const allocator_type& __a) >> - : __table_(__a) >> + : __table_(typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1234,7 +1234,7 @@ template <class _InputIterator> >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> _InputIterator __first, _InputIterator __last, size_type __n, >> const hasher& __hf, const key_equal& __eql, const allocator_type& >> __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1258,7 +1258,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _ >> template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> const unordered_map& __u, const allocator_type& __a) >> - : __table_(__u.__table_, __a) >> + : __table_(__u.__table_, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1285,7 +1285,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _ >> template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> unordered_map&& __u, const allocator_type& __a) >> - : __table_(_VSTD::move(__u.__table_), __a) >> + : __table_(_VSTD::move(__u.__table_), typename >> __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1335,7 +1335,7 @@ template <class _Key, class _Tp, class _ >> unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( >> initializer_list<value_type> __il, size_type __n, const hasher& __hf, >> const key_equal& __eql, const allocator_type& __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1820,7 +1820,7 @@ template <class _Key, class _Tp, class _ >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> size_type __n, const hasher& __hf, const key_equal& __eql, >> const allocator_type& __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1858,7 +1858,7 @@ template <class _InputIterator> >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> _InputIterator __first, _InputIterator __last, size_type __n, >> const hasher& __hf, const key_equal& __eql, const allocator_type& >> __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1871,7 +1871,7 @@ template <class _Key, class _Tp, class _ >> inline >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> const allocator_type& __a) >> - : __table_(__a) >> + : __table_(typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1893,7 +1893,7 @@ unordered_multimap<_Key, _Tp, _Hash, _Pr >> template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> const unordered_multimap& __u, const allocator_type& __a) >> - : __table_(__u.__table_, __a) >> + : __table_(__u.__table_, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1920,7 +1920,7 @@ unordered_multimap<_Key, _Tp, _Hash, _Pr >> template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> unordered_multimap&& __u, const allocator_type& __a) >> - : __table_(_VSTD::move(__u.__table_), __a) >> + : __table_(_VSTD::move(__u.__table_), typename >> __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> @@ -1972,7 +1972,7 @@ template <class _Key, class _Tp, class _ >> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( >> initializer_list<value_type> __il, size_type __n, const hasher& __hf, >> const key_equal& __eql, const allocator_type& __a) >> - : __table_(__hf, __eql, __a) >> + : __table_(__hf, __eql, typename __table::allocator_type(__a)) >> { >> #if _LIBCPP_DEBUG_LEVEL >= 2 >> __get_db()->__insert_c(this); >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- libcxx/trunk/test/std/containers/associative/map/map.cons/alloc.pass.cpp >> (original) >> +++ libcxx/trunk/test/std/containers/associative/map/map.cons/alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -38,5 +38,13 @@ int main() >> assert(m.begin() == m.end()); >> assert(m.get_allocator() == A()); >> } >> + { >> + typedef std::less<int> C; >> + typedef explicit_allocator<std::pair<const int, double> > A; >> + std::map<int, double, C, A> m(A{}); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + assert(m.get_allocator() == A()); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -41,5 +41,14 @@ int main() >> assert(m.key_comp() == C(4)); >> assert(m.get_allocator() == A()); >> } >> + { >> + typedef test_compare<std::less<int> > C; >> + typedef explicit_allocator<std::pair<const int, double> > A; >> + std::map<int, double, C, A> m(C(4), A{}); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + assert(m.key_comp() == C(4)); >> + assert(m.get_allocator() == A{}); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -91,5 +91,39 @@ int main() >> assert(*next(mo.begin()) == V(2, 1)); >> assert(*next(mo.begin(), 2) == V(3, 1)); >> } >> + { >> + typedef std::pair<const int, double> V; >> + V ar[] = >> + { >> + V(1, 1), >> + V(1, 1.5), >> + V(1, 2), >> + V(2, 1), >> + V(2, 1.5), >> + V(2, 2), >> + V(3, 1), >> + V(3, 1.5), >> + V(3, 2), >> + }; >> + typedef test_compare<std::less<int> > C; >> + typedef explicit_allocator<V> A; >> + std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), >> A{}); >> + std::map<int, double, C, A> m(mo, A{}); >> + assert(m.get_allocator() == A()); >> + assert(m.key_comp() == C(5)); >> + assert(m.size() == 3); >> + assert(distance(m.begin(), m.end()) == 3); >> + assert(*m.begin() == V(1, 1)); >> + assert(*next(m.begin()) == V(2, 1)); >> + assert(*next(m.begin(), 2) == V(3, 1)); >> + >> + assert(mo.get_allocator() == A()); >> + assert(mo.key_comp() == C(5)); >> + assert(mo.size() == 3); >> + assert(distance(mo.begin(), mo.end()) == 3); >> + assert(*mo.begin() == V(1, 1)); >> + assert(*next(mo.begin()) == V(2, 1)); >> + assert(*next(mo.begin(), 2) == V(3, 1)); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -32,6 +32,20 @@ int main() >> assert(m.begin() == m.end()); >> } >> { >> + typedef explicit_allocator<std::pair<const int, double>> A; >> + { >> + std::map<int, double, std::less<int>, A> m; >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + { >> + A a; >> + std::map<int, double, std::less<int>, A> m(a); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + } >> + { >> std::map<int, double> m = {}; >> assert(m.empty()); >> assert(m.begin() == m.end()); >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -69,7 +69,7 @@ int main() >> assert(m.key_comp() == C(3)); >> assert(m.get_allocator() == A()); >> } >> -#if _LIBCPP_STD_VER > 11 >> +#if TEST_STD_VER > 11 >> { >> typedef std::pair<const int, double> V; >> typedef min_allocator<V> A; >> @@ -95,6 +95,30 @@ int main() >> assert(m.get_allocator() == a); >> } >> #endif >> + { >> + typedef std::pair<const int, double> V; >> + typedef explicit_allocator<V> A; >> + typedef test_compare<std::less<int> > C; >> + A a; >> + std::map<int, double, C, A> m({ >> + {1, 1}, >> + {1, 1.5}, >> + {1, 2}, >> + {2, 1}, >> + {2, 1.5}, >> + {2, 2}, >> + {3, 1}, >> + {3, 1.5}, >> + {3, 2} >> + }, C(3), a); >> + assert(m.size() == 3); >> + assert(distance(m.begin(), m.end()) == 3); >> + assert(*m.begin() == V(1, 1)); >> + assert(*next(m.begin()) == V(2, 1)); >> + assert(*next(m.begin(), 2) == V(3, 1)); >> + assert(m.key_comp() == C(3)); >> + assert(m.get_allocator() == a); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -90,6 +90,7 @@ int main() >> V(3, 1.5), >> V(3, 2), >> }; >> + { >> typedef std::pair<const int, double> V; >> typedef min_allocator<V> A; >> typedef test_compare<std::less<int> > C; >> @@ -103,6 +104,21 @@ int main() >> assert(*next(m.begin(), 2) == V(3, 1)); >> assert(m.get_allocator() == a); >> } >> + { >> + typedef std::pair<const int, double> V; >> + typedef explicit_allocator<V> A; >> + typedef test_compare<std::less<int> > C; >> + A a; >> + std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), a ); >> + >> + assert(m.size() == 3); >> + assert(distance(m.begin(), m.end()) == 3); >> + assert(*m.begin() == V(1, 1)); >> + assert(*next(m.begin()) == V(2, 1)); >> + assert(*next(m.begin(), 2) == V(3, 1)); >> + assert(m.get_allocator() == a); >> + } >> + } >> #endif >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -229,6 +229,45 @@ int main() >> assert(m3.key_comp() == C(5)); >> assert(m1.empty()); >> } >> + { >> + typedef std::pair<MoveOnly, MoveOnly> V; >> + typedef std::pair<const MoveOnly, MoveOnly> VC; >> + typedef test_compare<std::less<MoveOnly> > C; >> + typedef explicit_allocator<VC> A; >> + typedef std::map<MoveOnly, MoveOnly, C, A> M; >> + typedef std::move_iterator<V*> I; >> + V a1[] = >> + { >> + V(1, 1), >> + V(1, 2), >> + V(1, 3), >> + V(2, 1), >> + V(2, 2), >> + V(2, 3), >> + V(3, 1), >> + V(3, 2), >> + V(3, 3) >> + }; >> + M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A{}); >> + V a2[] = >> + { >> + V(1, 1), >> + V(1, 2), >> + V(1, 3), >> + V(2, 1), >> + V(2, 2), >> + V(2, 3), >> + V(3, 1), >> + V(3, 2), >> + V(3, 3) >> + }; >> + M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A{}); >> + M m3(std::move(m1), A{}); >> + assert(m3 == m2); >> + assert(m3.get_allocator() == A{}); >> + assert(m3.key_comp() == C(5)); >> + assert(m1.empty()); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -38,5 +38,13 @@ int main() >> assert(m.begin() == m.end()); >> assert(m.get_allocator() == A()); >> } >> + { >> + typedef std::less<int> C; >> + typedef explicit_allocator<std::pair<const int, double> > A; >> + std::multimap<int, double, C, A> m(A{}); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + assert(m.get_allocator() == A{}); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -41,5 +41,14 @@ int main() >> assert(m.key_comp() == C(4)); >> assert(m.get_allocator() == A()); >> } >> + { >> + typedef test_compare<std::less<int> > C; >> + typedef explicit_allocator<std::pair<const int, double> > A; >> + std::multimap<int, double, C, A> m(C(4), A{}); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + assert(m.key_comp() == C(4)); >> + assert(m.get_allocator() == A{}); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -73,5 +73,30 @@ int main() >> assert(mo.get_allocator() == A()); >> assert(mo.key_comp() == C(5)); >> } >> + { >> + typedef std::pair<const int, double> V; >> + V ar[] = >> + { >> + V(1, 1), >> + V(1, 1.5), >> + V(1, 2), >> + V(2, 1), >> + V(2, 1.5), >> + V(2, 2), >> + V(3, 1), >> + V(3, 1.5), >> + V(3, 2), >> + }; >> + typedef test_compare<std::less<int> > C; >> + typedef explicit_allocator<V> A; >> + std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), >> C(5), A{}); >> + std::multimap<int, double, C, A> m(mo, A{}); >> + assert(m == mo); >> + assert(m.get_allocator() == A{}); >> + assert(m.key_comp() == C(5)); >> + >> + assert(mo.get_allocator() == A{}); >> + assert(mo.key_comp() == C(5)); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -32,6 +32,20 @@ int main() >> assert(m.begin() == m.end()); >> } >> { >> + typedef explicit_allocator<std::pair<const int, double>> A; >> + { >> + std::multimap<int, double, std::less<int>, A> m; >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + { >> + A a; >> + std::multimap<int, double, std::less<int>, A> m(a); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + } >> + { >> std::multimap<int, double> m = {}; >> assert(m.empty()); >> assert(m.begin() == m.end()); >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -92,7 +92,7 @@ int main() >> assert(m.key_comp() == Cmp(4)); >> assert(m.get_allocator() == A()); >> } >> -#if _LIBCPP_STD_VER > 11 >> +#if TEST_STD_VER > 11 >> { >> typedef test_compare<std::less<int> > C; >> typedef std::pair<const int, double> V; >> @@ -125,5 +125,39 @@ int main() >> assert(m.get_allocator() == a); >> } >> #endif >> + { >> + typedef test_compare<std::less<int> > Cmp; >> + typedef explicit_allocator<std::pair<const int, double> > A; >> + typedef std::multimap<int, double, Cmp, A> C; >> + typedef C::value_type V; >> + C m( >> + { >> + {1, 1}, >> + {1, 1.5}, >> + {1, 2}, >> + {2, 1}, >> + {2, 1.5}, >> + {2, 2}, >> + {3, 1}, >> + {3, 1.5}, >> + {3, 2} >> + }, >> + Cmp(4), A{} >> + ); >> + assert(m.size() == 9); >> + assert(distance(m.begin(), m.end()) == 9); >> + C::const_iterator i = m.cbegin(); >> + assert(*i == V(1, 1)); >> + assert(*++i == V(1, 1.5)); >> + assert(*++i == V(1, 2)); >> + assert(*++i == V(2, 1)); >> + assert(*++i == V(2, 1.5)); >> + assert(*++i == V(2, 2)); >> + assert(*++i == V(3, 1)); >> + assert(*++i == V(3, 1.5)); >> + assert(*++i == V(3, 2)); >> + assert(m.key_comp() == Cmp(4)); >> + assert(m.get_allocator() == A{}); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -87,5 +87,36 @@ int main() >> assert(*next(m.begin(), 7) == V(3, 1.5)); >> assert(*next(m.begin(), 8) == V(3, 2)); >> } >> + { >> + typedef std::pair<const int, double> V; >> + V ar[] = >> + { >> + V(1, 1), >> + V(1, 1.5), >> + V(1, 2), >> + V(2, 1), >> + V(2, 1.5), >> + V(2, 2), >> + V(3, 1), >> + V(3, 1.5), >> + V(3, 2), >> + }; >> + typedef test_compare<std::less<int> > C; >> + typedef explicit_allocator<V> A; >> + std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), >> C(5), A{}); >> + assert(m.get_allocator() == A{}); >> + assert(m.key_comp() == C(5)); >> + assert(m.size() == 9); >> + assert(distance(m.begin(), m.end()) == 9); >> + assert(*m.begin() == V(1, 1)); >> + assert(*next(m.begin()) == V(1, 1.5)); >> + assert(*next(m.begin(), 2) == V(1, 2)); >> + assert(*next(m.begin(), 3) == V(2, 1)); >> + assert(*next(m.begin(), 4) == V(2, 1.5)); >> + assert(*next(m.begin(), 5) == V(2, 2)); >> + assert(*next(m.begin(), 6) == V(3, 1)); >> + assert(*next(m.begin(), 7) == V(3, 1.5)); >> + assert(*next(m.begin(), 8) == V(3, 2)); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -229,6 +229,45 @@ int main() >> assert(m3.key_comp() == C(5)); >> assert(m1.empty()); >> } >> + { >> + typedef std::pair<MoveOnly, MoveOnly> V; >> + typedef std::pair<const MoveOnly, MoveOnly> VC; >> + typedef test_compare<std::less<MoveOnly> > C; >> + typedef explicit_allocator<VC> A; >> + typedef std::multimap<MoveOnly, MoveOnly, C, A> M; >> + typedef std::move_iterator<V*> I; >> + V a1[] = >> + { >> + V(1, 1), >> + V(1, 2), >> + V(1, 3), >> + V(2, 1), >> + V(2, 2), >> + V(2, 3), >> + V(3, 1), >> + V(3, 2), >> + V(3, 3) >> + }; >> + M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A{}); >> + V a2[] = >> + { >> + V(1, 1), >> + V(1, 2), >> + V(1, 3), >> + V(2, 1), >> + V(2, 2), >> + V(2, 3), >> + V(3, 1), >> + V(3, 2), >> + V(3, 3) >> + }; >> + M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A{}); >> + M m3(std::move(m1), A{}); >> + assert(m3 == m2); >> + assert(m3.get_allocator() == A{}); >> + assert(m3.key_comp() == C(5)); >> + assert(m1.empty()); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES >> } >> >> Modified: >> libcxx/trunk/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -32,6 +32,20 @@ int main() >> assert(m.begin() == m.end()); >> } >> { >> + typedef explicit_allocator<int> A; >> + { >> + std::multiset<int, std::less<int>, A> m; >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + { >> + A a; >> + std::multiset<int, std::less<int>, A> m(a); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + } >> + { >> std::multiset<int> m = {}; >> assert(m.empty()); >> assert(m.begin() == m.end()); >> >> Modified: >> libcxx/trunk/test/std/containers/associative/set/set.cons/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/set/set.cons/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/associative/set/set.cons/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/associative/set/set.cons/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -32,6 +32,20 @@ int main() >> assert(m.begin() == m.end()); >> } >> { >> + typedef explicit_allocator<int> A; >> + { >> + std::set<int, std::less<int>, A> m; >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + { >> + A a; >> + std::set<int, std::less<int>, A> m(a); >> + assert(m.empty()); >> + assert(m.begin() == m.end()); >> + } >> + } >> + { >> std::set<int> m = {}; >> assert(m.empty()); >> assert(m.begin() == m.end()); >> >> Modified: >> libcxx/trunk/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -34,5 +34,7 @@ int main() >> #if TEST_STD_VER >= 11 >> test<int>(min_allocator<int>()); >> test<NotConstructible>(min_allocator<NotConstructible>{}); >> + test<int>(explicit_allocator<int>()); >> + test<NotConstructible>(explicit_allocator<NotConstructible>{}); >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -37,5 +37,13 @@ int main() >> assert(c.get_allocator() == A()); >> assert(c.empty()); >> } >> + { >> + typedef explicit_allocator<NotConstructible> A; >> + typedef A::value_type T; >> + typedef std::forward_list<T, A> C; >> + C c(A{}); >> + assert(c.get_allocator() == A()); >> + assert(c.empty()); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/sequences/list/list.cons/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/list.cons/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/sequences/list/list.cons/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/sequences/list/list.cons/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -54,5 +54,15 @@ int main() >> assert(l.size() == 0); >> assert(std::distance(l.begin(), l.end()) == 0); >> } >> + { >> + std::list<int, explicit_allocator<int>> l; >> + assert(l.size() == 0); >> + assert(std::distance(l.begin(), l.end()) == 0); >> + } >> + { >> + std::list<int, explicit_allocator<int>> >> l((explicit_allocator<int>())); >> + assert(l.size() == 0); >> + assert(std::distance(l.begin(), l.end()) == 0); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/sequences/vector.bool/construct_default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector.bool/construct_default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/sequences/vector.bool/construct_default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/sequences/vector.bool/construct_default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -66,5 +66,9 @@ int main() >> test0<std::vector<bool, min_allocator<bool>> >(); >> test1<std::vector<bool, min_allocator<bool> > >(min_allocator<bool>()); >> } >> + { >> + test0<std::vector<bool, explicit_allocator<bool>> >(); >> + test1<std::vector<bool, explicit_allocator<bool> > >> >(explicit_allocator<bool>()); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -86,5 +86,17 @@ int main() >> std::vector<int, min_allocator<int> > v; >> assert(v.empty()); >> } >> + >> + { >> + test0<std::vector<int, explicit_allocator<int>> >(); >> + test0<std::vector<NotConstructible, >> explicit_allocator<NotConstructible>> >(); >> + test1<std::vector<int, explicit_allocator<int> > >> >(explicit_allocator<int>{}); >> + test1<std::vector<NotConstructible, >> explicit_allocator<NotConstructible> > > >> + (explicit_allocator<NotConstructible>{}); >> + } >> + { >> + std::vector<int, explicit_allocator<int> > v; >> + assert(v.empty()); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -66,7 +66,25 @@ int main() >> assert(c.load_factor() == 0); >> assert(c.max_load_factor() == 1); >> } >> -#if _LIBCPP_STD_VER > 11 >> + { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible>> A; >> + typedef std::unordered_map<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + C c(A{}); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A{}); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> +#if TEST_STD_VER > 11 >> { >> typedef NotConstructible T; >> typedef test_allocator<std::pair<const T, T>> A; >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -108,5 +108,44 @@ int main() >> assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) >> < FLT_EPSILON); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_map<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c0(a, a + sizeof(a)/sizeof(a[0]), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + C c(c0, A{}); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 4); >> + assert(c.at(1) == "one"); >> + assert(c.at(2) == "two"); >> + assert(c.at(3) == "three"); >> + assert(c.at(4) == "four"); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(!c.empty()); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -67,6 +67,39 @@ int main() >> assert(c.max_load_factor() == 1); >> } >> { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible>> A; >> + typedef std::unordered_map<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + { >> + C c; >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A()); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + { >> + A a; >> + C c(a); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == a); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + } >> + { >> std::unordered_map<int, int> c = {}; >> LIBCPP_ASSERT(c.bucket_count() == 0); >> assert(c.size() == 0); >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -104,6 +104,42 @@ int main() >> assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) >> < FLT_EPSILON); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_map<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + C c({ >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }, >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 4); >> + assert(c.at(1) == "one"); >> + assert(c.at(2) == "two"); >> + assert(c.at(3) == "three"); >> + assert(c.at(4) == "four"); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(!c.empty()); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -154,6 +154,47 @@ int main() >> >> assert(c0.empty()); >> } >> + { >> + typedef std::pair<int, std::string> P; >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_map<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c0(a, a + sizeof(a)/sizeof(a[0]), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + C c(std::move(c0), A{}); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 4); >> + assert(c.at(1) == "one"); >> + assert(c.at(2) == "two"); >> + assert(c.at(3) == "three"); >> + assert(c.at(4) == "four"); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(!c.empty()); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + >> + assert(c0.empty()); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -111,5 +111,43 @@ int main() >> assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) >> < FLT_EPSILON); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_map<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c(input_iterator<P*>(a), input_iterator<P*>(a + >> sizeof(a)/sizeof(a[0])), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 4); >> + assert(c.at(1) == "one"); >> + assert(c.at(2) == "two"); >> + assert(c.at(3) == "three"); >> + assert(c.at(4) == "four"); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(!c.empty()); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -74,5 +74,27 @@ int main() >> assert(c.load_factor() == 0); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible> > A; >> + typedef std::unordered_map<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + C c(7, >> + test_hash<std::hash<NotConstructible> >(8), >> + test_compare<std::equal_to<NotConstructible> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -66,6 +66,24 @@ int main() >> assert(c.load_factor() == 0); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible>> A; >> + typedef std::unordered_multimap<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + C c(A{}); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A{}); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> #if _LIBCPP_STD_VER > 11 >> { >> typedef NotConstructible T; >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -136,5 +136,58 @@ int main() >> assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) >> < FLT_EPSILON); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_multimap<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c0(a, a + sizeof(a)/sizeof(a[0]), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + C c(c0, A{}); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 6); >> + C::const_iterator i = c.cbegin(); >> + assert(i->first == 1); >> + assert(i->second == "one"); >> + ++i; >> + assert(i->first == 1); >> + assert(i->second == "four"); >> + ++i; >> + assert(i->first == 2); >> + assert(i->second == "two"); >> + ++i; >> + assert(i->first == 2); >> + assert(i->second == "four"); >> + ++i; >> + assert(i->first == 3); >> + assert(i->second == "three"); >> + ++i; >> + assert(i->first == 4); >> + assert(i->second == "four"); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(!c.empty()); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -67,6 +67,39 @@ int main() >> assert(c.max_load_factor() == 1); >> } >> { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible>> A; >> + typedef std::unordered_multimap<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + { >> + C c; >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A()); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + { >> + A a; >> + C c(a); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == a); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + } >> + { >> std::unordered_multimap<int, int> c = {}; >> LIBCPP_ASSERT(c.bucket_count() == 0); >> assert(c.size() == 0); >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -148,6 +148,65 @@ int main() >> assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> assert((c.get_allocator() == min_allocator<std::pair<const int, >> std::string> >())); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_multimap<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + C c({ >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }, >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 6); >> + typedef std::pair<C::const_iterator, C::const_iterator> Eq; >> + Eq eq = c.equal_range(1); >> + assert(std::distance(eq.first, eq.second) == 2); >> + C::const_iterator i = eq.first; >> + assert(i->first == 1); >> + assert(i->second == "one"); >> + ++i; >> + assert(i->first == 1); >> + assert(i->second == "four"); >> + eq = c.equal_range(2); >> + assert(std::distance(eq.first, eq.second) == 2); >> + i = eq.first; >> + assert(i->first == 2); >> + assert(i->second == "two"); >> + ++i; >> + assert(i->first == 2); >> + assert(i->second == "four"); >> + >> + eq = c.equal_range(3); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 3); >> + assert(i->second == "three"); >> + eq = c.equal_range(4); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 4); >> + assert(i->second == "four"); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -225,6 +225,70 @@ int main() >> >> assert(c0.empty()); >> } >> + { >> + typedef std::pair<int, std::string> P; >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_multimap<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c0(a, a + sizeof(a)/sizeof(a[0]), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + C c(std::move(c0), A()); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 6); >> + typedef std::pair<C::const_iterator, C::const_iterator> Eq; >> + Eq eq = c.equal_range(1); >> + assert(std::distance(eq.first, eq.second) == 2); >> + C::const_iterator i = eq.first; >> + assert(i->first == 1); >> + assert(i->second == "one"); >> + ++i; >> + assert(i->first == 1); >> + assert(i->second == "four"); >> + eq = c.equal_range(2); >> + assert(std::distance(eq.first, eq.second) == 2); >> + i = eq.first; >> + assert(i->first == 2); >> + assert(i->second == "two"); >> + ++i; >> + assert(i->first == 2); >> + assert(i->second == "four"); >> + >> + eq = c.equal_range(3); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 3); >> + assert(i->second == "three"); >> + eq = c.equal_range(4); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 4); >> + assert(i->second == "four"); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{}); >> + >> + assert(c0.empty()); >> + } >> #endif >> #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -155,5 +155,66 @@ int main() >> assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> assert((c.get_allocator() == min_allocator<std::pair<const int, >> std::string> >())); >> } >> + { >> + typedef explicit_allocator<std::pair<const int, std::string>> A; >> + typedef std::unordered_multimap<int, std::string, >> + test_hash<std::hash<int> >, >> + test_compare<std::equal_to<int> >, >> + A >> + > C; >> + typedef std::pair<int, std::string> P; >> + P a[] = >> + { >> + P(1, "one"), >> + P(2, "two"), >> + P(3, "three"), >> + P(4, "four"), >> + P(1, "four"), >> + P(2, "four"), >> + }; >> + C c(input_iterator<P*>(a), input_iterator<P*>(a + >> sizeof(a)/sizeof(a[0])), >> + 7, >> + test_hash<std::hash<int> >(8), >> + test_compare<std::equal_to<int> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.size() == 6); >> + typedef std::pair<C::const_iterator, C::const_iterator> Eq; >> + Eq eq = c.equal_range(1); >> + assert(std::distance(eq.first, eq.second) == 2); >> + C::const_iterator i = eq.first; >> + assert(i->first == 1); >> + assert(i->second == "one"); >> + ++i; >> + assert(i->first == 1); >> + assert(i->second == "four"); >> + eq = c.equal_range(2); >> + assert(std::distance(eq.first, eq.second) == 2); >> + i = eq.first; >> + assert(i->first == 2); >> + assert(i->second == "two"); >> + ++i; >> + assert(i->first == 2); >> + assert(i->second == "four"); >> + >> + eq = c.equal_range(3); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 3); >> + assert(i->second == "three"); >> + eq = c.equal_range(4); >> + assert(std::distance(eq.first, eq.second) == 1); >> + i = eq.first; >> + assert(i->first == 4); >> + assert(i->second == "four"); >> + assert(std::distance(c.begin(), c.end()) == c.size()); >> + assert(std::distance(c.cbegin(), c.cend()) == c.size()); >> + assert(std::fabs(c.load_factor() - >> (float)c.size()/c.bucket_count()) < FLT_EPSILON); >> + assert(c.max_load_factor() == 1); >> + assert(c.hash_function() == test_hash<std::hash<int> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<int> >(9)); >> + assert(c.get_allocator() == A{});; >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -74,5 +74,27 @@ int main() >> assert(c.load_factor() == 0); >> assert(c.max_load_factor() == 1); >> } >> + { >> + typedef explicit_allocator<std::pair<const NotConstructible, >> NotConstructible> > A; >> + typedef std::unordered_multimap<NotConstructible, NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + C c(7, >> + test_hash<std::hash<NotConstructible> >(8), >> + test_compare<std::equal_to<NotConstructible> >(9), >> + A{} >> + ); >> + LIBCPP_ASSERT(c.bucket_count() == 7); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >(8)); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >(9)); >> + assert(c.get_allocator() == A{}); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> #endif >> } >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -63,6 +63,39 @@ int main() >> assert(c.max_load_factor() == 1); >> } >> { >> + typedef explicit_allocator<NotConstructible> A; >> + typedef std::unordered_multiset<NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + { >> + C c; >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A()); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + { >> + A a; >> + C c(a); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == a); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + } >> + { >> std::unordered_multiset<int> c = {}; >> LIBCPP_ASSERT(c.bucket_count() == 0); >> assert(c.size() == 0); >> >> Modified: >> libcxx/trunk/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- >> libcxx/trunk/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp >> (original) >> +++ >> libcxx/trunk/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -63,6 +63,39 @@ int main() >> assert(c.max_load_factor() == 1); >> } >> { >> + typedef explicit_allocator<NotConstructible> A; >> + typedef std::unordered_set<NotConstructible, >> + test_hash<std::hash<NotConstructible> >, >> + >> test_compare<std::equal_to<NotConstructible> >, >> + A >> + > C; >> + { >> + C c; >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == A()); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + { >> + A a; >> + C c(a); >> + LIBCPP_ASSERT(c.bucket_count() == 0); >> + assert(c.hash_function() == test_hash<std::hash<NotConstructible> >> >()); >> + assert(c.key_eq() == test_compare<std::equal_to<NotConstructible> >> >()); >> + assert(c.get_allocator() == a); >> + assert(c.size() == 0); >> + assert(c.empty()); >> + assert(std::distance(c.begin(), c.end()) == 0); >> + assert(c.load_factor() == 0); >> + assert(c.max_load_factor() == 1); >> + } >> + } >> + { >> std::unordered_set<int> c = {}; >> LIBCPP_ASSERT(c.bucket_count() == 0); >> assert(c.size() == 0); >> >> Modified: >> libcxx/trunk/test/std/strings/basic.string/string.cons/alloc.pass.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/string.cons/alloc.pass.cpp?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- libcxx/trunk/test/std/strings/basic.string/string.cons/alloc.pass.cpp >> (original) >> +++ libcxx/trunk/test/std/strings/basic.string/string.cons/alloc.pass.cpp >> Wed Aug 17 00:58:40 2016 >> @@ -91,5 +91,6 @@ int main() >> test<std::basic_string<char, std::char_traits<char>, >> test_allocator<char> > >(); >> #if TEST_STD_VER >= 11 >> test2<std::basic_string<char, std::char_traits<char>, >> min_allocator<char> > >(); >> + test2<std::basic_string<char, std::char_traits<char>, >> explicit_allocator<char> > >(); >> #endif >> } >> >> Modified: libcxx/trunk/test/support/min_allocator.h >> URL: >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/min_allocator.h?rev=278904&r1=278903&r2=278904&view=diff >> ============================================================================== >> --- libcxx/trunk/test/support/min_allocator.h (original) >> +++ libcxx/trunk/test/support/min_allocator.h Wed Aug 17 00:58:40 2016 >> @@ -340,6 +340,31 @@ public: >> friend bool operator!=(min_allocator x, min_allocator y) {return !(x == >> y);} >> }; >> >> +template <class T> >> +class explicit_allocator >> +{ >> +public: >> + typedef T value_type; >> + >> + explicit_allocator() TEST_NOEXCEPT {} >> + >> + template <class U> >> + explicit explicit_allocator(explicit_allocator<U>) TEST_NOEXCEPT {} >> + >> + T* allocate(std::size_t n) >> + { >> + return static_cast<T*>(::operator new(n*sizeof(T))); >> + } >> + >> + void deallocate(T* p, std::size_t) >> + { >> + return ::operator delete(static_cast<void*>(p)); >> + } >> + >> + friend bool operator==(explicit_allocator, explicit_allocator) {return >> true;} >> + friend bool operator!=(explicit_allocator x, explicit_allocator y) >> {return !(x == y);} >> +}; >> + >> #endif // TEST_STD_VER >= 11 >> >> #endif // MIN_ALLOCATOR_H >> >> >> _______________________________________________ >> 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