Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Aug 2016 17:37:53 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
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...
Message-ID:  <201608241737.u7OHbr5Z036411@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <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: 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 <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: 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<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: 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<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: 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<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: 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 <map>
 #include <cassert>
+#include <vector>
+#include <algorithm>
+
+#include <iostream>
 
 #include "../../../test_compare.h"
 #include "test_allocator.h"
 #include "min_allocator.h"
 
+#if TEST_STD_VER >= 11
+std::vector<int> ca_allocs;
+std::vector<int> ca_deallocs;
+
+template <class T>
+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 <class U> counting_allocatorT(const counting_allocatorT<U>& other) noexcept {foo = other.foo;}
+    template <class U> bool operator==(const counting_allocatorT<U>& other) const noexcept { return foo == other.foo; }
+    template <class U> bool operator!=(const counting_allocatorT<U>& 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<T *>(pv);
+    }
+    void deallocate(T * const p, size_t) const noexcept {
+        ca_deallocs.push_back(foo);
+        free(p);
+    }
+};
+
+template <class T>
+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 <class U> counting_allocatorF(const counting_allocatorF<U>& other) noexcept {foo = other.foo;}
+    template <class U> bool operator==(const counting_allocatorF<U>& other) const noexcept { return foo == other.foo; }
+    template <class U> bool operator!=(const counting_allocatorF<U>& 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<T *>(pv);
+    }
+    void deallocate(T * const p, size_t) const noexcept {
+        ca_deallocs.push_back(foo);
+        free(p);
+    }
+};
+
+bool balanced_allocs() {
+    std::vector<int> 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<std::vector<int>>(temp2));
+    std::cout << "There were " << temp2.size() << " different allocators\n";
+    
+    for (std::vector<int>::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<std::vector<int>>(temp2));
+    std::cout << "There were " << temp2.size() << " different (de)allocators\n";
+    for (std::vector<int>::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<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 counting_allocatorT<V> A;
+        std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(1));
+        std::map<int, double, C, A> 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<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 counting_allocatorF<V> A;
+        std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(100));
+        std::map<int, double, C, A> 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<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: 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<int>(min_allocator<int>());
     test<NotConstructible>(min_allocator<NotConstructible>{});
+    test<int>(explicit_allocator<int>());
+    test<NotConstructible>(explicit_allocator<NotConstructible>{});
 #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<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: 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<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: 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<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: 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<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: 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 ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608241737.u7OHbr5Z036411>