1a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 2a9e65961SEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a9e65961SEric Fiselier // 7a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 8a9e65961SEric Fiselier 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14 10a9e65961SEric Fiselier 11a9e65961SEric Fiselier // <optional> 12a9e65961SEric Fiselier 13a9e65961SEric Fiselier // void reset() noexcept; 14a9e65961SEric Fiselier 15a9e65961SEric Fiselier #include <optional> 16a9e65961SEric Fiselier #include <type_traits> 17a9e65961SEric Fiselier #include <cassert> 18a9e65961SEric Fiselier 197fc6a556SMarshall Clow #include "test_macros.h" 207fc6a556SMarshall Clow 21a9e65961SEric Fiselier using std::optional; 22a9e65961SEric Fiselier 23a9e65961SEric Fiselier struct X 24a9e65961SEric Fiselier { 25a9e65961SEric Fiselier static bool dtor_called; ~XX26a9e65961SEric Fiselier ~X() {dtor_called = true;} 27a9e65961SEric Fiselier }; 28a9e65961SEric Fiselier 29a9e65961SEric Fiselier bool X::dtor_called = false; 30a9e65961SEric Fiselier check_reset()31*54644993SChristopher Di Bellaconstexpr bool check_reset() 32a9e65961SEric Fiselier { 33a9e65961SEric Fiselier { 34a9e65961SEric Fiselier optional<int> opt; 35a9e65961SEric Fiselier static_assert(noexcept(opt.reset()) == true, ""); 36a9e65961SEric Fiselier opt.reset(); 37a9e65961SEric Fiselier assert(static_cast<bool>(opt) == false); 38a9e65961SEric Fiselier } 39a9e65961SEric Fiselier { 40a9e65961SEric Fiselier optional<int> opt(3); 41a9e65961SEric Fiselier opt.reset(); 42a9e65961SEric Fiselier assert(static_cast<bool>(opt) == false); 43a9e65961SEric Fiselier } 44*54644993SChristopher Di Bella return true; 45*54644993SChristopher Di Bella } 46*54644993SChristopher Di Bella main(int,char **)47*54644993SChristopher Di Bellaint main(int, char**) 48*54644993SChristopher Di Bella { 49*54644993SChristopher Di Bella check_reset(); 50*54644993SChristopher Di Bella #if TEST_STD_VER >= 20 51*54644993SChristopher Di Bella static_assert(check_reset()); 52*54644993SChristopher Di Bella #endif 53a9e65961SEric Fiselier { 54a9e65961SEric Fiselier optional<X> opt; 55a9e65961SEric Fiselier static_assert(noexcept(opt.reset()) == true, ""); 56a9e65961SEric Fiselier assert(X::dtor_called == false); 57a9e65961SEric Fiselier opt.reset(); 58a9e65961SEric Fiselier assert(X::dtor_called == false); 59a9e65961SEric Fiselier assert(static_cast<bool>(opt) == false); 60a9e65961SEric Fiselier } 61a9e65961SEric Fiselier { 62a9e65961SEric Fiselier optional<X> opt(X{}); 63a9e65961SEric Fiselier X::dtor_called = false; 64a9e65961SEric Fiselier opt.reset(); 65a9e65961SEric Fiselier assert(X::dtor_called == true); 66a9e65961SEric Fiselier assert(static_cast<bool>(opt) == false); 67a9e65961SEric Fiselier X::dtor_called = false; 68a9e65961SEric Fiselier } 692df59c50SJF Bastien 702df59c50SJF Bastien return 0; 71a9e65961SEric Fiselier } 72