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 const E& error() const & noexcept; 12e356f681SHui Xie // constexpr E& error() & noexcept; 13e356f681SHui Xie // constexpr E&& error() && noexcept; 14e356f681SHui Xie // constexpr const E&& error() const && noexcept; 15e356f681SHui Xie 16e356f681SHui Xie #include <cassert> 17e356f681SHui Xie #include <concepts> 18e356f681SHui Xie #include <expected> 19e356f681SHui Xie #include <type_traits> 20e356f681SHui Xie #include <utility> 21e356f681SHui Xie 22e356f681SHui Xie #include "test_macros.h" 23e356f681SHui Xie 24e356f681SHui Xie // Test noexcept 25e356f681SHui Xie template <class T> 26e356f681SHui Xie concept ErrorNoexcept = 27e356f681SHui Xie requires(T t) { 28e356f681SHui Xie { std::forward<T>(t).error() } noexcept; 29e356f681SHui Xie }; 30e356f681SHui Xie 31e356f681SHui Xie static_assert(!ErrorNoexcept<int>); 32e356f681SHui Xie 33e356f681SHui Xie static_assert(ErrorNoexcept<std::expected<void, int>&>); 34e356f681SHui Xie static_assert(ErrorNoexcept<const std::expected<void, int>&>); 35e356f681SHui Xie static_assert(ErrorNoexcept<std::expected<void, int>&&>); 36e356f681SHui Xie static_assert(ErrorNoexcept<const std::expected<void, int>&&>); 37e356f681SHui Xie 38e356f681SHui Xie constexpr bool test() { 39e356f681SHui Xie // non-const & 40e356f681SHui Xie { 41e356f681SHui Xie std::expected<void, int> e(std::unexpect, 5); 42e356f681SHui Xie decltype(auto) x = e.error(); 43e356f681SHui Xie static_assert(std::same_as<decltype(x), int&>); 44e356f681SHui Xie assert(x == 5); 45e356f681SHui Xie } 46e356f681SHui Xie 47e356f681SHui Xie // const & 48e356f681SHui Xie { 49e356f681SHui Xie const std::expected<void, int> e(std::unexpect, 5); 50e356f681SHui Xie decltype(auto) x = e.error(); 51e356f681SHui Xie static_assert(std::same_as<decltype(x), const int&>); 52e356f681SHui Xie assert(x == 5); 53e356f681SHui Xie } 54e356f681SHui Xie 55e356f681SHui Xie // non-const && 56e356f681SHui Xie { 57e356f681SHui Xie std::expected<void, int> e(std::unexpect, 5); 58e356f681SHui Xie decltype(auto) x = std::move(e).error(); 59e356f681SHui Xie static_assert(std::same_as<decltype(x), int&&>); 60e356f681SHui Xie assert(x == 5); 61e356f681SHui Xie } 62e356f681SHui Xie 63e356f681SHui Xie // const && 64e356f681SHui Xie { 65e356f681SHui Xie const std::expected<void, int> e(std::unexpect, 5); 66e356f681SHui Xie decltype(auto) x = std::move(e).error(); 67e356f681SHui Xie static_assert(std::same_as<decltype(x), const int&&>); 68e356f681SHui Xie assert(x == 5); 69e356f681SHui Xie } 70e356f681SHui Xie 71e356f681SHui Xie return true; 72e356f681SHui Xie } 73e356f681SHui Xie 74e356f681SHui Xie int main(int, char**) { 75e356f681SHui Xie test(); 76e356f681SHui Xie static_assert(test()); 77e356f681SHui Xie return 0; 78e356f681SHui Xie } 79