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 bool has_value() const noexcept; 12e356f681SHui Xie 13e356f681SHui Xie #include <cassert> 14e356f681SHui Xie #include <concepts> 15e356f681SHui Xie #include <expected> 16e356f681SHui Xie #include <type_traits> 17e356f681SHui Xie #include <utility> 18e356f681SHui Xie 19e356f681SHui Xie #include "test_macros.h" 20134c9159SJan Kokemüller #include "../../types.h" 21e356f681SHui Xie 22e356f681SHui Xie // Test noexcept 23e356f681SHui Xie template <class T> 24e356f681SHui Xie concept HasValueNoexcept = 25e356f681SHui Xie requires(T t) { 26e356f681SHui Xie { t.has_value() } noexcept; 27e356f681SHui Xie }; 28e356f681SHui Xie 29e356f681SHui Xie struct Foo {}; 30e356f681SHui Xie static_assert(!HasValueNoexcept<Foo>); 31e356f681SHui Xie 32e356f681SHui Xie static_assert(HasValueNoexcept<std::expected<int, int>>); 33e356f681SHui Xie static_assert(HasValueNoexcept<const std::expected<int, int>>); 34e356f681SHui Xie 35e356f681SHui Xie constexpr bool test() { 36e356f681SHui Xie // has_value 37e356f681SHui Xie { 38e356f681SHui Xie const std::expected<void, int> e; 39e356f681SHui Xie assert(e.has_value()); 40e356f681SHui Xie } 41e356f681SHui Xie 42e356f681SHui Xie // !has_value 43e356f681SHui Xie { 44e356f681SHui Xie const std::expected<void, int> e(std::unexpect, 5); 45e356f681SHui Xie assert(!e.has_value()); 46e356f681SHui Xie } 47e356f681SHui Xie 48134c9159SJan Kokemüller // See comments of the corresponding test in 49134c9159SJan Kokemüller // "expected.expected/observers/has_value.pass.cpp". 50134c9159SJan Kokemüller { 51134c9159SJan Kokemüller const std::expected<void, TailClobberer<1>> e(std::unexpect); 52134c9159SJan Kokemüller // clang-cl does not support [[no_unique_address]] yet. 53134c9159SJan Kokemüller #if !(defined(TEST_COMPILER_CLANG) && defined(_MSC_VER)) 54134c9159SJan Kokemüller LIBCPP_STATIC_ASSERT(sizeof(TailClobberer<1>) == sizeof(e)); 55134c9159SJan Kokemüller #endif 56134c9159SJan Kokemüller assert(!e.has_value()); 57134c9159SJan Kokemüller } 58134c9159SJan Kokemüller 59e356f681SHui Xie return true; 60e356f681SHui Xie } 61e356f681SHui Xie 62e356f681SHui Xie int main(int, char**) { 63e356f681SHui Xie test(); 64e356f681SHui Xie static_assert(test()); 65e356f681SHui Xie return 0; 66e356f681SHui Xie } 67