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 Bella constexpr 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 Bella int 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