]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/strong_guarantee.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 23_containers / vector / modifiers / push_back / strong_guarantee.cc
1 // Copyright (C) 2015-2019 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-do run { target c++11 } }
19
20 #include <vector>
21 #include <testsuite_hooks.h>
22
23 template<typename T>
24 void check(const T& t)
25 {
26 for (auto& e : t)
27 VERIFY( !e.moved_from);
28 }
29
30 // This type is CopyInsertable into std::vector<Bomb> so push_back should
31 // have the strong exception-safety guarantee.
32 struct Bomb
33 {
34 Bomb() = default;
35
36 Bomb(const Bomb& b)
37 : armed(b.armed)
38 {
39 tick();
40 }
41
42 Bomb(Bomb&& b) noexcept(false)
43 : armed(b.armed)
44 {
45 tick();
46 b.moved_from = true;
47 }
48
49 // std::vector in GCC 4.x tries to use this constructor
50 template<typename T> Bomb(T&) = delete;
51
52 bool moved_from = false;
53 bool armed = true;
54
55 private:
56 void tick()
57 {
58 if (armed && ticks++)
59 throw 1;
60 }
61
62 static int ticks;
63 };
64
65 int Bomb::ticks = 0;
66
67 void test01()
68 {
69 std::vector<Bomb> v(2); // fill with armed bombs
70 v.resize(v.capacity()); // ensure no unused capacity
71 check(v); // sanity check
72
73 try {
74 Bomb defused;
75 // don't want any copies/moves of this object to throw
76 defused.armed = false;
77 // insert new element, existing elements will be relocated and explode
78 v.push_back(defused);
79 VERIFY(false); // should be unreachable
80 } catch (int) {
81 check(v); // make sure no elements have been moved from
82 }
83 }
84
85 int main()
86 {
87 test01();
88 }