From owner-svn-src-all@freebsd.org Wed Aug 24 17:37:57 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2181BBC5DAA; Wed, 24 Aug 2016 17:37:57 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B7C6C13CF; Wed, 24 Aug 2016 17:37:56 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u7OHbuYU036439; Wed, 24 Aug 2016 17:37:56 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u7OHbr5Z036411; Wed, 24 Aug 2016 17:37:53 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201608241737.u7OHbr5Z036411@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Wed, 24 Aug 2016 17:37:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r304765 - in vendor/libc++/dist: include test/std/containers/associative/map/map.cons test/std/containers/associative/multimap/multimap.cons test/std/containers/associative/multiset/mul... X-SVN-Group: vendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Aug 2016 17:37:57 -0000 Author: dim Date: Wed Aug 24 17:37:53 2016 New Revision: 304765 URL: https://svnweb.freebsd.org/changeset/base/304765 Log: Vendor import of libc++ release_39 branch r279477: https://llvm.org/svn/llvm-project/libcxx/branches/release_39@279477 Modified: vendor/libc++/dist/include/__tree vendor/libc++/dist/include/map vendor/libc++/dist/include/unordered_map vendor/libc++/dist/test/std/containers/associative/map/map.cons/alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_assign.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/default.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp vendor/libc++/dist/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp vendor/libc++/dist/test/std/containers/associative/set/set.cons/default.pass.cpp vendor/libc++/dist/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp vendor/libc++/dist/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp vendor/libc++/dist/test/std/containers/sequences/list/list.cons/default.pass.cpp vendor/libc++/dist/test/std/containers/sequences/vector.bool/construct_default.pass.cpp vendor/libc++/dist/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/copy_alloc.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/default.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/init_size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/move_alloc.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/range_size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/copy_alloc.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/default.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/init_size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move_alloc.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/range_size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/size_hash_equal_allocator.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/default.pass.cpp vendor/libc++/dist/test/std/containers/unord/unord.set/unord.set.cnstr/default.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.cons/alloc.pass.cpp vendor/libc++/dist/test/support/min_allocator.h Modified: vendor/libc++/dist/include/__tree ============================================================================== --- vendor/libc++/dist/include/__tree Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/include/__tree Wed Aug 24 17:37:53 2016 (r304765) @@ -1419,7 +1419,11 @@ private: _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __tree& __t, true_type) - {__node_alloc() = __t.__node_alloc();} + { + if (__node_alloc() != __t.__node_alloc()) + clear(); + __node_alloc() = __t.__node_alloc(); + } _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __tree& __t, false_type) {} Modified: vendor/libc++/dist/include/map ============================================================================== --- vendor/libc++/dist/include/map Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/include/map Wed Aug 24 17:37:53 2016 (r304765) @@ -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 _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 __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 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 _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 __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 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: vendor/libc++/dist/include/unordered_map ============================================================================== --- vendor/libc++/dist/include/unordered_map Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/include/unordered_map Wed Aug 24 17:37:53 2016 (r304765) @@ -1185,7 +1185,7 @@ template ::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 ::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 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 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 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 ::unordered_map( initializer_list __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 ::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 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 ::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 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 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 ::unordered_multimap( initializer_list __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: vendor/libc++/dist/test/std/containers/associative/map/map.cons/alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -38,5 +38,13 @@ int main() assert(m.begin() == m.end()); assert(m.get_allocator() == A()); } + { + typedef std::less C; + typedef explicit_allocator > A; + std::map m(A{}); + assert(m.empty()); + assert(m.begin() == m.end()); + assert(m.get_allocator() == A()); + } #endif } Modified: vendor/libc++/dist/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/compare_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -41,5 +41,14 @@ int main() assert(m.key_comp() == C(4)); assert(m.get_allocator() == A()); } + { + typedef test_compare > C; + typedef explicit_allocator > A; + std::map 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: vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -91,5 +91,39 @@ int main() assert(*next(mo.begin()) == V(2, 1)); assert(*next(mo.begin(), 2) == V(3, 1)); } + { + typedef std::pair 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 > C; + typedef explicit_allocator A; + std::map mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A{}); + std::map 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: vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_assign.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_assign.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/copy_assign.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -15,11 +15,99 @@ #include #include +#include +#include + +#include #include "../../../test_compare.h" #include "test_allocator.h" #include "min_allocator.h" +#if TEST_STD_VER >= 11 +std::vector ca_allocs; +std::vector ca_deallocs; + +template +class counting_allocatorT { +public: + typedef T value_type; + int foo{0}; + counting_allocatorT(int f) noexcept : foo(f) {} + + using propagate_on_container_copy_assignment = std::true_type; + template counting_allocatorT(const counting_allocatorT& other) noexcept {foo = other.foo;} + template bool operator==(const counting_allocatorT& other) const noexcept { return foo == other.foo; } + template bool operator!=(const counting_allocatorT& other) const noexcept { return foo != other.foo; } + + T * allocate(const size_t n) const { + ca_allocs.push_back(foo); + void * const pv = ::malloc(n * sizeof(T)); + return static_cast(pv); + } + void deallocate(T * const p, size_t) const noexcept { + ca_deallocs.push_back(foo); + free(p); + } +}; + +template +class counting_allocatorF { +public: + typedef T value_type; + int foo{0}; + counting_allocatorF(int f) noexcept : foo(f) {} + + using propagate_on_container_copy_assignment = std::false_type; + template counting_allocatorF(const counting_allocatorF& other) noexcept {foo = other.foo;} + template bool operator==(const counting_allocatorF& other) const noexcept { return foo == other.foo; } + template bool operator!=(const counting_allocatorF& other) const noexcept { return foo != other.foo; } + + T * allocate(const size_t n) const { + ca_allocs.push_back(foo); + void * const pv = ::malloc(n * sizeof(T)); + return static_cast(pv); + } + void deallocate(T * const p, size_t) const noexcept { + ca_deallocs.push_back(foo); + free(p); + } +}; + +bool balanced_allocs() { + std::vector temp1, temp2; + + std::cout << "Allocations = " << ca_allocs.size() << ", deallocatons = " << ca_deallocs.size() << std::endl; + if (ca_allocs.size() != ca_deallocs.size()) + return false; + + temp1 = ca_allocs; + std::sort(temp1.begin(), temp1.end()); + temp2.clear(); + std::unique_copy(temp1.begin(), temp1.end(), std::back_inserter>(temp2)); + std::cout << "There were " << temp2.size() << " different allocators\n"; + + for (std::vector::const_iterator it = temp2.begin(); it != temp2.end(); ++it ) { + std::cout << *it << ": " << std::count(ca_allocs.begin(), ca_allocs.end(), *it) << " vs " << std::count(ca_deallocs.begin(), ca_deallocs.end(), *it) << std::endl; + if ( std::count(ca_allocs.begin(), ca_allocs.end(), *it) != std::count(ca_deallocs.begin(), ca_deallocs.end(), *it)) + return false; + } + + temp1 = ca_allocs; + std::sort(temp1.begin(), temp1.end()); + temp2.clear(); + std::unique_copy(temp1.begin(), temp1.end(), std::back_inserter>(temp2)); + std::cout << "There were " << temp2.size() << " different (de)allocators\n"; + for (std::vector::const_iterator it = ca_deallocs.begin(); it != ca_deallocs.end(); ++it ) { + std::cout << *it << ": " << std::count(ca_allocs.begin(), ca_allocs.end(), *it) << " vs " << std::count(ca_deallocs.begin(), ca_deallocs.end(), *it) << std::endl; + if ( std::count(ca_allocs.begin(), ca_allocs.end(), *it) != std::count(ca_deallocs.begin(), ca_deallocs.end(), *it)) + return false; + } + + return true; + } +#endif + int main() { { @@ -178,5 +266,75 @@ int main() assert(*next(mo.begin()) == V(2, 1)); assert(*next(mo.begin(), 2) == V(3, 1)); } + + assert(balanced_allocs()); + { + typedef std::pair 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 > C; + typedef counting_allocatorT A; + std::map mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(1)); + std::map m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(2)); + m = mo; + 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.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)); + } + assert(balanced_allocs()); + { + typedef std::pair 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 > C; + typedef counting_allocatorF A; + std::map mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(100)); + std::map m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(200)); + m = mo; + 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.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)); + } + assert(balanced_allocs()); #endif } Modified: vendor/libc++/dist/test/std/containers/associative/map/map.cons/default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -32,6 +32,20 @@ int main() assert(m.begin() == m.end()); } { + typedef explicit_allocator> A; + { + std::map, A> m; + assert(m.empty()); + assert(m.begin() == m.end()); + } + { + A a; + std::map, A> m(a); + assert(m.empty()); + assert(m.begin() == m.end()); + } + } + { std::map m = {}; assert(m.empty()); assert(m.begin() == m.end()); Modified: vendor/libc++/dist/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/initializer_list_compare_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -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 V; typedef min_allocator A; @@ -95,6 +95,30 @@ int main() assert(m.get_allocator() == a); } #endif + { + typedef std::pair V; + typedef explicit_allocator A; + typedef test_compare > C; + A a; + std::map 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: vendor/libc++/dist/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/iter_iter_comp_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -90,6 +90,7 @@ int main() V(3, 1.5), V(3, 2), }; + { typedef std::pair V; typedef min_allocator A; typedef test_compare > C; @@ -103,6 +104,21 @@ int main() assert(*next(m.begin(), 2) == V(3, 1)); assert(m.get_allocator() == a); } + { + typedef std::pair V; + typedef explicit_allocator A; + typedef test_compare > C; + A a; + std::map 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: vendor/libc++/dist/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/map/map.cons/move_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -229,6 +229,45 @@ int main() assert(m3.key_comp() == C(5)); assert(m1.empty()); } + { + typedef std::pair V; + typedef std::pair VC; + typedef test_compare > C; + typedef explicit_allocator A; + typedef std::map M; + typedef std::move_iterator 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: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -38,5 +38,13 @@ int main() assert(m.begin() == m.end()); assert(m.get_allocator() == A()); } + { + typedef std::less C; + typedef explicit_allocator > A; + std::multimap m(A{}); + assert(m.empty()); + assert(m.begin() == m.end()); + assert(m.get_allocator() == A{}); + } #endif } Modified: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/compare_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -41,5 +41,14 @@ int main() assert(m.key_comp() == C(4)); assert(m.get_allocator() == A()); } + { + typedef test_compare > C; + typedef explicit_allocator > A; + std::multimap 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: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/copy_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -73,5 +73,30 @@ int main() assert(mo.get_allocator() == A()); assert(mo.key_comp() == C(5)); } + { + typedef std::pair 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 > C; + typedef explicit_allocator A; + std::multimap mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A{}); + std::multimap 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: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -32,6 +32,20 @@ int main() assert(m.begin() == m.end()); } { + typedef explicit_allocator> A; + { + std::multimap, A> m; + assert(m.empty()); + assert(m.begin() == m.end()); + } + { + A a; + std::multimap, A> m(a); + assert(m.empty()); + assert(m.begin() == m.end()); + } + } + { std::multimap m = {}; assert(m.empty()); assert(m.begin() == m.end()); Modified: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/initializer_list_compare_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -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 > C; typedef std::pair V; @@ -125,5 +125,39 @@ int main() assert(m.get_allocator() == a); } #endif + { + typedef test_compare > Cmp; + typedef explicit_allocator > A; + typedef std::multimap 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: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/iter_iter_comp_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -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 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 > C; + typedef explicit_allocator A; + std::multimap 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: vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multimap/multimap.cons/move_alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -229,6 +229,45 @@ int main() assert(m3.key_comp() == C(5)); assert(m1.empty()); } + { + typedef std::pair V; + typedef std::pair VC; + typedef test_compare > C; + typedef explicit_allocator A; + typedef std::multimap M; + typedef std::move_iterator 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: vendor/libc++/dist/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/multiset/multiset.cons/default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -32,6 +32,20 @@ int main() assert(m.begin() == m.end()); } { + typedef explicit_allocator A; + { + std::multiset, A> m; + assert(m.empty()); + assert(m.begin() == m.end()); + } + { + A a; + std::multiset, A> m(a); + assert(m.empty()); + assert(m.begin() == m.end()); + } + } + { std::multiset m = {}; assert(m.empty()); assert(m.begin() == m.end()); Modified: vendor/libc++/dist/test/std/containers/associative/set/set.cons/default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/associative/set/set.cons/default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/associative/set/set.cons/default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -32,6 +32,20 @@ int main() assert(m.begin() == m.end()); } { + typedef explicit_allocator A; + { + std::set, A> m; + assert(m.empty()); + assert(m.begin() == m.end()); + } + { + A a; + std::set, A> m(a); + assert(m.empty()); + assert(m.begin() == m.end()); + } + } + { std::set m = {}; assert(m.empty()); assert(m.begin() == m.end()); Modified: vendor/libc++/dist/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/sequences/deque/deque.cons/alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -34,5 +34,7 @@ int main() #if TEST_STD_VER >= 11 test(min_allocator()); test(min_allocator{}); + test(explicit_allocator()); + test(explicit_allocator{}); #endif } Modified: vendor/libc++/dist/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/sequences/forwardlist/forwardlist.cons/alloc.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -37,5 +37,13 @@ int main() assert(c.get_allocator() == A()); assert(c.empty()); } + { + typedef explicit_allocator A; + typedef A::value_type T; + typedef std::forward_list C; + C c(A{}); + assert(c.get_allocator() == A()); + assert(c.empty()); + } #endif } Modified: vendor/libc++/dist/test/std/containers/sequences/list/list.cons/default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/sequences/list/list.cons/default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/sequences/list/list.cons/default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -54,5 +54,15 @@ int main() assert(l.size() == 0); assert(std::distance(l.begin(), l.end()) == 0); } + { + std::list> l; + assert(l.size() == 0); + assert(std::distance(l.begin(), l.end()) == 0); + } + { + std::list> l((explicit_allocator())); + assert(l.size() == 0); + assert(std::distance(l.begin(), l.end()) == 0); + } #endif } Modified: vendor/libc++/dist/test/std/containers/sequences/vector.bool/construct_default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/sequences/vector.bool/construct_default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/sequences/vector.bool/construct_default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -66,5 +66,9 @@ int main() test0> >(); test1 > >(min_allocator()); } + { + test0> >(); + test1 > >(explicit_allocator()); + } #endif } Modified: vendor/libc++/dist/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -86,5 +86,17 @@ int main() std::vector > v; assert(v.empty()); } + + { + test0> >(); + test0> >(); + test1 > >(explicit_allocator{}); + test1 > > + (explicit_allocator{}); + } + { + std::vector > v; + assert(v.empty()); + } #endif } Modified: vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp Wed Aug 24 17:37:28 2016 (r304764) +++ vendor/libc++/dist/test/std/containers/unord/unord.map/unord.map.cnstr/allocator.pass.cpp Wed Aug 24 17:37:53 2016 (r304765) @@ -65,7 +65,25 @@ int main() assert(c.load_factor() == 0); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***