1// Copyright (C) 2013-2020 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 18namespace cons_copy { 19 20struct tracker 21{ 22 tracker(int value) : value(value) { ++count; } 23 ~tracker() { --count; } 24 25 tracker(tracker const& other) : value(other.value) { ++count; } 26 tracker(tracker&& other) : value(other.value) 27 { 28 other.value = -1; 29 ++count; 30 } 31 32 tracker& operator=(tracker const&) = default; 33 tracker& operator=(tracker&&) = default; 34 35 int value; 36 37 static int count; 38}; 39 40int tracker::count = 0; 41 42struct exception { }; 43 44struct throwing_copy 45{ 46 throwing_copy() = default; 47 throwing_copy(throwing_copy const&) { throw exception {}; } 48}; 49 50static void 51test () 52{ 53 // [20.5.4.1] Constructors 54 55 { 56 gdb::optional<long> o; 57 auto copy = o; 58 VERIFY( !copy ); 59 VERIFY( !o ); 60 } 61 62 { 63 const long val = 0x1234ABCD; 64 gdb::optional<long> o { gdb::in_place, val}; 65 auto copy = o; 66 VERIFY( copy ); 67 VERIFY( *copy == val ); 68#ifndef GDB_OPTIONAL 69 VERIFY( o && o == val ); 70#endif 71 } 72 73 { 74 gdb::optional<tracker> o; 75 auto copy = o; 76 VERIFY( !copy ); 77 VERIFY( tracker::count == 0 ); 78 VERIFY( !o ); 79 } 80 81 { 82 gdb::optional<tracker> o { gdb::in_place, 333 }; 83 auto copy = o; 84 VERIFY( copy ); 85 VERIFY( copy->value == 333 ); 86 VERIFY( tracker::count == 2 ); 87 VERIFY( o && o->value == 333 ); 88 } 89 90 enum outcome { nothrow, caught, bad_catch }; 91 92 { 93 outcome result = nothrow; 94 gdb::optional<throwing_copy> o; 95 96 try 97 { 98 auto copy = o; 99 } 100 catch(exception const&) 101 { result = caught; } 102 catch(...) 103 { result = bad_catch; } 104 105 VERIFY( result == nothrow ); 106 } 107 108 { 109 outcome result = nothrow; 110 gdb::optional<throwing_copy> o { gdb::in_place }; 111 112 try 113 { 114 auto copy = o; 115 } 116 catch(exception const&) 117 { result = caught; } 118 catch(...) 119 { result = bad_catch; } 120 121 VERIFY( result == caught ); 122 } 123 124 VERIFY( tracker::count == 0 ); 125} 126 127} // namespace cons_copy 128