]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/23_containers/vector/modifiers/push_back/strong_guarantee.cc
Use effective-target instead of -std options
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 23_containers / vector / modifiers / push_back / strong_guarantee.cc
CommitLineData
818ab71a 1// Copyright (C) 2015-2016 Free Software Foundation, Inc.
793cac74
JW
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
52066eae 18// { dg-do run { target c++11 } }
793cac74
JW
19
20#include <vector>
21#include <testsuite_hooks.h>
22
23template<typename T>
24void 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.
32struct 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
55private:
56 void tick()
57 {
58 if (armed && ticks++)
59 throw 1;
60 }
61
62 static int ticks;
63};
64
65int Bomb::ticks = 0;
66
67void 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
85int main()
86{
87 test01();
88}