//===----------------------------------------------------------------------===// // // 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 // // optional& operator=(nullopt_t) noexcept; #include #include #include #include "test_macros.h" #include "archetypes.hpp" using std::optional; using std::nullopt_t; using std::nullopt; int main() { { optional opt; static_assert(noexcept(opt = nullopt) == true, ""); opt = nullopt; assert(static_cast(opt) == false); } { optional opt(3); opt = nullopt; assert(static_cast(opt) == false); } using TT = TestTypes::TestType; TT::reset(); { optional opt; static_assert(noexcept(opt = nullopt) == true, ""); assert(TT::destroyed == 0); opt = nullopt; assert(TT::constructed == 0); assert(TT::alive == 0); assert(TT::destroyed == 0); assert(static_cast(opt) == false); } assert(TT::alive == 0); assert(TT::destroyed == 0); TT::reset(); { optional opt(42); assert(TT::destroyed == 0); TT::reset_constructors(); opt = nullopt; assert(TT::constructed == 0); assert(TT::alive == 0); assert(TT::destroyed == 1); assert(static_cast(opt) == false); } assert(TT::alive == 0); assert(TT::destroyed == 1); TT::reset(); }