xref: /freebsd-src/contrib/llvm-project/libcxx/include/__expected/bad_expected_access.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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