1e356f681SHui Xie //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 3e356f681SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e356f681SHui Xie // See https://llvm.org/LICENSE.txt for license information. 5e356f681SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e356f681SHui Xie // 7e356f681SHui Xie //===----------------------------------------------------------------------===// 8e356f681SHui Xie 9e356f681SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 10e356f681SHui Xie 11e356f681SHui Xie // constexpr void emplace() noexcept; 12e356f681SHui Xie // 13e356f681SHui Xie // Effects: If has_value() is false, destroys unex and sets has_val to true. 14e356f681SHui Xie 15e356f681SHui Xie #include <cassert> 16e356f681SHui Xie #include <concepts> 17e356f681SHui Xie #include <expected> 18e356f681SHui Xie #include <type_traits> 19e356f681SHui Xie #include <utility> 20e356f681SHui Xie 21e356f681SHui Xie #include "../../types.h" 22e356f681SHui Xie #include "test_macros.h" 23e356f681SHui Xie 24e356f681SHui Xie template <class T> 25e356f681SHui Xie concept EmplaceNoexcept = 26e356f681SHui Xie requires(T t) { 27e356f681SHui Xie { t.emplace() } noexcept; 28e356f681SHui Xie }; 29e356f681SHui Xie static_assert(!EmplaceNoexcept<int>); 30e356f681SHui Xie 31e356f681SHui Xie static_assert(EmplaceNoexcept<std::expected<void, int>>); 32e356f681SHui Xie 33e356f681SHui Xie constexpr bool test() { 34e356f681SHui Xie // has_value 35e356f681SHui Xie { 36e356f681SHui Xie std::expected<void, int> e; 37e356f681SHui Xie e.emplace(); 38e356f681SHui Xie assert(e.has_value()); 39e356f681SHui Xie } 40e356f681SHui Xie 41e356f681SHui Xie // !has_value 42e356f681SHui Xie { 43e356f681SHui Xie Traced::state state{}; 44e356f681SHui Xie std::expected<int, Traced> e(std::unexpect, state, 5); 45e356f681SHui Xie e.emplace(); 46e356f681SHui Xie 47e356f681SHui Xie assert(state.dtorCalled); 48e356f681SHui Xie assert(e.has_value()); 49e356f681SHui Xie } 50e356f681SHui Xie 51e356f681SHui Xie return true; 52e356f681SHui Xie } 53e356f681SHui Xie 54e356f681SHui Xie int main(int, char**) { 55e356f681SHui Xie test(); 56e356f681SHui Xie static_assert(test()); 57e356f681SHui Xie return 0; 58e356f681SHui Xie } 59