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 explicit operator bool() 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" 20e356f681SHui Xie 21e356f681SHui Xie // Test noexcept 22e356f681SHui Xie template <class T> 23e356f681SHui Xie concept OpBoolNoexcept = 24e356f681SHui Xie requires(T t) { 25e356f681SHui Xie { static_cast<bool>(t) } noexcept; 26e356f681SHui Xie }; 27e356f681SHui Xie 28e356f681SHui Xie struct Foo {}; 29e356f681SHui Xie static_assert(!OpBoolNoexcept<Foo>); 30e356f681SHui Xie 31e356f681SHui Xie static_assert(OpBoolNoexcept<std::expected<int, int>>); 32e356f681SHui Xie static_assert(OpBoolNoexcept<const std::expected<int, int>>); 33e356f681SHui Xie 34e356f681SHui Xie // Test explicit 35e356f681SHui Xie static_assert(!std::is_convertible_v<std::expected<int, int>, bool>); 36e356f681SHui Xie 37e356f681SHui Xie constexpr bool test() { 38e356f681SHui Xie // has_value 39e356f681SHui Xie { 40e356f681SHui Xie const std::expected<int, int> e(5); 41e356f681SHui Xie assert(static_cast<bool>(e)); 42e356f681SHui Xie } 43e356f681SHui Xie 44e356f681SHui Xie // !has_value 45e356f681SHui Xie { 46e356f681SHui Xie const std::expected<int, int> e(std::unexpect, 5); 47e356f681SHui Xie assert(!static_cast<bool>(e)); 48e356f681SHui Xie } 49e356f681SHui Xie 50e356f681SHui Xie return true; 51e356f681SHui Xie } 52e356f681SHui Xie 53e356f681SHui Xie int main(int, char**) { 54e356f681SHui Xie test(); 55e356f681SHui Xie static_assert(test()); 56e356f681SHui Xie return 0; 57e356f681SHui Xie } 58