Move test into test/std subdirectory.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@224658 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector& operator=(const vector& c);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
std::vector<int, test_allocator<int> > l(3, 2, test_allocator<int>(5));
|
||||
std::vector<int, test_allocator<int> > l2(l, test_allocator<int>(3));
|
||||
l2 = l;
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == test_allocator<int>(3));
|
||||
}
|
||||
{
|
||||
std::vector<int, other_allocator<int> > l(3, 2, other_allocator<int>(5));
|
||||
std::vector<int, other_allocator<int> > l2(l, other_allocator<int>(3));
|
||||
l2 = l;
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == other_allocator<int>(5));
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<int, min_allocator<int> > l(3, 2, min_allocator<int>());
|
||||
std::vector<int, min_allocator<int> > l2(l, min_allocator<int>());
|
||||
l2 = l;
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == min_allocator<int>());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// void assign(initializer_list<value_type> il);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
{
|
||||
std::vector<int> d;
|
||||
d.assign({3, 4, 5, 6});
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<int, min_allocator<int>> d;
|
||||
d.assign({3, 4, 5, 6});
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector& operator=(vector&& c);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
{
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(test_allocator<MoveOnly>(5));
|
||||
l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(test_allocator<MoveOnly>(6));
|
||||
l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(!l.empty());
|
||||
assert(l2.get_allocator() == test_allocator<MoveOnly>(6));
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l2(other_allocator<MoveOnly>(6));
|
||||
l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l2(min_allocator<MoveOnly>{});
|
||||
l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(const Alloc& = Alloc());
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_allocator.h"
|
||||
#include "../../../NotConstructible.h"
|
||||
#include "../../../stack_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test0()
|
||||
{
|
||||
C c;
|
||||
assert(c.__invariants());
|
||||
assert(c.empty());
|
||||
assert(c.get_allocator() == typename C::allocator_type());
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
#if __cplusplus >= 201103L
|
||||
C c1 = {};
|
||||
assert(c1.__invariants());
|
||||
assert(c1.empty());
|
||||
assert(c1.get_allocator() == typename C::allocator_type());
|
||||
assert(is_contiguous_container_asan_correct(c1));
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test1(const typename C::allocator_type& a)
|
||||
{
|
||||
C c(a);
|
||||
assert(c.__invariants());
|
||||
assert(c.empty());
|
||||
assert(c.get_allocator() == a);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
test0<std::vector<int> >();
|
||||
test0<std::vector<NotConstructible> >();
|
||||
test1<std::vector<int, test_allocator<int> > >(test_allocator<int>(3));
|
||||
test1<std::vector<NotConstructible, test_allocator<NotConstructible> > >
|
||||
(test_allocator<NotConstructible>(5));
|
||||
}
|
||||
{
|
||||
std::vector<int, stack_allocator<int, 10> > v;
|
||||
assert(v.empty());
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
test0<std::vector<int, min_allocator<int>> >();
|
||||
test0<std::vector<NotConstructible, min_allocator<NotConstructible>> >();
|
||||
test1<std::vector<int, min_allocator<int> > >(min_allocator<int>{});
|
||||
test1<std::vector<NotConstructible, min_allocator<NotConstructible> > >
|
||||
(min_allocator<NotConstructible>{});
|
||||
}
|
||||
{
|
||||
std::vector<int, min_allocator<int> > v;
|
||||
assert(v.empty());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// template <class InputIter> vector(InputIter first, InputIter last);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_iterators.h"
|
||||
#include "../../../stack_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C, class Iterator>
|
||||
void
|
||||
test(Iterator first, Iterator last)
|
||||
{
|
||||
C c(first, last);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == std::distance(first, last));
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i, ++first)
|
||||
assert(*i == *first);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
test<std::vector<int> >(input_iterator<const int*>(a), input_iterator<const int*>(an));
|
||||
test<std::vector<int> >(forward_iterator<const int*>(a), forward_iterator<const int*>(an));
|
||||
test<std::vector<int> >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an));
|
||||
test<std::vector<int> >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an));
|
||||
test<std::vector<int> >(a, an);
|
||||
|
||||
test<std::vector<int, stack_allocator<int, 63> > >(input_iterator<const int*>(a), input_iterator<const int*>(an));
|
||||
test<std::vector<int, stack_allocator<int, 18> > >(forward_iterator<const int*>(a), forward_iterator<const int*>(an));
|
||||
test<std::vector<int, stack_allocator<int, 18> > >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an));
|
||||
test<std::vector<int, stack_allocator<int, 18> > >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an));
|
||||
test<std::vector<int, stack_allocator<int, 18> > >(a, an);
|
||||
#if __cplusplus >= 201103L
|
||||
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));
|
||||
test<std::vector<int, min_allocator<int>> >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an));
|
||||
test<std::vector<int, min_allocator<int>> >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an));
|
||||
test<std::vector<int> >(a, an);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// template <class InputIter> vector(InputIter first, InputIter last,
|
||||
// const allocator_type& a);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_iterators.h"
|
||||
#include "../../../stack_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C, class Iterator, class A>
|
||||
void
|
||||
test(Iterator first, Iterator last, const A& a)
|
||||
{
|
||||
C c(first, last, a);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == std::distance(first, last));
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i, ++first)
|
||||
assert(*i == *first);
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
|
||||
template <class T>
|
||||
struct implicit_conv_allocator : min_allocator<T>
|
||||
{
|
||||
implicit_conv_allocator(void* p) {}
|
||||
implicit_conv_allocator(const implicit_conv_allocator&) = default;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
std::allocator<int> alloc;
|
||||
test<std::vector<int> >(input_iterator<const int*>(a), input_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int> >(forward_iterator<const int*>(a), forward_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int> >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int> >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int> >(a, an, alloc);
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
min_allocator<int> alloc;
|
||||
test<std::vector<int, min_allocator<int>> >(input_iterator<const int*>(a), input_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int, min_allocator<int>> >(forward_iterator<const int*>(a), forward_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int, min_allocator<int>> >(bidirectional_iterator<const int*>(a), bidirectional_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int, min_allocator<int>> >(random_access_iterator<const int*>(a), random_access_iterator<const int*>(an), alloc);
|
||||
test<std::vector<int, min_allocator<int>> >(a, an, alloc);
|
||||
test<std::vector<int, implicit_conv_allocator<int>> >(a, an, nullptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// explicit vector(size_type n);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "DefaultOnly.h"
|
||||
#include "min_allocator.h"
|
||||
#include "test_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test2(typename C::size_type n, typename C::allocator_type const& a = typename C::allocator_type ())
|
||||
{
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
C c(n, a);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == n);
|
||||
assert(c.get_allocator() == a);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)
|
||||
assert(*i == typename C::value_type());
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test1(typename C::size_type n)
|
||||
{
|
||||
C c(n);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == n);
|
||||
assert(c.get_allocator() == typename C::allocator_type());
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)
|
||||
assert(*i == typename C::value_type());
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
}
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test(typename C::size_type n)
|
||||
{
|
||||
test1<C> ( n );
|
||||
test2<C> ( n );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test<std::vector<int> >(50);
|
||||
test<std::vector<DefaultOnly> >(500);
|
||||
assert(DefaultOnly::count == 0);
|
||||
#if __cplusplus >= 201103L
|
||||
test<std::vector<int, min_allocator<int>> >(50);
|
||||
test<std::vector<DefaultOnly, min_allocator<DefaultOnly>> >(500);
|
||||
test2<std::vector<DefaultOnly, test_allocator<DefaultOnly>> >( 100, test_allocator<DefaultOnly>(23));
|
||||
assert(DefaultOnly::count == 0);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(size_type n, const value_type& x);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "../../../stack_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test(typename C::size_type n, const typename C::value_type& x)
|
||||
{
|
||||
C c(n, x);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == n);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)
|
||||
assert(*i == x);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test<std::vector<int> >(50, 3);
|
||||
test<std::vector<int, stack_allocator<int, 50> > >(50, 5);
|
||||
#if __cplusplus >= 201103L
|
||||
test<std::vector<int, min_allocator<int>> >(50, 3);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(size_type n, const value_type& x, const allocator_type& a);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test(typename C::size_type n, const typename C::value_type& x,
|
||||
const typename C::allocator_type& a)
|
||||
{
|
||||
C c(n, x, a);
|
||||
assert(c.__invariants());
|
||||
assert(a == c.get_allocator());
|
||||
assert(c.size() == n);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)
|
||||
assert(*i == x);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test<std::vector<int> >(50, 3, std::allocator<int>());
|
||||
#if __cplusplus >= 201103L
|
||||
test<std::vector<int, min_allocator<int>> >(50, 3, min_allocator<int>());
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(const vector& v);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test(const C& x)
|
||||
{
|
||||
unsigned s = x.size();
|
||||
C c(x);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == s);
|
||||
assert(c == x);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
test(std::vector<int>(a, an));
|
||||
}
|
||||
{
|
||||
std::vector<int, test_allocator<int> > v(3, 2, test_allocator<int>(5));
|
||||
std::vector<int, test_allocator<int> > v2 = v;
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
assert(v2 == v);
|
||||
assert(v2.get_allocator() == v.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
}
|
||||
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
{
|
||||
std::vector<int, other_allocator<int> > v(3, 2, other_allocator<int>(5));
|
||||
std::vector<int, other_allocator<int> > v2 = v;
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
assert(v2 == v);
|
||||
assert(v2.get_allocator() == other_allocator<int>(-2));
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
}
|
||||
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
test(std::vector<int, min_allocator<int>>(a, an));
|
||||
}
|
||||
{
|
||||
std::vector<int, min_allocator<int> > v(3, 2, min_allocator<int>());
|
||||
std::vector<int, min_allocator<int> > v2 = v;
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
assert(v2 == v);
|
||||
assert(v2.get_allocator() == v.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(v));
|
||||
assert(is_contiguous_container_asan_correct(v2));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(const vector& v, const allocator_type& a);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
template <class C>
|
||||
void
|
||||
test(const C& x, const typename C::allocator_type& a)
|
||||
{
|
||||
unsigned s = x.size();
|
||||
C c(x, a);
|
||||
assert(c.__invariants());
|
||||
assert(c.size() == s);
|
||||
assert(c == x);
|
||||
assert(is_contiguous_container_asan_correct(c));
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
test(std::vector<int>(a, an), std::allocator<int>());
|
||||
}
|
||||
{
|
||||
std::vector<int, test_allocator<int> > l(3, 2, test_allocator<int>(5));
|
||||
std::vector<int, test_allocator<int> > l2(l, test_allocator<int>(3));
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == test_allocator<int>(3));
|
||||
}
|
||||
{
|
||||
std::vector<int, other_allocator<int> > l(3, 2, other_allocator<int>(5));
|
||||
std::vector<int, other_allocator<int> > l2(l, other_allocator<int>(3));
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == other_allocator<int>(3));
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
|
||||
int* an = a + sizeof(a)/sizeof(a[0]);
|
||||
test(std::vector<int, min_allocator<int>>(a, an), min_allocator<int>());
|
||||
}
|
||||
{
|
||||
std::vector<int, min_allocator<int> > l(3, 2, min_allocator<int>());
|
||||
std::vector<int, min_allocator<int> > l2(l, min_allocator<int>());
|
||||
assert(l2 == l);
|
||||
assert(l2.get_allocator() == min_allocator<int>());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
// class vector
|
||||
// vector();
|
||||
|
||||
#include <vector>
|
||||
|
||||
struct X
|
||||
{
|
||||
std::vector<X> q;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector()
|
||||
// noexcept(is_nothrow_default_constructible<allocator_type>::value);
|
||||
|
||||
// This tests a conforming extension
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
|
||||
template <class T>
|
||||
struct some_alloc
|
||||
{
|
||||
typedef T value_type;
|
||||
some_alloc(const some_alloc&);
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
#if __has_feature(cxx_noexcept)
|
||||
{
|
||||
typedef std::vector<MoveOnly> C;
|
||||
static_assert(std::is_nothrow_default_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, test_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_default_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, other_allocator<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, some_alloc<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// ~vector() // implied noexcept;
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
|
||||
#if __has_feature(cxx_noexcept)
|
||||
|
||||
template <class T>
|
||||
struct some_alloc
|
||||
{
|
||||
typedef T value_type;
|
||||
some_alloc(const some_alloc&);
|
||||
~some_alloc() noexcept(false);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
#if __has_feature(cxx_noexcept)
|
||||
{
|
||||
typedef std::vector<MoveOnly> C;
|
||||
static_assert(std::is_nothrow_destructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, test_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_destructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, other_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_destructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, some_alloc<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_destructible<C>::value, "");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(initializer_list<value_type> il);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
{
|
||||
std::vector<int> d = {3, 4, 5, 6};
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<int, min_allocator<int>> d = {3, 4, 5, 6};
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(initializer_list<value_type> il, const Allocator& a = allocator_type());
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
{
|
||||
std::vector<int, test_allocator<int>> d({3, 4, 5, 6}, test_allocator<int>(3));
|
||||
assert(d.get_allocator() == test_allocator<int>(3));
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<int, min_allocator<int>> d({3, 4, 5, 6}, min_allocator<int>());
|
||||
assert(d.get_allocator() == min_allocator<int>());
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
}
|
||||
103
test/std/containers/sequences/vector/vector.cons/move.pass.cpp
Normal file
103
test/std/containers/sequences/vector/vector.cons/move.pass.cpp
Normal file
@@ -0,0 +1,103 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(vector&& c);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
{
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
int a1[] = {1, 3, 7, 9, 10};
|
||||
std::vector<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));
|
||||
assert(is_contiguous_container_asan_correct(c1));
|
||||
std::vector<int>::const_iterator i = c1.begin();
|
||||
std::vector<int> c2 = std::move(c1);
|
||||
assert(is_contiguous_container_asan_correct(c2));
|
||||
std::vector<int>::iterator j = c2.erase(i);
|
||||
assert(*j == 3);
|
||||
assert(is_contiguous_container_asan_correct(c2));
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l2 = std::move(l);
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == lo.get_allocator());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
int a1[] = {1, 3, 7, 9, 10};
|
||||
std::vector<int, min_allocator<int>> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));
|
||||
assert(is_contiguous_container_asan_correct(c1));
|
||||
std::vector<int, min_allocator<int>>::const_iterator i = c1.begin();
|
||||
std::vector<int, min_allocator<int>> c2 = std::move(c1);
|
||||
assert(is_contiguous_container_asan_correct(c2));
|
||||
std::vector<int, min_allocator<int>>::iterator j = c2.erase(i);
|
||||
assert(*j == 3);
|
||||
assert(is_contiguous_container_asan_correct(c2));
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(vector&& c, const allocator_type& a);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
{
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(std::move(l), test_allocator<MoveOnly>(6));
|
||||
assert(l2 == lo);
|
||||
assert(!l.empty());
|
||||
assert(l2.get_allocator() == test_allocator<MoveOnly>(6));
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(std::move(l), test_allocator<MoveOnly>(5));
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == test_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
{
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, other_allocator<MoveOnly> > l2(std::move(l), other_allocator<MoveOnly>(4));
|
||||
assert(l2 == lo);
|
||||
assert(!l.empty());
|
||||
assert(l2.get_allocator() == other_allocator<MoveOnly>(4));
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
l.push_back(i);
|
||||
lo.push_back(i);
|
||||
}
|
||||
assert(is_contiguous_container_asan_correct(l));
|
||||
assert(is_contiguous_container_asan_correct(lo));
|
||||
std::vector<MoveOnly, min_allocator<MoveOnly> > l2(std::move(l), min_allocator<MoveOnly>());
|
||||
assert(l2 == lo);
|
||||
assert(l.empty());
|
||||
assert(l2.get_allocator() == min_allocator<MoveOnly>());
|
||||
assert(is_contiguous_container_asan_correct(l2));
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector& operator=(vector&& c)
|
||||
// noexcept(
|
||||
// allocator_type::propagate_on_container_move_assignment::value &&
|
||||
// is_nothrow_move_assignable<allocator_type>::value);
|
||||
|
||||
// This tests a conforming extension
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
|
||||
template <class T>
|
||||
struct some_alloc
|
||||
{
|
||||
typedef T value_type;
|
||||
some_alloc(const some_alloc&);
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
#if __has_feature(cxx_noexcept)
|
||||
{
|
||||
typedef std::vector<MoveOnly> C;
|
||||
static_assert(std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, test_allocator<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, other_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, some_alloc<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector(vector&&)
|
||||
// noexcept(is_nothrow_move_constructible<allocator_type>::value);
|
||||
|
||||
// This tests a conforming extension
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "../../../MoveOnly.h"
|
||||
#include "test_allocator.h"
|
||||
|
||||
template <class T>
|
||||
struct some_alloc
|
||||
{
|
||||
typedef T value_type;
|
||||
some_alloc(const some_alloc&);
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
#if __has_feature(cxx_noexcept)
|
||||
{
|
||||
typedef std::vector<MoveOnly> C;
|
||||
static_assert(std::is_nothrow_move_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, test_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_move_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, other_allocator<MoveOnly>> C;
|
||||
static_assert(std::is_nothrow_move_constructible<C>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::vector<MoveOnly, some_alloc<MoveOnly>> C;
|
||||
static_assert(!std::is_nothrow_move_constructible<C>::value, "");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <vector>
|
||||
|
||||
// vector& operator=(initializer_list<value_type> il);
|
||||
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
#include "min_allocator.h"
|
||||
#include "asan_testing.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
{
|
||||
std::vector<int> d;
|
||||
d = {3, 4, 5, 6};
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#if __cplusplus >= 201103L
|
||||
{
|
||||
std::vector<int, min_allocator<int>> d;
|
||||
d = {3, 4, 5, 6};
|
||||
assert(d.size() == 4);
|
||||
assert(is_contiguous_container_asan_correct(d));
|
||||
assert(d[0] == 3);
|
||||
assert(d[1] == 4);
|
||||
assert(d[2] == 5);
|
||||
assert(d[3] == 6);
|
||||
}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
}
|
||||
Reference in New Issue
Block a user