1bdd1243dSDimitry Andric // -*- C++ -*- 2bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 3bdd1243dSDimitry Andric // 4bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7bdd1243dSDimitry Andric // 8bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 9bdd1243dSDimitry Andric #ifndef _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H 10bdd1243dSDimitry Andric #define _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H 11bdd1243dSDimitry Andric 12bdd1243dSDimitry Andric #include <__config> 1306c3fb27SDimitry Andric #include <__exception/exception.h> 14bdd1243dSDimitry Andric #include <__utility/move.h> 15bdd1243dSDimitry Andric 16bdd1243dSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17bdd1243dSDimitry Andric # pragma GCC system_header 18bdd1243dSDimitry Andric #endif 19bdd1243dSDimitry Andric 2006c3fb27SDimitry Andric _LIBCPP_PUSH_MACROS 2106c3fb27SDimitry Andric #include <__undef_macros> 2206c3fb27SDimitry Andric 23bdd1243dSDimitry Andric #if _LIBCPP_STD_VER >= 23 24bdd1243dSDimitry Andric 25bdd1243dSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 26bdd1243dSDimitry Andric 27bdd1243dSDimitry Andric template <class _Err> 28bdd1243dSDimitry Andric class bad_expected_access; 29bdd1243dSDimitry Andric 30*0fca6ea1SDimitry Andric _LIBCPP_DIAGNOSTIC_PUSH 31*0fca6ea1SDimitry Andric # if !_LIBCPP_AVAILABILITY_HAS_BAD_EXPECTED_ACCESS_KEY_FUNCTION 32*0fca6ea1SDimitry Andric _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wweak-vtables") 33*0fca6ea1SDimitry Andric # endif 34bdd1243dSDimitry Andric template <> 35*0fca6ea1SDimitry Andric class _LIBCPP_EXPORTED_FROM_ABI bad_expected_access<void> : public exception { 36bdd1243dSDimitry Andric protected: 37bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI bad_expected_access() noexcept = default; 38*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI bad_expected_access(const bad_expected_access&) noexcept = default; 39*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI bad_expected_access(bad_expected_access&&) noexcept = default; 40*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(const bad_expected_access&) noexcept = default; 41*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(bad_expected_access&&) noexcept = default; 4206c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI_VIRTUAL ~bad_expected_access() override = default; 43bdd1243dSDimitry Andric 44bdd1243dSDimitry Andric public: 45*0fca6ea1SDimitry Andric # if _LIBCPP_AVAILABILITY_HAS_BAD_EXPECTED_ACCESS_KEY_FUNCTION 46*0fca6ea1SDimitry Andric const char* what() const noexcept override; 47*0fca6ea1SDimitry Andric # else 4806c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI_VIRTUAL const char* what() const noexcept override { return "bad access to std::expected"; } 49*0fca6ea1SDimitry Andric # endif 50bdd1243dSDimitry Andric }; 51*0fca6ea1SDimitry Andric _LIBCPP_DIAGNOSTIC_POP 52bdd1243dSDimitry Andric 53bdd1243dSDimitry Andric template <class _Err> 54bdd1243dSDimitry Andric class bad_expected_access : public bad_expected_access<void> { 55bdd1243dSDimitry Andric public: 56bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit bad_expected_access(_Err __e) : __unex_(std::move(__e)) {} 57bdd1243dSDimitry Andric 58bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI _Err& error() & noexcept { return __unex_; } 59bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI const _Err& error() const& noexcept { return __unex_; } 60bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI _Err&& error() && noexcept { return std::move(__unex_); } 61bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI const _Err&& error() const&& noexcept { return std::move(__unex_); } 62bdd1243dSDimitry Andric 63bdd1243dSDimitry Andric private: 64bdd1243dSDimitry Andric _Err __unex_; 65bdd1243dSDimitry Andric }; 66bdd1243dSDimitry Andric 67bdd1243dSDimitry Andric _LIBCPP_END_NAMESPACE_STD 68bdd1243dSDimitry Andric 69bdd1243dSDimitry Andric #endif // _LIBCPP_STD_VER >= 23 70bdd1243dSDimitry Andric 7106c3fb27SDimitry Andric _LIBCPP_POP_MACROS 7206c3fb27SDimitry Andric 73bdd1243dSDimitry Andric #endif // _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H 74