1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: libcpp-no-exceptions
11 // Test asan vector annotations with a class that throws in a CTOR.
16 #include "asan_testing.h"
20 X(const X &x) { Init(x.a); }
21 X(char arg) { Init(arg); }
23 X &operator=(const X &x) {
34 char get() const { return a; }
35 void set(char arg) { a = arg; }
43 ThrowOnCopy() : should_throw(false) {}
44 explicit ThrowOnCopy(bool xshould_throw) : should_throw(xshould_throw) {}
46 ThrowOnCopy(ThrowOnCopy const & other)
47 : should_throw(other.should_throw)
57 void test_push_back() {
61 assert(v.size() == 1);
66 assert(v.size() == 1);
68 assert(v.size() == 1);
69 assert(is_contiguous_container_asan_correct(v));
72 void test_emplace_back() {
73 #ifndef _LIBCPP_HAS_NO_VARIADICS
77 assert(v.size() == 1);
82 assert(v.size() == 1);
84 assert(v.size() == 1);
85 assert(is_contiguous_container_asan_correct(v));
86 #endif // _LIBCPP_HAS_NO_VARIADICS
89 void test_insert_range() {
94 assert(v.size() == 2);
95 assert(v.capacity() >= 4);
98 v.insert(v.end(), a, a + 2);
101 assert(v.size() == 3);
103 assert(v.size() == 3);
104 assert(is_contiguous_container_asan_correct(v));
110 v.insert(v.end(), X(1));
111 v.insert(v.begin(), X(2));
112 assert(v.size() == 2);
114 v.insert(v.end(), X(66));
117 assert(v.size() == 2);
119 assert(v.size() == 2);
120 assert(is_contiguous_container_asan_correct(v));
123 void test_emplace() {
124 #ifndef _LIBCPP_HAS_NO_VARIADICS
127 v.insert(v.end(), X(1));
128 v.insert(v.begin(), X(2));
129 assert(v.size() == 2);
131 v.emplace(v.end(), 42);
134 assert(v.size() == 2);
136 assert(v.size() == 2);
137 assert(is_contiguous_container_asan_correct(v));
138 #endif // _LIBCPP_HAS_NO_VARIADICS
141 void test_insert_range2() {
144 v.insert(v.end(), X(1));
145 v.insert(v.begin(), X(2));
146 assert(v.size() == 2);
147 assert(v.capacity() >= 4);
149 char a[2] = {10, 42};
150 v.insert(v.begin(), a, a + 2);
153 assert(v.size() <= 4);
154 assert(is_contiguous_container_asan_correct(v));
160 void test_insert_n() {
163 v.insert(v.end(), X(1));
164 v.insert(v.begin(), X(2));
165 assert(v.size() == 2);
167 v.insert(v.begin(), 1, X(66));
170 assert(v.size() <= 3);
171 assert(is_contiguous_container_asan_correct(v));
178 void test_insert_n2() {
179 std::vector<ThrowOnCopy> v(10);
181 assert(v.size() == 10);
182 v[6].should_throw = true;
184 v.insert(v.cbegin(), 5, ThrowOnCopy());
187 assert(v.size() == 11);
188 assert(is_contiguous_container_asan_correct(v));
202 assert(v.size() == 1);
204 assert(v.size() == 1);
205 assert(is_contiguous_container_asan_correct(v));
208 void test_resize_param() {
216 assert(v.size() == 1);
218 assert(v.size() == 1);
219 assert(is_contiguous_container_asan_correct(v));
228 test_insert_range2();