//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 // constexpr ~expected(); // // Effects: If has_value() is false, destroys unex. // // Remarks: If is_trivially_destructible_v is true, then this destructor is a trivial destructor. #include #include #include #include #include "test_macros.h" // Test Remarks: If is_trivially_destructible_v is true, then this destructor is a trivial destructor. struct NonTrivial { ~NonTrivial() {} }; static_assert(std::is_trivially_destructible_v>); static_assert(!std::is_trivially_destructible_v>); struct TrackedDestroy { bool& destroyed; constexpr TrackedDestroy(bool& b) : destroyed(b) {} constexpr ~TrackedDestroy() { destroyed = true; } }; constexpr bool test() { // has value { [[maybe_unused]] std::expected e(std::in_place); } // has error { bool errorDestroyed = false; { [[maybe_unused]] std::expected e(std::unexpect, errorDestroyed); } assert(errorDestroyed); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }