blob: a7f1917ab8563e7d7ee139f9a6270410129c8db7 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10// <list>
11
Howard Hinnant6046ace2010-08-22 00:15:28 +000012// template <InputIterator Iter>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000013// iterator insert(const_iterator position, Iter first, Iter last);
14
Eric Fiselier07a4bec2015-03-10 20:46:04 +000015// UNSUPPORTED: sanitizer-new-delete
Eric Fiselier72aab5f2014-11-04 05:11:41 +000016
Howard Hinnant5e571422013-08-23 20:10:18 +000017#if _LIBCPP_DEBUG >= 1
Howard Hinnant79a35572013-04-05 00:18:49 +000018#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
19#endif
20
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000021#include <list>
22#include <cstdlib>
23#include <cassert>
Howard Hinnant79a35572013-04-05 00:18:49 +000024#include "test_iterators.h"
Marshall Clow061d0cc2013-11-26 20:58:02 +000025#include "min_allocator.h"
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000026
27int throw_next = 0xFFFF;
28int count = 0;
29
30void* operator new(std::size_t s) throw(std::bad_alloc)
31{
32 if (throw_next == 0)
33 throw std::bad_alloc();
34 --throw_next;
35 ++count;
36 return std::malloc(s);
37}
38
39void operator delete(void* p) throw()
40{
41 --count;
42 std::free(p);
43}
44
45int main()
46{
Howard Hinnant79a35572013-04-05 00:18:49 +000047 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000048 int a1[] = {1, 2, 3};
49 std::list<int> l1;
50 std::list<int>::iterator i = l1.insert(l1.begin(), a1, a1+3);
51 assert(i == l1.begin());
52 assert(l1.size() == 3);
53 assert(distance(l1.begin(), l1.end()) == 3);
54 i = l1.begin();
55 assert(*i == 1);
56 ++i;
57 assert(*i == 2);
58 ++i;
59 assert(*i == 3);
60 int a2[] = {4, 5, 6};
61 i = l1.insert(i, a2, a2+3);
62 assert(*i == 4);
63 assert(l1.size() == 6);
64 assert(distance(l1.begin(), l1.end()) == 6);
65 i = l1.begin();
66 assert(*i == 1);
67 ++i;
68 assert(*i == 2);
69 ++i;
70 assert(*i == 4);
71 ++i;
72 assert(*i == 5);
73 ++i;
74 assert(*i == 6);
75 ++i;
76 assert(*i == 3);
77 throw_next = 2;
78 int save_count = count;
79 try
80 {
81 i = l1.insert(i, a2, a2+3);
82 assert(false);
83 }
84 catch (...)
85 {
86 }
87 assert(save_count == count);
88 assert(l1.size() == 6);
89 assert(distance(l1.begin(), l1.end()) == 6);
90 i = l1.begin();
91 assert(*i == 1);
92 ++i;
93 assert(*i == 2);
94 ++i;
95 assert(*i == 4);
96 ++i;
97 assert(*i == 5);
98 ++i;
99 assert(*i == 6);
100 ++i;
101 assert(*i == 3);
Howard Hinnant79a35572013-04-05 00:18:49 +0000102 }
Howard Hinnant29f74322013-06-25 16:08:47 +0000103 throw_next = 0xFFFF;
Howard Hinnant5e571422013-08-23 20:10:18 +0000104#if _LIBCPP_DEBUG >= 1
Howard Hinnant79a35572013-04-05 00:18:49 +0000105 {
Howard Hinnant79a35572013-04-05 00:18:49 +0000106 std::list<int> v(100);
107 std::list<int> v2(100);
108 int a[] = {1, 2, 3, 4, 5};
109 const int N = sizeof(a)/sizeof(a[0]);
110 std::list<int>::iterator i = v.insert(next(v2.cbegin(), 10), input_iterator<const int*>(a),
111 input_iterator<const int*>(a+N));
112 assert(false);
113 }
114#endif
Howard Hinnant29f74322013-06-25 16:08:47 +0000115#if __cplusplus >= 201103L
116 {
117 int a1[] = {1, 2, 3};
118 std::list<int, min_allocator<int>> l1;
119 std::list<int, min_allocator<int>>::iterator i = l1.insert(l1.begin(), a1, a1+3);
120 assert(i == l1.begin());
121 assert(l1.size() == 3);
122 assert(distance(l1.begin(), l1.end()) == 3);
123 i = l1.begin();
124 assert(*i == 1);
125 ++i;
126 assert(*i == 2);
127 ++i;
128 assert(*i == 3);
129 int a2[] = {4, 5, 6};
130 i = l1.insert(i, a2, a2+3);
131 assert(*i == 4);
132 assert(l1.size() == 6);
133 assert(distance(l1.begin(), l1.end()) == 6);
134 i = l1.begin();
135 assert(*i == 1);
136 ++i;
137 assert(*i == 2);
138 ++i;
139 assert(*i == 4);
140 ++i;
141 assert(*i == 5);
142 ++i;
143 assert(*i == 6);
144 ++i;
145 assert(*i == 3);
146 throw_next = 2;
147 int save_count = count;
148 try
149 {
150 i = l1.insert(i, a2, a2+3);
151 assert(false);
152 }
153 catch (...)
154 {
155 }
156 assert(save_count == count);
157 assert(l1.size() == 6);
158 assert(distance(l1.begin(), l1.end()) == 6);
159 i = l1.begin();
160 assert(*i == 1);
161 ++i;
162 assert(*i == 2);
163 ++i;
164 assert(*i == 4);
165 ++i;
166 assert(*i == 5);
167 ++i;
168 assert(*i == 6);
169 ++i;
170 assert(*i == 3);
171 }
Howard Hinnant5e571422013-08-23 20:10:18 +0000172#if _LIBCPP_DEBUG >= 1
Howard Hinnant29f74322013-06-25 16:08:47 +0000173 {
174 throw_next = 0xFFFF;
175 std::list<int, min_allocator<int>> v(100);
176 std::list<int, min_allocator<int>> v2(100);
177 int a[] = {1, 2, 3, 4, 5};
178 const int N = sizeof(a)/sizeof(a[0]);
179 std::list<int, min_allocator<int>>::iterator i = v.insert(next(v2.cbegin(), 10), input_iterator<const int*>(a),
180 input_iterator<const int*>(a+N));
181 assert(false);
182 }
183#endif
184#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000185}