STL_MSFT created this revision. STL_MSFT added reviewers: EricWF, mclow.lists. STL_MSFT added a subscriber: cfe-commits.
The recently-added limited_allocator is much more conformant than the evil old stack_allocator. However, limited_allocator encodes non-Standard assumptions about how many allocations containers perform, which don't hold for MSVC. Specifically, MSVC's STL dynamically allocates sentinel nodes and "container proxies" (for debug mode checking), and its vector famously grows by 1.5x instead of 2x. I would like to retain the limited_allocator coverage, but tweak things so that they pass for both libc++ and MSVC. test/std/containers/sequences/deque/deque.cons/size.pass.cpp test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp deque is too weird. (MSVC's deque reallocates its blockmap several times while doing this.) Just mark the tests as LIBCPP_ONLY, the coward's way out. test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp test/std/containers/sequences/list/list.cons/size_type.pass.cpp test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp "Add 2 for implementations that dynamically allocate a sentinel node and container proxy." test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp "Add 1 for implementations that dynamically allocate a container proxy." test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp Ditto. The (InIt, InIt) ctor is unchanged at 63 elements allocated (MSVC's 1.5x results in fewer element allocations, enough to make room for the container proxy). test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp Adjust numbers for container proxy and 1.5x growth, with the calculations in the comments. https://reviews.llvm.org/D25483 Files: test/std/containers/sequences/deque/deque.cons/size.pass.cpp test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp test/std/containers/sequences/list/list.cons/size_type.pass.cpp test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp
Index: test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp @@ -50,7 +50,10 @@ assert(c[j] == MoveOnly(j)); } { - std::vector<MoveOnly, limited_allocator<MoveOnly, 15> > c; + // libc++ needs 15 because it grows by 2x (1 + 2 + 4 + 8). + // Use 17 for implementations that dynamically allocate a container proxy + // and grow by 1.5x (1 for proxy + 1 + 2 + 3 + 4 + 6). + std::vector<MoveOnly, limited_allocator<MoveOnly, 17> > c; c.push_back(MoveOnly(0)); assert(c.size() == 1); assert(is_contiguous_container_asan_correct(c)); Index: test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp @@ -48,7 +48,10 @@ assert(c[j] == j); } { - std::vector<int, limited_allocator<int, 15> > c; + // libc++ needs 15 because it grows by 2x (1 + 2 + 4 + 8). + // Use 17 for implementations that dynamically allocate a container proxy + // and grow by 1.5x (1 for proxy + 1 + 2 + 3 + 4 + 6). + std::vector<int, limited_allocator<int, 17> > c; c.push_back(0); assert(c.size() == 1); assert(is_contiguous_container_asan_correct(c)); Index: test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp @@ -34,7 +34,8 @@ int main() { test<std::vector<int> >(50, 3); - test<std::vector<int, limited_allocator<int, 50> > >(50, 5); + // Add 1 for implementations that dynamically allocate a container proxy. + test<std::vector<int, limited_allocator<int, 50 + 1> > >(50, 5); #if TEST_STD_VER >= 11 test<std::vector<int, min_allocator<int>> >(50, 3); #endif Index: test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp @@ -43,10 +43,11 @@ test<std::vector<int> >(a, an); test<std::vector<int, limited_allocator<int, 63> > >(input_iterator<const int*>(a), input_iterator<const int*>(an)); - test<std::vector<int, limited_allocator<int, 18> > >(forward_iterator<const int*>(a), forward_iterator<const int*>(an)); - test<std::vector<int, limited_allocator<int, 18> > >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an)); - test<std::vector<int, limited_allocator<int, 18> > >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an)); - test<std::vector<int, limited_allocator<int, 18> > >(a, an); + // Add 1 for implementations that dynamically allocate a container proxy. + test<std::vector<int, limited_allocator<int, 18 + 1> > >(forward_iterator<const int*>(a), forward_iterator<const int*>(an)); + test<std::vector<int, limited_allocator<int, 18 + 1> > >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an)); + test<std::vector<int, limited_allocator<int, 18 + 1> > >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an)); + test<std::vector<int, limited_allocator<int, 18 + 1> > >(a, an); #if TEST_STD_VER >= 11 test<std::vector<int, min_allocator<int>> >(input_iterator<const int*>(a), input_iterator<const int*>(an)); test<std::vector<int, min_allocator<int>> >(forward_iterator<const int*>(a), forward_iterator<const int*>(an)); Index: test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp @@ -35,7 +35,8 @@ assert(v[i] == 1); } { - std::vector<int, limited_allocator<int, 300> > v(100); + // Add 1 for implementations that dynamically allocate a container proxy. + std::vector<int, limited_allocator<int, 300 + 1> > v(100); v.resize(50, 1); assert(v.size() == 50); assert(v.capacity() == 100); Index: test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp @@ -33,7 +33,8 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector<MoveOnly, limited_allocator<MoveOnly, 300> > v(100); + // Add 1 for implementations that dynamically allocate a container proxy. + std::vector<MoveOnly, limited_allocator<MoveOnly, 300 + 1> > v(100); v.resize(50); assert(v.size() == 50); assert(v.capacity() == 100); @@ -56,7 +57,8 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector<int, limited_allocator<int, 300> > v(100); + // Add 1 for implementations that dynamically allocate a container proxy. + std::vector<int, limited_allocator<int, 300 + 1> > v(100); v.resize(50); assert(v.size() == 50); assert(v.capacity() == 100); Index: test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp @@ -37,7 +37,8 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector<int, limited_allocator<int, 250> > v(100); + // Add 1 for implementations that dynamically allocate a container proxy. + std::vector<int, limited_allocator<int, 250 + 1> > v(100); assert(v.capacity() == 100); v.reserve(50); assert(v.size() == 100); Index: test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp +++ test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp @@ -42,7 +42,8 @@ assert(*i == 2); } { - std::list<int, limited_allocator<int, 3> > l(3, 2); + // Add 2 for implementations that dynamically allocate a sentinel node and container proxy. + std::list<int, limited_allocator<int, 3 + 2> > l(3, 2); assert(l.size() == 3); assert(std::distance(l.begin(), l.end()) == 3); std::list<int>::const_iterator i = l.begin(); Index: test/std/containers/sequences/list/list.cons/size_type.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/size_type.pass.cpp +++ test/std/containers/sequences/list/list.cons/size_type.pass.cpp @@ -48,7 +48,8 @@ assert(*i == 0); } { - std::list<int, limited_allocator<int, 3> > l(3); + // Add 2 for implementations that dynamically allocate a sentinel node and container proxy. + std::list<int, limited_allocator<int, 3 + 2> > l(3); assert(l.size() == 3); assert(std::distance(l.begin(), l.end()) == 3); std::list<int>::const_iterator i = l.begin(); Index: test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp +++ test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp @@ -43,7 +43,8 @@ } { int a[] = {0, 1, 2, 3}; - std::list<int, limited_allocator<int, sizeof(a)/sizeof(a[0])> > l(input_iterator<const int*>(a), + // Add 2 for implementations that dynamically allocate a sentinel node and container proxy. + std::list<int, limited_allocator<int, sizeof(a)/sizeof(a[0]) + 2> > l(input_iterator<const int*>(a), input_iterator<const int*>(a + sizeof(a)/sizeof(a[0]))); assert(l.size() == sizeof(a)/sizeof(a[0])); assert(std::distance(l.begin(), l.end()) == sizeof(a)/sizeof(a[0])); Index: test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp @@ -44,7 +44,7 @@ test<int, std::allocator<int> >(4095, 78); test<int, std::allocator<int> >(4096, 1165); test<int, std::allocator<int> >(4097, 157); - test<int, limited_allocator<int, 4096> >(4095, 90); + LIBCPP_ONLY(test<int, limited_allocator<int, 4096> >(4095, 90)); #if TEST_STD_VER >= 11 test<int, min_allocator<int> >(4095, 90); #endif Index: test/std/containers/sequences/deque/deque.cons/size.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/size.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/size.pass.cpp @@ -98,7 +98,7 @@ test<DefaultOnly, std::allocator<DefaultOnly> >(4096); test<DefaultOnly, std::allocator<DefaultOnly> >(4097); - test1<DefaultOnly, limited_allocator<DefaultOnly, 4096> >(4095); + LIBCPP_ONLY(test1<DefaultOnly, limited_allocator<DefaultOnly, 4096> >(4095)); #if TEST_STD_VER >= 11 test<DefaultOnly, min_allocator<DefaultOnly> >(4095);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits