67 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++2010 11// constexpr bool has_value() const noexcept;12 13#include <cassert>14#include <concepts>15#include <expected>16#include <type_traits>17#include <utility>18 19#include "test_macros.h"20#include "../../types.h"21 22// Test noexcept23template <class T>24concept HasValueNoexcept =25 requires(T t) {26 { t.has_value() } noexcept;27 };28 29struct Foo {};30static_assert(!HasValueNoexcept<Foo>);31 32static_assert(HasValueNoexcept<std::expected<int, int>>);33static_assert(HasValueNoexcept<const std::expected<int, int>>);34 35constexpr bool test() {36 // has_value37 {38 const std::expected<void, int> e;39 assert(e.has_value());40 }41 42 // !has_value43 {44 const std::expected<void, int> e(std::unexpect, 5);45 assert(!e.has_value());46 }47 48 // See comments of the corresponding test in49 // "expected.expected/observers/has_value.pass.cpp".50 {51 const std::expected<void, TailClobberer<1>> e(std::unexpect);52 // clang-cl does not support [[no_unique_address]] yet.53#if !(defined(TEST_COMPILER_CLANG) && defined(_MSC_VER))54 LIBCPP_STATIC_ASSERT(sizeof(TailClobberer<1>) == sizeof(e));55#endif56 assert(!e.has_value());57 }58 59 return true;60}61 62int main(int, char**) {63 test();64 static_assert(test());65 return 0;66}67