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 // <vector>
11 
12 // iterator erase(const_iterator first, const_iterator last);
13 
14 #include <vector>
15 #include <iterator>
16 #include <cassert>
17 
18 #include "min_allocator.h"
19 #include "asan_testing.h"
20 
main()21 int main()
22 {
23     int a1[] = {1, 2, 3};
24     {
25         std::vector<int> l1(a1, a1+3);
26         assert(is_contiguous_container_asan_correct(l1));
27         std::vector<int>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());
28         assert(l1.size() == 3);
29         assert(distance(l1.cbegin(), l1.cend()) == 3);
30         assert(i == l1.begin());
31         assert(is_contiguous_container_asan_correct(l1));
32     }
33     {
34         std::vector<int> l1(a1, a1+3);
35         assert(is_contiguous_container_asan_correct(l1));
36         std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));
37         assert(l1.size() == 2);
38         assert(distance(l1.cbegin(), l1.cend()) == 2);
39         assert(i == l1.begin());
40         assert(l1 == std::vector<int>(a1+1, a1+3));
41         assert(is_contiguous_container_asan_correct(l1));
42     }
43     {
44         std::vector<int> l1(a1, a1+3);
45         assert(is_contiguous_container_asan_correct(l1));
46         std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));
47         assert(l1.size() == 1);
48         assert(distance(l1.cbegin(), l1.cend()) == 1);
49         assert(i == l1.begin());
50         assert(l1 == std::vector<int>(a1+2, a1+3));
51         assert(is_contiguous_container_asan_correct(l1));
52     }
53     {
54         std::vector<int> l1(a1, a1+3);
55         assert(is_contiguous_container_asan_correct(l1));
56         std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));
57         assert(l1.size() == 0);
58         assert(distance(l1.cbegin(), l1.cend()) == 0);
59         assert(i == l1.begin());
60         assert(is_contiguous_container_asan_correct(l1));
61     }
62     {
63         std::vector<std::vector<int> > outer(2, std::vector<int>(1));
64         assert(is_contiguous_container_asan_correct(outer));
65         assert(is_contiguous_container_asan_correct(outer[0]));
66         assert(is_contiguous_container_asan_correct(outer[1]));
67         outer.erase(outer.begin(), outer.begin());
68         assert(outer.size() == 2);
69         assert(outer[0].size() == 1);
70         assert(outer[1].size() == 1);
71         assert(is_contiguous_container_asan_correct(outer));
72         assert(is_contiguous_container_asan_correct(outer[0]));
73         assert(is_contiguous_container_asan_correct(outer[1]));
74     }
75 #if __cplusplus >= 201103L
76     {
77         std::vector<int, min_allocator<int>> l1(a1, a1+3);
78         assert(is_contiguous_container_asan_correct(l1));
79         std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());
80         assert(l1.size() == 3);
81         assert(distance(l1.cbegin(), l1.cend()) == 3);
82         assert(i == l1.begin());
83         assert(is_contiguous_container_asan_correct(l1));
84     }
85     {
86         std::vector<int, min_allocator<int>> l1(a1, a1+3);
87         assert(is_contiguous_container_asan_correct(l1));
88         std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));
89         assert(l1.size() == 2);
90         assert(distance(l1.cbegin(), l1.cend()) == 2);
91         assert(i == l1.begin());
92         assert((l1 == std::vector<int, min_allocator<int>>(a1+1, a1+3)));
93         assert(is_contiguous_container_asan_correct(l1));
94     }
95     {
96         std::vector<int, min_allocator<int>> l1(a1, a1+3);
97         assert(is_contiguous_container_asan_correct(l1));
98         std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));
99         assert(l1.size() == 1);
100         assert(distance(l1.cbegin(), l1.cend()) == 1);
101         assert(i == l1.begin());
102         assert((l1 == std::vector<int, min_allocator<int>>(a1+2, a1+3)));
103         assert(is_contiguous_container_asan_correct(l1));
104     }
105     {
106         std::vector<int, min_allocator<int>> l1(a1, a1+3);
107         assert(is_contiguous_container_asan_correct(l1));
108         std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));
109         assert(l1.size() == 0);
110         assert(distance(l1.cbegin(), l1.cend()) == 0);
111         assert(i == l1.begin());
112         assert(is_contiguous_container_asan_correct(l1));
113     }
114     {
115         std::vector<std::vector<int, min_allocator<int>>, min_allocator<std::vector<int, min_allocator<int>>>> outer(2, std::vector<int, min_allocator<int>>(1));
116         assert(is_contiguous_container_asan_correct(outer));
117         assert(is_contiguous_container_asan_correct(outer[0]));
118         assert(is_contiguous_container_asan_correct(outer[1]));
119         outer.erase(outer.begin(), outer.begin());
120         assert(outer.size() == 2);
121         assert(outer[0].size() == 1);
122         assert(outer[1].size() == 1);
123         assert(is_contiguous_container_asan_correct(outer));
124         assert(is_contiguous_container_asan_correct(outer[0]));
125         assert(is_contiguous_container_asan_correct(outer[1]));
126     }
127 #endif
128 }
129