//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // // void reset() noexcept; #include #include #include using std::optional; struct X { static bool dtor_called; ~X() {dtor_called = true;} }; bool X::dtor_called = false; int main() { { optional opt; static_assert(noexcept(opt.reset()) == true, ""); opt.reset(); assert(static_cast(opt) == false); } { optional opt(3); opt.reset(); assert(static_cast(opt) == false); } { optional opt; static_assert(noexcept(opt.reset()) == true, ""); assert(X::dtor_called == false); opt.reset(); assert(X::dtor_called == false); assert(static_cast(opt) == false); } assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997 { optional opt(X{}); X::dtor_called = false; opt.reset(); assert(X::dtor_called == true); assert(static_cast(opt) == false); X::dtor_called = false; } assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997 }