1 // { dg-do run { target c++17 } } 2 3 // Copyright (C) 2013-2021 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // You should have received a copy of the GNU General Public License along 17 // with this library; see the file COPYING3. If not see 18 // <http://www.gnu.org/licenses/>. 19 20 #include <optional> 21 #include <vector> 22 #include <testsuite_hooks.h> 23 24 int counter = 0; 25 26 struct mixin_counter 27 { mixin_countermixin_counter28 mixin_counter() { ++counter; } mixin_countermixin_counter29 mixin_counter(mixin_counter const&) { ++counter; } ~mixin_countermixin_counter30 ~mixin_counter() { --counter; } 31 }; 32 33 struct value_type : private mixin_counter { }; 34 main()35int main() 36 { 37 using O = std::optional<value_type>; 38 39 // Check std::nullopt_t and 'default' (= {}) assignment 40 41 { 42 O o; 43 o = std::nullopt; 44 VERIFY( !o ); 45 } 46 47 { 48 O o { std::in_place }; 49 o = std::nullopt; 50 VERIFY( !o ); 51 } 52 53 { 54 O o; 55 o = {}; 56 VERIFY( !o ); 57 } 58 59 { 60 O o { std::in_place }; 61 o = {}; 62 VERIFY( !o ); 63 } 64 { 65 std::optional<std::vector<int>> ovi{{1, 2, 3}}; 66 VERIFY(ovi->size() == 3); 67 VERIFY((*ovi)[0] == 1 && (*ovi)[1] == 2 && (*ovi)[2] == 3); 68 ovi = {4, 5, 6, 7}; 69 VERIFY(ovi->size() == 4); 70 VERIFY((*ovi)[0] == 4 && (*ovi)[1] == 5 && 71 (*ovi)[2] == 6 && (*ovi)[3] == 7); 72 } 73 VERIFY( counter == 0 ); 74 } 75