1 // Copyright (C) 2013-2018 Free Software Foundation, Inc.
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)
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.
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/>.
26 mixin_counter() { ++counter; }
27 mixin_counter(mixin_counter const&) { ++counter; }
28 ~mixin_counter() { --counter; }
31 struct value_type : private mixin_counter
37 throwing_construction,
39 throwing_copy_assignment,
41 throwing_move_assignment,
45 value_type() = default;
47 explicit value_type(state_type state_)
50 throw_if(throwing_construction);
53 value_type(value_type const& other)
56 throw_if(throwing_copy);
60 operator=(value_type const& other)
63 throw_if(throwing_copy_assignment);
67 value_type(value_type&& other)
70 other.state = moved_from;
71 throw_if(throwing_move);
75 operator=(value_type&& other)
78 other.state = moved_from;
79 throw_if(throwing_move_assignment);
83 void throw_if(state_type match)
92 state_type state = zero;
97 using O = gdb::optional<value_type>;
98 using S = value_type::state_type;
99 auto const make = [](S s = S::zero) { return value_type { s }; };
101 enum outcome_type { nothrow, caught, bad_catch };
103 // Check value assignment for disengaged optional
107 value_type v = make(S::throwing_copy_assignment);
109 VERIFY( o && o->state == S::throwing_copy_assignment );
114 value_type v = make(S::throwing_move_assignment);
116 VERIFY( o && o->state == S::throwing_move_assignment );
120 ATTRIBUTE_UNUSED outcome_type outcome {};
122 value_type v = make(S::throwing_copy);
128 catch(exception const&)
129 { outcome = caught; }
131 { outcome = bad_catch; }
137 ATTRIBUTE_UNUSED outcome_type outcome {};
139 value_type v = make(S::throwing_move);
145 catch(exception const&)
146 { outcome = caught; }
148 { outcome = bad_catch; }
153 VERIFY( counter == 0 );
156 } // namespace assign_3