1 // { dg-options "-std=gnu++17" } 2 // { dg-do run { target c++17 } } 3 4 // Copyright (C) 2016-2019 Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // You should have received a copy of the GNU General Public License along 18 // with this library; see the file COPYING3. If not see 19 // <http://www.gnu.org/licenses/>. 20 21 #include <optional> 22 #include <testsuite_hooks.h> 23 24 25 struct NonTransferable 26 { 27 int x; NonTransferableNonTransferable28 NonTransferable(int x) : x(x) {} 29 NonTransferable(NonTransferable&&) = delete; 30 NonTransferable& operator=(NonTransferable&&) = delete; operator intNonTransferable31 operator int() {return x;} 32 }; 33 main()34int main() 35 { 36 std::optional<int> oi; 37 std::optional<NonTransferable> ot(std::move(oi)); 38 VERIFY(!ot); 39 40 std::optional<int> oi2; 41 std::optional<NonTransferable> ot2(oi2); 42 VERIFY(!ot); 43 44 std::optional<int> oi3{42}; 45 std::optional<NonTransferable> ot3(std::move(oi3)); 46 VERIFY(ot3 && *ot3 == 42); 47 48 std::optional<int> oi4{666}; 49 std::optional<NonTransferable> ot4(oi4); 50 VERIFY(ot4 && *ot4 == 666); 51 } 52