1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03 11 12 // <vector> 13 14 // vector(vector&& c); 15 16 #include <vector> 17 #include <cassert> 18 19 #include "test_macros.h" 20 #include "MoveOnly.h" 21 #include "test_allocator.h" 22 #include "min_allocator.h" 23 #include "asan_testing.h" 24 #include "verbose_assert.h" 25 26 int main() 27 { 28 { 29 std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5)); 30 std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5)); 31 assert(is_contiguous_container_asan_correct(l)); 32 assert(is_contiguous_container_asan_correct(lo)); 33 for (int i = 1; i <= 3; ++i) 34 { 35 l.push_back(i); 36 lo.push_back(i); 37 } 38 assert(is_contiguous_container_asan_correct(l)); 39 assert(is_contiguous_container_asan_correct(lo)); 40 std::vector<MoveOnly, test_allocator<MoveOnly> > l2 = std::move(l); 41 assert(l2 == lo); 42 assert(l.empty()); 43 assert(l2.get_allocator() == lo.get_allocator()); 44 assert(is_contiguous_container_asan_correct(l2)); 45 } 46 { 47 std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5)); 48 std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5)); 49 assert(is_contiguous_container_asan_correct(l)); 50 assert(is_contiguous_container_asan_correct(lo)); 51 for (int i = 1; i <= 3; ++i) 52 { 53 l.push_back(i); 54 lo.push_back(i); 55 } 56 assert(is_contiguous_container_asan_correct(l)); 57 assert(is_contiguous_container_asan_correct(lo)); 58 std::vector<MoveOnly, other_allocator<MoveOnly> > l2 = std::move(l); 59 assert(l2 == lo); 60 assert(l.empty()); 61 assert(l2.get_allocator() == lo.get_allocator()); 62 assert(is_contiguous_container_asan_correct(l2)); 63 } 64 { 65 int a1[] = {1, 3, 7, 9, 10}; 66 std::vector<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0])); 67 assert(is_contiguous_container_asan_correct(c1)); 68 std::vector<int>::const_iterator i = c1.begin(); 69 std::vector<int> c2 = std::move(c1); 70 assert(is_contiguous_container_asan_correct(c2)); 71 std::vector<int>::iterator j = c2.erase(i); 72 assert(*j == 3); 73 assert(is_contiguous_container_asan_correct(c2)); 74 } 75 { 76 std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{}); 77 std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{}); 78 assert(is_contiguous_container_asan_correct(l)); 79 assert(is_contiguous_container_asan_correct(lo)); 80 for (int i = 1; i <= 3; ++i) 81 { 82 l.push_back(i); 83 lo.push_back(i); 84 } 85 assert(is_contiguous_container_asan_correct(l)); 86 assert(is_contiguous_container_asan_correct(lo)); 87 std::vector<MoveOnly, min_allocator<MoveOnly> > l2 = std::move(l); 88 assert(l2 == lo); 89 assert(l.empty()); 90 assert(l2.get_allocator() == lo.get_allocator()); 91 assert(is_contiguous_container_asan_correct(l2)); 92 } 93 { 94 int a1[] = {1, 3, 7, 9, 10}; 95 std::vector<int, min_allocator<int>> c1(a1, a1+sizeof(a1)/sizeof(a1[0])); 96 assert(is_contiguous_container_asan_correct(c1)); 97 std::vector<int, min_allocator<int>>::const_iterator i = c1.begin(); 98 std::vector<int, min_allocator<int>> c2 = std::move(c1); 99 assert(is_contiguous_container_asan_correct(c2)); 100 std::vector<int, min_allocator<int>>::iterator j = c2.erase(i); 101 assert(*j == 3); 102 assert(is_contiguous_container_asan_correct(c2)); 103 } 104 { 105 test_alloc_base::clear(); 106 using Vect = std::vector<int, test_allocator<int> >; 107 Vect v(test_allocator<int>(42, 101)); 108 assert(test_alloc_base::count == 1); 109 assert(test_alloc_base::copied == 1); 110 assert(test_alloc_base::moved == 0); 111 { 112 const test_allocator<int>& a = v.get_allocator(); 113 assert(a.get_data() == 42); 114 assert(a.get_id() == 101); 115 } 116 assert(test_alloc_base::count == 1); 117 test_alloc_base::clear_ctor_counters(); 118 119 Vect v2 = std::move(v); 120 assert(test_alloc_base::count == 2); 121 assert(test_alloc_base::copied == 0); 122 assert(test_alloc_base::moved == 1); 123 { 124 const test_allocator<int>& a = v.get_allocator(); 125 assert(a.get_id() == test_alloc_base::moved_value); 126 assert(a.get_data() == test_alloc_base::moved_value); 127 } 128 { 129 const test_allocator<int>& a = v2.get_allocator(); 130 assert(a.get_id() == 101); 131 assert(a.get_data() == 42); 132 } 133 } 134 } 135