xref: /freebsd/contrib/llvm-project/libcxx/include/__expected/expected.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef _LIBCPP___EXPECTED_EXPECTED_H
10 #define _LIBCPP___EXPECTED_EXPECTED_H
11 
12 #include <__assert>
13 #include <__config>
14 #include <__expected/bad_expected_access.h>
15 #include <__expected/unexpect.h>
16 #include <__expected/unexpected.h>
17 #include <__functional/invoke.h>
18 #include <__memory/addressof.h>
19 #include <__memory/construct_at.h>
20 #include <__type_traits/conjunction.h>
21 #include <__type_traits/disjunction.h>
22 #include <__type_traits/integral_constant.h>
23 #include <__type_traits/is_assignable.h>
24 #include <__type_traits/is_constructible.h>
25 #include <__type_traits/is_convertible.h>
26 #include <__type_traits/is_function.h>
27 #include <__type_traits/is_nothrow_assignable.h>
28 #include <__type_traits/is_nothrow_constructible.h>
29 #include <__type_traits/is_reference.h>
30 #include <__type_traits/is_same.h>
31 #include <__type_traits/is_swappable.h>
32 #include <__type_traits/is_trivially_constructible.h>
33 #include <__type_traits/is_trivially_destructible.h>
34 #include <__type_traits/is_trivially_relocatable.h>
35 #include <__type_traits/is_void.h>
36 #include <__type_traits/lazy.h>
37 #include <__type_traits/negation.h>
38 #include <__type_traits/remove_cv.h>
39 #include <__type_traits/remove_cvref.h>
40 #include <__utility/as_const.h>
41 #include <__utility/exception_guard.h>
42 #include <__utility/forward.h>
43 #include <__utility/in_place.h>
44 #include <__utility/move.h>
45 #include <__utility/swap.h>
46 #include <__verbose_abort>
47 #include <initializer_list>
48 
49 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
50 #  pragma GCC system_header
51 #endif
52 
53 _LIBCPP_PUSH_MACROS
54 #include <__undef_macros>
55 
56 #if _LIBCPP_STD_VER >= 23
57 
58 _LIBCPP_BEGIN_NAMESPACE_STD
59 
60 template <class _Tp, class _Err>
61 class expected;
62 
63 template <class _Tp>
64 struct __is_std_expected : false_type {};
65 
66 template <class _Tp, class _Err>
67 struct __is_std_expected<expected<_Tp, _Err>> : true_type {};
68 
69 struct __expected_construct_in_place_from_invoke_tag {};
70 struct __expected_construct_unexpected_from_invoke_tag {};
71 
72 template <class _Err, class _Arg>
73 _LIBCPP_HIDE_FROM_ABI void __throw_bad_expected_access(_Arg&& __arg) {
74 #  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
75   throw bad_expected_access<_Err>(std::forward<_Arg>(__arg));
76 #  else
77   (void)__arg;
78   _LIBCPP_VERBOSE_ABORT("bad_expected_access was thrown in -fno-exceptions mode");
79 #  endif
80 }
81 
82 // If parameter type `_Tp` of `__conditional_no_unique_address` is neither
83 // copyable nor movable, a constructor with this tag is provided. For that
84 // constructor, the user has to provide a function and arguments. The function
85 // must return an object of type `_Tp`. When the function is invoked by the
86 // constructor, guaranteed copy elision kicks in and the `_Tp` is constructed
87 // in place.
88 struct __conditional_no_unique_address_invoke_tag {};
89 
90 // This class implements an object with `[[no_unique_address]]` conditionally applied to it,
91 // based on the value of `_NoUnique`.
92 //
93 // A member of this class must always have `[[no_unique_address]]` applied to
94 // it. Otherwise, the `[[no_unique_address]]` in the "`_NoUnique == true`" case
95 // would not have any effect. In the `false` case, the `__v` is not
96 // `[[no_unique_address]]`, so nullifies the effects of the "outer"
97 // `[[no_unique_address]]` regarding data layout.
98 //
99 // If we had a language feature, this class would basically be replaced by `[[no_unique_address(condition)]]`.
100 template <bool _NoUnique, class _Tp>
101 struct __conditional_no_unique_address;
102 
103 template <class _Tp>
104 struct __conditional_no_unique_address<true, _Tp> {
105   template <class... _Args>
106   _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(in_place_t, _Args&&... __args)
107       : __v(std::forward<_Args>(__args)...) {}
108 
109   template <class _Func, class... _Args>
110   _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(
111       __conditional_no_unique_address_invoke_tag, _Func&& __f, _Args&&... __args)
112       : __v(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}
113 
114   _LIBCPP_NO_UNIQUE_ADDRESS _Tp __v;
115 };
116 
117 template <class _Tp>
118 struct __conditional_no_unique_address<false, _Tp> {
119   template <class... _Args>
120   _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(in_place_t, _Args&&... __args)
121       : __v(std::forward<_Args>(__args)...) {}
122 
123   template <class _Func, class... _Args>
124   _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(
125       __conditional_no_unique_address_invoke_tag, _Func&& __f, _Args&&... __args)
126       : __v(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}
127 
128   _Tp __v;
129 };
130 
131 // This function returns whether the type `_Second` can be stuffed into the tail padding
132 // of the `_First` type if both of them are given `[[no_unique_address]]`.
133 template <class _First, class _Second>
134 inline constexpr bool __fits_in_tail_padding = []() {
135   struct __x {
136     _LIBCPP_NO_UNIQUE_ADDRESS _First __first;
137     _LIBCPP_NO_UNIQUE_ADDRESS _Second __second;
138   };
139   return sizeof(__x) == sizeof(_First);
140 }();
141 
142 // This class implements the storage used by `std::expected`. We have a few
143 // goals for this storage:
144 // 1. Whenever the underlying {_Tp | _Unex} combination has free bytes in its
145 //    tail padding, we should reuse it to store the bool discriminator of the
146 //    expected, so as to save space.
147 // 2. Whenever the `expected<_Tp, _Unex>` as a whole has free bytes in its tail
148 //    padding, we should allow an object following the expected to be stored in
149 //    its tail padding.
150 // 3. However, we never want a user object (say `X`) that would follow an
151 //    `expected<_Tp, _Unex>` to be stored in the padding bytes of the
152 //    underlying {_Tp | _Unex} union, if any. That is because we use
153 //    `construct_at` on that union, which would end up overwriting the `X`
154 //    member if it is stored in the tail padding of the union.
155 //
156 // To achieve this, `__expected_base`'s logic is implemented in an inner
157 // `__repr` class. `__expected_base` holds one `__repr` member which is
158 // conditionally `[[no_unique_address]]`. The `__repr` class holds the
159 // underlying {_Tp | _Unex} union and a boolean "has value" flag.
160 //
161 // Which one of the `__repr_`/`__union_` members is `[[no_unique_address]]`
162 // depends on whether the "has value" boolean fits into the tail padding of
163 // the underlying {_Tp | _Unex} union:
164 //
165 // - In case the "has value" bool fits into the tail padding of the union, the
166 //   whole `__repr_` member is _not_ `[[no_unique_address]]` as it needs to be
167 //   transparently replaced on `emplace()`/`swap()` etc.
168 // - In case the "has value" bool does not fit into the tail padding of the
169 //   union, only the union member must be transparently replaced (therefore is
170 //   _not_ `[[no_unique_address]]`) and the "has value" flag must be adjusted
171 //   manually.
172 //
173 // This way, the member that is transparently replaced on mutating operations
174 // is never `[[no_unique_address]]`, satisfying the requirements from
175 // "[basic.life]" in the standard.
176 //
177 // Stripped away of all superfluous elements, the layout of `__expected_base`
178 // then looks like this:
179 //
180 //     template <class Tp, class Err>
181 //     class expected_base {
182 //       union union_t {
183 //         [[no_unique_address]] Tp val;
184 //         [[no_unique_address]] Err unex;
185 //       };
186 //
187 //       static constexpr bool put_flag_in_tail                    = fits_in_tail_padding<union_t, bool>;
188 //       static constexpr bool allow_reusing_expected_tail_padding = !put_flag_in_tail;
189 //
190 //       struct repr {
191 //       private:
192 //         // If "has value" fits into the tail, this should be
193 //         // `[[no_unique_address]]`, otherwise not.
194 //         [[no_unique_address]] conditional_no_unique_address<
195 //             put_flag_in_tail,
196 //             union_t>::type union_;
197 //         [[no_unique_address]] bool has_val_;
198 //       };
199 //
200 //     protected:
201 //       // If "has value" fits into the tail, this must _not_ be
202 //       // `[[no_unique_address]]` so that we fill out the
203 //       // complete `expected` object.
204 //       [[no_unique_address]] conditional_no_unique_address<
205 //           allow_reusing_expected_tail_padding,
206 //           repr>::type repr_;
207 //     };
208 //
209 template <class _Tp, class _Err>
210 class __expected_base {
211   // use named union because [[no_unique_address]] cannot be applied to an unnamed union,
212   // also guaranteed elision into a potentially-overlapping subobject is unsettled (and
213   // it's not clear that it's implementable, given that the function is allowed to clobber
214   // the tail padding) - see https://github.com/itanium-cxx-abi/cxx-abi/issues/107.
215   union __union_t {
216     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&) = delete;
217     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&)
218       requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&
219                is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>)
220     = default;
221     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&) = delete;
222     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&)
223       requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&
224                is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>)
225     = default;
226     _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(const __union_t&) = delete;
227     _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(__union_t&&)      = delete;
228 
229     template <class... _Args>
230     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(in_place_t, _Args&&... __args)
231         : __val_(std::forward<_Args>(__args)...) {}
232 
233     template <class... _Args>
234     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(unexpect_t, _Args&&... __args)
235         : __unex_(std::forward<_Args>(__args)...) {}
236 
237     template <class _Func, class... _Args>
238     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(
239         std::__expected_construct_in_place_from_invoke_tag, _Func&& __f, _Args&&... __args)
240         : __val_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}
241 
242     template <class _Func, class... _Args>
243     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(
244         std::__expected_construct_unexpected_from_invoke_tag, _Func&& __f, _Args&&... __args)
245         : __unex_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}
246 
247     _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()
248       requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>)
249     = default;
250 
251     // __repr's destructor handles this
252     _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() {}
253 
254     _LIBCPP_NO_UNIQUE_ADDRESS _Tp __val_;
255     _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_;
256   };
257 
258   static constexpr bool __put_flag_in_tail                    = __fits_in_tail_padding<__union_t, bool>;
259   static constexpr bool __allow_reusing_expected_tail_padding = !__put_flag_in_tail;
260 
261   struct __repr {
262     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr() = delete;
263 
264     template <class... _Args>
265     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(in_place_t __tag, _Args&&... __args)
266         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(true) {}
267 
268     template <class... _Args>
269     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(unexpect_t __tag, _Args&&... __args)
270         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}
271 
272     template <class... _Args>
273     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_in_place_from_invoke_tag __tag,
274                                                     _Args&&... __args)
275         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(true) {}
276 
277     template <class... _Args>
278     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_unexpected_from_invoke_tag __tag,
279                                                     _Args&&... __args)
280         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}
281 
282     // The return value of `__make_union` must be constructed in place in the
283     // `__v` member of `__union_`, relying on guaranteed copy elision. To do
284     // this, the `__conditional_no_unique_address_invoke_tag` constructor is
285     // called with a lambda that is immediately called inside
286     // `__conditional_no_unique_address`'s constructor.
287     template <class _OtherUnion>
288     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(bool __has_val, _OtherUnion&& __other)
289       requires(__allow_reusing_expected_tail_padding)
290         : __union_(__conditional_no_unique_address_invoke_tag{},
291                    [&] { return __make_union(__has_val, std::forward<_OtherUnion>(__other)); }),
292           __has_val_(__has_val) {}
293 
294     _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&) = delete;
295     _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&)
296       requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&
297                is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>)
298     = default;
299     _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&) = delete;
300     _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&)
301       requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&
302                is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>)
303     = default;
304 
305     _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(const __repr&) = delete;
306     _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(__repr&&)      = delete;
307 
308     _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()
309       requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>)
310     = default;
311 
312     _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()
313       requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>)
314     {
315       __destroy_union_member();
316     }
317 
318     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()
319       requires(__allow_reusing_expected_tail_padding &&
320                (is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>))
321     {
322       // Note: Since the destructor of the union is trivial, this does nothing
323       // except to end the lifetime of the union.
324       std::destroy_at(&__union_.__v);
325     }
326 
327     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()
328       requires(__allow_reusing_expected_tail_padding &&
329                (!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>))
330     {
331       __destroy_union_member();
332       std::destroy_at(&__union_.__v);
333     }
334 
335     template <class... _Args>
336     _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(in_place_t, _Args&&... __args)
337       requires(__allow_reusing_expected_tail_padding)
338     {
339       std::construct_at(&__union_.__v, in_place, std::forward<_Args>(__args)...);
340       __has_val_ = true;
341     }
342 
343     template <class... _Args>
344     _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(unexpect_t, _Args&&... __args)
345       requires(__allow_reusing_expected_tail_padding)
346     {
347       std::construct_at(&__union_.__v, unexpect, std::forward<_Args>(__args)...);
348       __has_val_ = false;
349     }
350 
351   private:
352     template <class, class>
353     friend class __expected_base;
354 
355     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union_member()
356       requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>)
357     {
358       if (__has_val_) {
359         std::destroy_at(std::addressof(__union_.__v.__val_));
360       } else {
361         std::destroy_at(std::addressof(__union_.__v.__unex_));
362       }
363     }
364 
365     template <class _OtherUnion>
366     _LIBCPP_HIDE_FROM_ABI static constexpr __union_t __make_union(bool __has_val, _OtherUnion&& __other)
367       requires(__allow_reusing_expected_tail_padding)
368     {
369       if (__has_val)
370         return __union_t(in_place, std::forward<_OtherUnion>(__other).__val_);
371       else
372         return __union_t(unexpect, std::forward<_OtherUnion>(__other).__unex_);
373     }
374 
375     _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__put_flag_in_tail, __union_t> __union_;
376     _LIBCPP_NO_UNIQUE_ADDRESS bool __has_val_;
377   };
378 
379   template <class _OtherUnion>
380   _LIBCPP_HIDE_FROM_ABI static constexpr __repr __make_repr(bool __has_val, _OtherUnion&& __other)
381     requires(__put_flag_in_tail)
382   {
383     if (__has_val)
384       return __repr(in_place, std::forward<_OtherUnion>(__other).__val_);
385     else
386       return __repr(unexpect, std::forward<_OtherUnion>(__other).__unex_);
387   }
388 
389 protected:
390   template <class... _Args>
391   _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_base(_Args&&... __args)
392       : __repr_(in_place, std::forward<_Args>(__args)...) {}
393 
394   // In case we copy/move construct from another `expected` we need to create
395   // our `expected` so that it either has a value or not, depending on the "has
396   // value" flag of the other `expected`. To do this without falling back on
397   // `std::construct_at` we rely on guaranteed copy elision using two helper
398   // functions `__make_repr` and `__make_union`. There have to be two since
399   // there are two data layouts with different members being
400   // `[[no_unique_address]]`. GCC (as of version 13) does not do guaranteed
401   // copy elision when initializing `[[no_unique_address]]` members. The two
402   // cases are:
403   //
404   // - `__make_repr`: This is used when the "has value" flag lives in the tail
405   //   of the union. In this case, the `__repr` member is _not_
406   //   `[[no_unique_address]]`.
407   // - `__make_union`: When the "has value" flag does _not_ fit in the tail of
408   //   the union, the `__repr` member is `[[no_unique_address]]` and the union
409   //   is not.
410   //
411   // This constructor "catches" the first case and leaves the second case to
412   // `__union_t`, its constructors and `__make_union`.
413   template <class _OtherUnion>
414   _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_base(bool __has_val, _OtherUnion&& __other)
415     requires(__put_flag_in_tail)
416       : __repr_(__conditional_no_unique_address_invoke_tag{},
417                 [&] { return __make_repr(__has_val, std::forward<_OtherUnion>(__other)); }) {}
418 
419   _LIBCPP_HIDE_FROM_ABI constexpr void __destroy() {
420     if constexpr (__put_flag_in_tail)
421       std::destroy_at(&__repr_.__v);
422     else
423       __repr_.__v.__destroy_union();
424   }
425 
426   template <class _Tag, class... _Args>
427   _LIBCPP_HIDE_FROM_ABI constexpr void __construct(_Tag __tag, _Args&&... __args) {
428     if constexpr (__put_flag_in_tail)
429       std::construct_at(&__repr_.__v, __tag, std::forward<_Args>(__args)...);
430     else
431       __repr_.__v.__construct_union(__tag, std::forward<_Args>(__args)...);
432   }
433 
434   _LIBCPP_HIDE_FROM_ABI constexpr bool __has_val() const { return __repr_.__v.__has_val_; }
435   _LIBCPP_HIDE_FROM_ABI constexpr __union_t& __union() { return __repr_.__v.__union_.__v; }
436   _LIBCPP_HIDE_FROM_ABI constexpr const __union_t& __union() const { return __repr_.__v.__union_.__v; }
437   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& __val() { return __repr_.__v.__union_.__v.__val_; }
438   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& __val() const { return __repr_.__v.__union_.__v.__val_; }
439   _LIBCPP_HIDE_FROM_ABI constexpr _Err& __unex() { return __repr_.__v.__union_.__v.__unex_; }
440   _LIBCPP_HIDE_FROM_ABI constexpr const _Err& __unex() const { return __repr_.__v.__union_.__v.__unex_; }
441 
442 private:
443   _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__allow_reusing_expected_tail_padding, __repr> __repr_;
444 };
445 
446 template <class _Tp, class _Err>
447 class expected : private __expected_base<_Tp, _Err> {
448   static_assert(!is_reference_v<_Tp> && !is_function_v<_Tp> && !is_same_v<remove_cv_t<_Tp>, in_place_t> &&
449                     !is_same_v<remove_cv_t<_Tp>, unexpect_t> && !__is_std_unexpected<remove_cv_t<_Tp>>::value &&
450                     __valid_std_unexpected<_Err>::value,
451                 "[expected.object.general] A program that instantiates the definition of template expected<T, E> for a "
452                 "reference type, a function type, or for possibly cv-qualified types in_place_t, unexpect_t, or a "
453                 "specialization of unexpected for the T parameter is ill-formed. A program that instantiates the "
454                 "definition of the template expected<T, E> with a type for the E parameter that is not a valid "
455                 "template argument for unexpected is ill-formed.");
456 
457   template <class _Up, class _OtherErr>
458   friend class expected;
459 
460   using __base = __expected_base<_Tp, _Err>;
461 
462 public:
463   using value_type      = _Tp;
464   using error_type      = _Err;
465   using unexpected_type = unexpected<_Err>;
466 
467   using __trivially_relocatable =
468       __conditional_t<__libcpp_is_trivially_relocatable<_Tp>::value && __libcpp_is_trivially_relocatable<_Err>::value,
469                       expected,
470                       void>;
471 
472   template <class _Up>
473   using rebind = expected<_Up, error_type>;
474 
475   // [expected.object.ctor], constructors
476   _LIBCPP_HIDE_FROM_ABI constexpr expected() noexcept(is_nothrow_default_constructible_v<_Tp>) // strengthened
477     requires is_default_constructible_v<_Tp>
478       : __base(in_place) {}
479 
480   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete;
481 
482   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&)
483     requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Tp> &&
484              is_trivially_copy_constructible_v<_Err>)
485   = default;
486 
487   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __other) noexcept(
488       is_nothrow_copy_constructible_v<_Tp> && is_nothrow_copy_constructible_v<_Err>) // strengthened
489     requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&
490              !(is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>))
491       : __base(__other.__has_val(), __other.__union()) {}
492 
493   _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&)
494     requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Tp> &&
495              is_trivially_move_constructible_v<_Err>)
496   = default;
497 
498   _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __other) noexcept(
499       is_nothrow_move_constructible_v<_Tp> && is_nothrow_move_constructible_v<_Err>)
500     requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&
501              !(is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>))
502       : __base(__other.__has_val(), std::move(__other.__union())) {}
503 
504 private:
505   template <class _Up, class _OtherErr, class _UfQual, class _OtherErrQual>
506   using __can_convert =
507       _And< is_constructible<_Tp, _UfQual>,
508             is_constructible<_Err, _OtherErrQual>,
509             _If<_Not<is_same<remove_cv_t<_Tp>, bool>>::value,
510                 _And<
511                       _Not<_And<is_same<_Tp, _Up>, is_same<_Err, _OtherErr>>>, // use the copy constructor instead, see #92676
512                       _Not<is_constructible<_Tp, expected<_Up, _OtherErr>&>>,
513                       _Not<is_constructible<_Tp, expected<_Up, _OtherErr>>>,
514                       _Not<is_constructible<_Tp, const expected<_Up, _OtherErr>&>>,
515                       _Not<is_constructible<_Tp, const expected<_Up, _OtherErr>>>,
516                       _Not<is_convertible<expected<_Up, _OtherErr>&, _Tp>>,
517                       _Not<is_convertible<expected<_Up, _OtherErr>&&, _Tp>>,
518                       _Not<is_convertible<const expected<_Up, _OtherErr>&, _Tp>>,
519                       _Not<is_convertible<const expected<_Up, _OtherErr>&&, _Tp>>>,
520                 true_type>,
521             _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>&>>,
522             _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>>>,
523             _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>&>>,
524             _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>>> >;
525 
526   template <class _Func, class... _Args>
527   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(
528       std::__expected_construct_in_place_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)
529       : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}
530 
531   template <class _Func, class... _Args>
532   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(
533       std::__expected_construct_unexpected_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)
534       : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}
535 
536 public:
537   template <class _Up, class _OtherErr>
538     requires __can_convert<_Up, _OtherErr, const _Up&, const _OtherErr&>::value
539   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _Up&, _Tp> ||
540                                            !is_convertible_v<const _OtherErr&, _Err>)
541       expected(const expected<_Up, _OtherErr>& __other) noexcept(
542           is_nothrow_constructible_v<_Tp, const _Up&> &&
543           is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened
544       : __base(__other.__has_val(), __other.__union()) {}
545 
546   template <class _Up, class _OtherErr>
547     requires __can_convert<_Up, _OtherErr, _Up, _OtherErr>::value
548   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp> || !is_convertible_v<_OtherErr, _Err>)
549       expected(expected<_Up, _OtherErr>&& __other) noexcept(
550           is_nothrow_constructible_v<_Tp, _Up> && is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened
551       : __base(__other.__has_val(), std::move(__other.__union())) {}
552 
553   template <class _Up = _Tp>
554     requires(!is_same_v<remove_cvref_t<_Up>, in_place_t> && !is_same_v<expected, remove_cvref_t<_Up>> &&
555              is_constructible_v<_Tp, _Up> && !__is_std_unexpected<remove_cvref_t<_Up>>::value &&
556              (!is_same_v<remove_cv_t<_Tp>, bool> || !__is_std_expected<remove_cvref_t<_Up>>::value))
557   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp>)
558       expected(_Up&& __u) noexcept(is_nothrow_constructible_v<_Tp, _Up>) // strengthened
559       : __base(in_place, std::forward<_Up>(__u)) {}
560 
561   template <class _OtherErr>
562     requires is_constructible_v<_Err, const _OtherErr&>
563   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>) expected(
564       const unexpected<_OtherErr>& __unex) noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened
565       : __base(unexpect, __unex.error()) {}
566 
567   template <class _OtherErr>
568     requires is_constructible_v<_Err, _OtherErr>
569   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)
570       expected(unexpected<_OtherErr>&& __unex) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened
571       : __base(unexpect, std::move(__unex.error())) {}
572 
573   template <class... _Args>
574     requires is_constructible_v<_Tp, _Args...>
575   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t, _Args&&... __args) noexcept(
576       is_nothrow_constructible_v<_Tp, _Args...>) // strengthened
577       : __base(in_place, std::forward<_Args>(__args)...) {}
578 
579   template <class _Up, class... _Args>
580     requires is_constructible_v< _Tp, initializer_list<_Up>&, _Args... >
581   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(
582       is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>) // strengthened
583       : __base(in_place, __il, std::forward<_Args>(__args)...) {}
584 
585   template <class... _Args>
586     requires is_constructible_v<_Err, _Args...>
587   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) noexcept(
588       is_nothrow_constructible_v<_Err, _Args...>) // strengthened
589       : __base(unexpect, std::forward<_Args>(__args)...) {}
590 
591   template <class _Up, class... _Args>
592     requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... >
593   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(
594       is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened
595       : __base(unexpect, __il, std::forward<_Args>(__args)...) {}
596 
597   // [expected.object.dtor], destructor
598 
599   _LIBCPP_HIDE_FROM_ABI constexpr ~expected() = default;
600 
601 private:
602   template <class _Tag, class _OtherTag, class _T1, class _T2, class... _Args>
603   _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(_T2& __oldval, _Args&&... __args) {
604     if constexpr (is_nothrow_constructible_v<_T1, _Args...>) {
605       this->__destroy();
606       this->__construct(_Tag{}, std::forward<_Args>(__args)...);
607     } else if constexpr (is_nothrow_move_constructible_v<_T1>) {
608       _T1 __tmp(std::forward<_Args>(__args)...);
609       this->__destroy();
610       this->__construct(_Tag{}, std::move(__tmp));
611     } else {
612       static_assert(
613           is_nothrow_move_constructible_v<_T2>,
614           "To provide strong exception guarantee, T2 has to satisfy `is_nothrow_move_constructible_v` so that it can "
615           "be reverted to the previous state in case an exception is thrown during the assignment.");
616       _T2 __tmp(std::move(__oldval));
617       this->__destroy();
618       auto __trans = std::__make_exception_guard([&] { this->__construct(_OtherTag{}, std::move(__tmp)); });
619       this->__construct(_Tag{}, std::forward<_Args>(__args)...);
620       __trans.__complete();
621     }
622   }
623 
624 public:
625   // [expected.object.assign], assignment
626   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete;
627 
628   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) noexcept(
629       is_nothrow_copy_assignable_v<_Tp> && is_nothrow_copy_constructible_v<_Tp> && is_nothrow_copy_assignable_v<_Err> &&
630       is_nothrow_copy_constructible_v<_Err>) // strengthened
631     requires(is_copy_assignable_v<_Tp> && is_copy_constructible_v<_Tp> && is_copy_assignable_v<_Err> &&
632              is_copy_constructible_v<_Err> &&
633              (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))
634   {
635     if (this->__has_val() && __rhs.__has_val()) {
636       this->__val() = __rhs.__val();
637     } else if (this->__has_val()) {
638       __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), __rhs.__unex());
639     } else if (__rhs.__has_val()) {
640       __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), __rhs.__val());
641     } else {
642       this->__unex() = __rhs.__unex();
643     }
644     return *this;
645   }
646 
647   _LIBCPP_HIDE_FROM_ABI constexpr expected&
648   operator=(expected&& __rhs) noexcept(is_nothrow_move_assignable_v<_Tp> && is_nothrow_move_constructible_v<_Tp> &&
649                                        is_nothrow_move_assignable_v<_Err> && is_nothrow_move_constructible_v<_Err>)
650     requires(is_move_constructible_v<_Tp> && is_move_assignable_v<_Tp> && is_move_constructible_v<_Err> &&
651              is_move_assignable_v<_Err> &&
652              (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))
653   {
654     if (this->__has_val() && __rhs.__has_val()) {
655       this->__val() = std::move(__rhs.__val());
656     } else if (this->__has_val()) {
657       __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), std::move(__rhs.__unex()));
658     } else if (__rhs.__has_val()) {
659       __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), std::move(__rhs.__val()));
660     } else {
661       this->__unex() = std::move(__rhs.__unex());
662     }
663     return *this;
664   }
665 
666   template <class _Up = _Tp>
667   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(_Up&& __v)
668     requires(!is_same_v<expected, remove_cvref_t<_Up>> && !__is_std_unexpected<remove_cvref_t<_Up>>::value &&
669              is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up> &&
670              (is_nothrow_constructible_v<_Tp, _Up> || is_nothrow_move_constructible_v<_Tp> ||
671               is_nothrow_move_constructible_v<_Err>))
672   {
673     if (this->__has_val()) {
674       this->__val() = std::forward<_Up>(__v);
675     } else {
676       __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), std::forward<_Up>(__v));
677     }
678     return *this;
679   }
680 
681 private:
682   template <class _OtherErrQual>
683   static constexpr bool __can_assign_from_unexpected =
684       _And< is_constructible<_Err, _OtherErrQual>,
685             is_assignable<_Err&, _OtherErrQual>,
686             _Lazy<_Or,
687                   is_nothrow_constructible<_Err, _OtherErrQual>,
688                   is_nothrow_move_constructible<_Tp>,
689                   is_nothrow_move_constructible<_Err>> >::value;
690 
691 public:
692   template <class _OtherErr>
693     requires(__can_assign_from_unexpected<const _OtherErr&>)
694   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) {
695     if (this->__has_val()) {
696       __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), __un.error());
697     } else {
698       this->__unex() = __un.error();
699     }
700     return *this;
701   }
702 
703   template <class _OtherErr>
704     requires(__can_assign_from_unexpected<_OtherErr>)
705   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) {
706     if (this->__has_val()) {
707       __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), std::move(__un.error()));
708     } else {
709       this->__unex() = std::move(__un.error());
710     }
711     return *this;
712   }
713 
714   template <class... _Args>
715     requires is_nothrow_constructible_v<_Tp, _Args...>
716   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(_Args&&... __args) noexcept {
717     this->__destroy();
718     this->__construct(in_place, std::forward<_Args>(__args)...);
719     return this->__val();
720   }
721 
722   template <class _Up, class... _Args>
723     requires is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
724   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) noexcept {
725     this->__destroy();
726     this->__construct(in_place, __il, std::forward<_Args>(__args)...);
727     return this->__val();
728   }
729 
730 public:
731   // [expected.object.swap], swap
732   _LIBCPP_HIDE_FROM_ABI constexpr void
733   swap(expected& __rhs) noexcept(is_nothrow_move_constructible_v<_Tp> && is_nothrow_swappable_v<_Tp> &&
734                                  is_nothrow_move_constructible_v<_Err> && is_nothrow_swappable_v<_Err>)
735     requires(is_swappable_v<_Tp> && is_swappable_v<_Err> && is_move_constructible_v<_Tp> &&
736              is_move_constructible_v<_Err> &&
737              (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))
738   {
739     auto __swap_val_unex_impl = [](expected& __with_val, expected& __with_err) {
740       if constexpr (is_nothrow_move_constructible_v<_Err>) {
741         _Err __tmp(std::move(__with_err.__unex()));
742         __with_err.__destroy();
743         auto __trans = std::__make_exception_guard([&] { __with_err.__construct(unexpect, std::move(__tmp)); });
744         __with_err.__construct(in_place, std::move(__with_val.__val()));
745         __trans.__complete();
746         __with_val.__destroy();
747         __with_val.__construct(unexpect, std::move(__tmp));
748       } else {
749         static_assert(is_nothrow_move_constructible_v<_Tp>,
750                       "To provide strong exception guarantee, Tp has to satisfy `is_nothrow_move_constructible_v` so "
751                       "that it can be reverted to the previous state in case an exception is thrown during swap.");
752         _Tp __tmp(std::move(__with_val.__val()));
753         __with_val.__destroy();
754         auto __trans = std::__make_exception_guard([&] { __with_val.__construct(in_place, std::move(__tmp)); });
755         __with_val.__construct(unexpect, std::move(__with_err.__unex()));
756         __trans.__complete();
757         __with_err.__destroy();
758         __with_err.__construct(in_place, std::move(__tmp));
759       }
760     };
761 
762     if (this->__has_val()) {
763       if (__rhs.__has_val()) {
764         using std::swap;
765         swap(this->__val(), __rhs.__val());
766       } else {
767         __swap_val_unex_impl(*this, __rhs);
768       }
769     } else {
770       if (__rhs.__has_val()) {
771         __swap_val_unex_impl(__rhs, *this);
772       } else {
773         using std::swap;
774         swap(this->__unex(), __rhs.__unex());
775       }
776     }
777   }
778 
779   _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) noexcept(noexcept(__x.swap(__y)))
780     requires requires { __x.swap(__y); }
781   {
782     __x.swap(__y);
783   }
784 
785   // [expected.object.obs], observers
786   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* operator->() const noexcept {
787     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
788         this->__has_val(), "expected::operator-> requires the expected to contain a value");
789     return std::addressof(this->__val());
790   }
791 
792   _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator->() noexcept {
793     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
794         this->__has_val(), "expected::operator-> requires the expected to contain a value");
795     return std::addressof(this->__val());
796   }
797 
798   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& operator*() const& noexcept {
799     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
800         this->__has_val(), "expected::operator* requires the expected to contain a value");
801     return this->__val();
802   }
803 
804   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& operator*() & noexcept {
805     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
806         this->__has_val(), "expected::operator* requires the expected to contain a value");
807     return this->__val();
808   }
809 
810   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& operator*() const&& noexcept {
811     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
812         this->__has_val(), "expected::operator* requires the expected to contain a value");
813     return std::move(this->__val());
814   }
815 
816   _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& operator*() && noexcept {
817     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
818         this->__has_val(), "expected::operator* requires the expected to contain a value");
819     return std::move(this->__val());
820   }
821 
822   _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return this->__has_val(); }
823 
824   _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return this->__has_val(); }
825 
826   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& value() const& {
827     static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");
828     if (!this->__has_val()) {
829       std::__throw_bad_expected_access<_Err>(std::as_const(error()));
830     }
831     return this->__val();
832   }
833 
834   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& value() & {
835     static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");
836     if (!this->__has_val()) {
837       std::__throw_bad_expected_access<_Err>(std::as_const(error()));
838     }
839     return this->__val();
840   }
841 
842   _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& value() const&& {
843     static_assert(is_copy_constructible_v<_Err> && is_constructible_v<_Err, decltype(std::move(error()))>,
844                   "error_type has to be both copy constructible and constructible from decltype(std::move(error()))");
845     if (!this->__has_val()) {
846       std::__throw_bad_expected_access<_Err>(std::move(error()));
847     }
848     return std::move(this->__val());
849   }
850 
851   _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& value() && {
852     static_assert(is_copy_constructible_v<_Err> && is_constructible_v<_Err, decltype(std::move(error()))>,
853                   "error_type has to be both copy constructible and constructible from decltype(std::move(error()))");
854     if (!this->__has_val()) {
855       std::__throw_bad_expected_access<_Err>(std::move(error()));
856     }
857     return std::move(this->__val());
858   }
859 
860   _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept {
861     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
862         !this->__has_val(), "expected::error requires the expected to contain an error");
863     return this->__unex();
864   }
865 
866   _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept {
867     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
868         !this->__has_val(), "expected::error requires the expected to contain an error");
869     return this->__unex();
870   }
871 
872   _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept {
873     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
874         !this->__has_val(), "expected::error requires the expected to contain an error");
875     return std::move(this->__unex());
876   }
877 
878   _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept {
879     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
880         !this->__has_val(), "expected::error requires the expected to contain an error");
881     return std::move(this->__unex());
882   }
883 
884   template <class _Up>
885   _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) const& {
886     static_assert(is_copy_constructible_v<_Tp>, "value_type has to be copy constructible");
887     static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type");
888     return this->__has_val() ? this->__val() : static_cast<_Tp>(std::forward<_Up>(__v));
889   }
890 
891   template <class _Up>
892   _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) && {
893     static_assert(is_move_constructible_v<_Tp>, "value_type has to be move constructible");
894     static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type");
895     return this->__has_val() ? std::move(this->__val()) : static_cast<_Tp>(std::forward<_Up>(__v));
896   }
897 
898   template <class _Up = _Err>
899   _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) const& {
900     static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");
901     static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");
902     if (has_value())
903       return std::forward<_Up>(__error);
904     return error();
905   }
906 
907   template <class _Up = _Err>
908   _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) && {
909     static_assert(is_move_constructible_v<_Err>, "error_type has to be move constructible");
910     static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");
911     if (has_value())
912       return std::forward<_Up>(__error);
913     return std::move(error());
914   }
915 
916   // [expected.void.monadic], monadic
917   template <class _Func>
918     requires is_constructible_v<_Err, _Err&>
919   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) & {
920     using _Up = remove_cvref_t<invoke_result_t<_Func, _Tp&>>;
921     static_assert(__is_std_expected<_Up>::value, "The result of f(**this) must be a specialization of std::expected");
922     static_assert(is_same_v<typename _Up::error_type, _Err>,
923                   "The result of f(**this) must have the same error_type as this expected");
924     if (has_value()) {
925       return std::invoke(std::forward<_Func>(__f), this->__val());
926     }
927     return _Up(unexpect, error());
928   }
929 
930   template <class _Func>
931     requires is_constructible_v<_Err, const _Err&>
932   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const& {
933     using _Up = remove_cvref_t<invoke_result_t<_Func, const _Tp&>>;
934     static_assert(__is_std_expected<_Up>::value, "The result of f(**this) must be a specialization of std::expected");
935     static_assert(is_same_v<typename _Up::error_type, _Err>,
936                   "The result of f(**this) must have the same error_type as this expected");
937     if (has_value()) {
938       return std::invoke(std::forward<_Func>(__f), this->__val());
939     }
940     return _Up(unexpect, error());
941   }
942 
943   template <class _Func>
944     requires is_constructible_v<_Err, _Err&&>
945   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) && {
946     using _Up = remove_cvref_t<invoke_result_t<_Func, _Tp&&>>;
947     static_assert(
948         __is_std_expected<_Up>::value, "The result of f(std::move(**this)) must be a specialization of std::expected");
949     static_assert(is_same_v<typename _Up::error_type, _Err>,
950                   "The result of f(std::move(**this)) must have the same error_type as this expected");
951     if (has_value()) {
952       return std::invoke(std::forward<_Func>(__f), std::move(this->__val()));
953     }
954     return _Up(unexpect, std::move(error()));
955   }
956 
957   template <class _Func>
958     requires is_constructible_v<_Err, const _Err&&>
959   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const&& {
960     using _Up = remove_cvref_t<invoke_result_t<_Func, const _Tp&&>>;
961     static_assert(
962         __is_std_expected<_Up>::value, "The result of f(std::move(**this)) must be a specialization of std::expected");
963     static_assert(is_same_v<typename _Up::error_type, _Err>,
964                   "The result of f(std::move(**this)) must have the same error_type as this expected");
965     if (has_value()) {
966       return std::invoke(std::forward<_Func>(__f), std::move(this->__val()));
967     }
968     return _Up(unexpect, std::move(error()));
969   }
970 
971   template <class _Func>
972     requires is_constructible_v<_Tp, _Tp&>
973   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) & {
974     using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&>>;
975     static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");
976     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
977                   "The result of f(error()) must have the same value_type as this expected");
978     if (has_value()) {
979       return _Gp(in_place, this->__val());
980     }
981     return std::invoke(std::forward<_Func>(__f), error());
982   }
983 
984   template <class _Func>
985     requires is_constructible_v<_Tp, const _Tp&>
986   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const& {
987     using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&>>;
988     static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");
989     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
990                   "The result of f(error()) must have the same value_type as this expected");
991     if (has_value()) {
992       return _Gp(in_place, this->__val());
993     }
994     return std::invoke(std::forward<_Func>(__f), error());
995   }
996 
997   template <class _Func>
998     requires is_constructible_v<_Tp, _Tp&&>
999   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) && {
1000     using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&&>>;
1001     static_assert(
1002         __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");
1003     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1004                   "The result of f(std::move(error())) must have the same value_type as this expected");
1005     if (has_value()) {
1006       return _Gp(in_place, std::move(this->__val()));
1007     }
1008     return std::invoke(std::forward<_Func>(__f), std::move(error()));
1009   }
1010 
1011   template <class _Func>
1012     requires is_constructible_v<_Tp, const _Tp&&>
1013   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const&& {
1014     using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&&>>;
1015     static_assert(
1016         __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");
1017     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1018                   "The result of f(std::move(error())) must have the same value_type as this expected");
1019     if (has_value()) {
1020       return _Gp(in_place, std::move(this->__val()));
1021     }
1022     return std::invoke(std::forward<_Func>(__f), std::move(error()));
1023   }
1024 
1025   template <class _Func>
1026     requires is_constructible_v<_Err, _Err&>
1027   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) & {
1028     using _Up = remove_cv_t<invoke_result_t<_Func, _Tp&>>;
1029     if (!has_value()) {
1030       return expected<_Up, _Err>(unexpect, error());
1031     }
1032     if constexpr (!is_void_v<_Up>) {
1033       return expected<_Up, _Err>(
1034           __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), this->__val());
1035     } else {
1036       std::invoke(std::forward<_Func>(__f), this->__val());
1037       return expected<_Up, _Err>();
1038     }
1039   }
1040 
1041   template <class _Func>
1042     requires is_constructible_v<_Err, const _Err&>
1043   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const& {
1044     using _Up = remove_cv_t<invoke_result_t<_Func, const _Tp&>>;
1045     if (!has_value()) {
1046       return expected<_Up, _Err>(unexpect, error());
1047     }
1048     if constexpr (!is_void_v<_Up>) {
1049       return expected<_Up, _Err>(
1050           __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), this->__val());
1051     } else {
1052       std::invoke(std::forward<_Func>(__f), this->__val());
1053       return expected<_Up, _Err>();
1054     }
1055   }
1056 
1057   template <class _Func>
1058     requires is_constructible_v<_Err, _Err&&>
1059   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) && {
1060     using _Up = remove_cv_t<invoke_result_t<_Func, _Tp&&>>;
1061     if (!has_value()) {
1062       return expected<_Up, _Err>(unexpect, std::move(error()));
1063     }
1064     if constexpr (!is_void_v<_Up>) {
1065       return expected<_Up, _Err>(
1066           __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), std::move(this->__val()));
1067     } else {
1068       std::invoke(std::forward<_Func>(__f), std::move(this->__val()));
1069       return expected<_Up, _Err>();
1070     }
1071   }
1072 
1073   template <class _Func>
1074     requires is_constructible_v<_Err, const _Err&&>
1075   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const&& {
1076     using _Up = remove_cv_t<invoke_result_t<_Func, const _Tp&&>>;
1077     if (!has_value()) {
1078       return expected<_Up, _Err>(unexpect, std::move(error()));
1079     }
1080     if constexpr (!is_void_v<_Up>) {
1081       return expected<_Up, _Err>(
1082           __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), std::move(this->__val()));
1083     } else {
1084       std::invoke(std::forward<_Func>(__f), std::move(this->__val()));
1085       return expected<_Up, _Err>();
1086     }
1087   }
1088 
1089   template <class _Func>
1090     requires is_constructible_v<_Tp, _Tp&>
1091   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) & {
1092     using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&>>;
1093     static_assert(__valid_std_unexpected<_Gp>::value,
1094                   "The result of f(error()) must be a valid template argument for unexpected");
1095     if (has_value()) {
1096       return expected<_Tp, _Gp>(in_place, this->__val());
1097     }
1098     return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());
1099   }
1100 
1101   template <class _Func>
1102     requires is_constructible_v<_Tp, const _Tp&>
1103   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const& {
1104     using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&>>;
1105     static_assert(__valid_std_unexpected<_Gp>::value,
1106                   "The result of f(error()) must be a valid template argument for unexpected");
1107     if (has_value()) {
1108       return expected<_Tp, _Gp>(in_place, this->__val());
1109     }
1110     return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());
1111   }
1112 
1113   template <class _Func>
1114     requires is_constructible_v<_Tp, _Tp&&>
1115   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) && {
1116     using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&&>>;
1117     static_assert(__valid_std_unexpected<_Gp>::value,
1118                   "The result of f(std::move(error())) must be a valid template argument for unexpected");
1119     if (has_value()) {
1120       return expected<_Tp, _Gp>(in_place, std::move(this->__val()));
1121     }
1122     return expected<_Tp, _Gp>(
1123         __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));
1124   }
1125 
1126   template <class _Func>
1127     requires is_constructible_v<_Tp, const _Tp&&>
1128   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const&& {
1129     using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&&>>;
1130     static_assert(__valid_std_unexpected<_Gp>::value,
1131                   "The result of f(std::move(error())) must be a valid template argument for unexpected");
1132     if (has_value()) {
1133       return expected<_Tp, _Gp>(in_place, std::move(this->__val()));
1134     }
1135     return expected<_Tp, _Gp>(
1136         __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));
1137   }
1138 
1139   // [expected.object.eq], equality operators
1140   template <class _T2, class _E2>
1141     requires(!is_void_v<_T2>)
1142   _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y) {
1143     if (__x.__has_val() != __y.__has_val()) {
1144       return false;
1145     } else {
1146       if (__x.__has_val()) {
1147         return __x.__val() == __y.__val();
1148       } else {
1149         return __x.__unex() == __y.__unex();
1150       }
1151     }
1152   }
1153 
1154   template <class _T2>
1155   _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const _T2& __v) {
1156     return __x.__has_val() && static_cast<bool>(__x.__val() == __v);
1157   }
1158 
1159   template <class _E2>
1160   _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __e) {
1161     return !__x.__has_val() && static_cast<bool>(__x.__unex() == __e.error());
1162   }
1163 };
1164 
1165 template <class _Err>
1166 class __expected_void_base {
1167   struct __empty_t {};
1168   // use named union because [[no_unique_address]] cannot be applied to an unnamed union,
1169   // also guaranteed elision into a potentially-overlapping subobject is unsettled (and
1170   // it's not clear that it's implementable, given that the function is allowed to clobber
1171   // the tail padding) - see https://github.com/itanium-cxx-abi/cxx-abi/issues/107.
1172   union __union_t {
1173     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&) = delete;
1174     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&)
1175       requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)
1176     = default;
1177     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&) = delete;
1178     _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&)
1179       requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)
1180     = default;
1181     _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(const __union_t&) = delete;
1182     _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(__union_t&&)      = delete;
1183 
1184     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(in_place_t) : __empty_() {}
1185 
1186     template <class... _Args>
1187     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(unexpect_t, _Args&&... __args)
1188         : __unex_(std::forward<_Args>(__args)...) {}
1189 
1190     template <class _Func, class... _Args>
1191     _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(
1192         __expected_construct_unexpected_from_invoke_tag, _Func&& __f, _Args&&... __args)
1193         : __unex_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}
1194 
1195     _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()
1196       requires(is_trivially_destructible_v<_Err>)
1197     = default;
1198 
1199     // __repr's destructor handles this
1200     _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()
1201       requires(!is_trivially_destructible_v<_Err>)
1202     {}
1203 
1204     _LIBCPP_NO_UNIQUE_ADDRESS __empty_t __empty_;
1205     _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_;
1206   };
1207 
1208   static constexpr bool __put_flag_in_tail                    = __fits_in_tail_padding<__union_t, bool>;
1209   static constexpr bool __allow_reusing_expected_tail_padding = !__put_flag_in_tail;
1210 
1211   struct __repr {
1212     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr() = delete;
1213 
1214     template <class... _Args>
1215     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(in_place_t __tag) : __union_(in_place, __tag), __has_val_(true) {}
1216 
1217     template <class... _Args>
1218     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(unexpect_t __tag, _Args&&... __args)
1219         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}
1220 
1221     template <class... _Args>
1222     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_unexpected_from_invoke_tag __tag,
1223                                                     _Args&&... __args)
1224         : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}
1225 
1226     template <class _OtherUnion>
1227     _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(bool __has_val, _OtherUnion&& __other)
1228       requires(__allow_reusing_expected_tail_padding)
1229         : __union_(__conditional_no_unique_address_invoke_tag{},
1230                    [&] { return __make_union(__has_val, std::forward<_OtherUnion>(__other)); }),
1231           __has_val_(__has_val) {}
1232 
1233     _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&) = delete;
1234     _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&)
1235       requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)
1236     = default;
1237     _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&) = delete;
1238     _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&)
1239       requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)
1240     = default;
1241 
1242     _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(const __repr&) = delete;
1243     _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(__repr&&)      = delete;
1244 
1245     _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()
1246       requires(is_trivially_destructible_v<_Err>)
1247     = default;
1248 
1249     _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()
1250       requires(!is_trivially_destructible_v<_Err>)
1251     {
1252       __destroy_union_member();
1253     }
1254 
1255     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()
1256       requires(__allow_reusing_expected_tail_padding && is_trivially_destructible_v<_Err>)
1257     {
1258       std::destroy_at(&__union_.__v);
1259     }
1260 
1261     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()
1262       requires(__allow_reusing_expected_tail_padding && !is_trivially_destructible_v<_Err>)
1263     {
1264       __destroy_union_member();
1265       std::destroy_at(&__union_.__v);
1266     }
1267 
1268     _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(in_place_t)
1269       requires(__allow_reusing_expected_tail_padding)
1270     {
1271       std::construct_at(&__union_.__v, in_place);
1272       __has_val_ = true;
1273     }
1274 
1275     template <class... _Args>
1276     _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(unexpect_t, _Args&&... __args)
1277       requires(__allow_reusing_expected_tail_padding)
1278     {
1279       std::construct_at(&__union_.__v, unexpect, std::forward<_Args>(__args)...);
1280       __has_val_ = false;
1281     }
1282 
1283   private:
1284     template <class>
1285     friend class __expected_void_base;
1286 
1287     _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union_member()
1288       requires(!is_trivially_destructible_v<_Err>)
1289     {
1290       if (!__has_val_)
1291         std::destroy_at(std::addressof(__union_.__v.__unex_));
1292     }
1293 
1294     template <class _OtherUnion>
1295     _LIBCPP_HIDE_FROM_ABI static constexpr __union_t __make_union(bool __has_val, _OtherUnion&& __other)
1296       requires(__allow_reusing_expected_tail_padding)
1297     {
1298       if (__has_val)
1299         return __union_t(in_place);
1300       else
1301         return __union_t(unexpect, std::forward<_OtherUnion>(__other).__unex_);
1302     }
1303 
1304     _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__put_flag_in_tail, __union_t> __union_;
1305     _LIBCPP_NO_UNIQUE_ADDRESS bool __has_val_;
1306   };
1307 
1308   template <class _OtherUnion>
1309   _LIBCPP_HIDE_FROM_ABI static constexpr __repr __make_repr(bool __has_val, _OtherUnion&& __other)
1310     requires(__put_flag_in_tail)
1311   {
1312     if (__has_val)
1313       return __repr(in_place);
1314     else
1315       return __repr(unexpect, std::forward<_OtherUnion>(__other).__unex_);
1316   }
1317 
1318 protected:
1319   template <class... _Args>
1320   _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_void_base(_Args&&... __args)
1321       : __repr_(in_place, std::forward<_Args>(__args)...) {}
1322 
1323   template <class _OtherUnion>
1324   _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_void_base(bool __has_val, _OtherUnion&& __other)
1325     requires(__put_flag_in_tail)
1326       : __repr_(__conditional_no_unique_address_invoke_tag{},
1327                 [&] { return __make_repr(__has_val, std::forward<_OtherUnion>(__other)); }) {}
1328 
1329   _LIBCPP_HIDE_FROM_ABI constexpr void __destroy() {
1330     if constexpr (__put_flag_in_tail)
1331       std::destroy_at(&__repr_.__v);
1332     else
1333       __repr_.__v.__destroy_union();
1334   }
1335 
1336   template <class _Tag, class... _Args>
1337   _LIBCPP_HIDE_FROM_ABI constexpr void __construct(_Tag __tag, _Args&&... __args) {
1338     if constexpr (__put_flag_in_tail)
1339       std::construct_at(&__repr_.__v, __tag, std::forward<_Args>(__args)...);
1340     else
1341       __repr_.__v.__construct_union(__tag, std::forward<_Args>(__args)...);
1342   }
1343 
1344   _LIBCPP_HIDE_FROM_ABI constexpr bool __has_val() const { return __repr_.__v.__has_val_; }
1345   _LIBCPP_HIDE_FROM_ABI constexpr __union_t& __union() { return __repr_.__v.__union_.__v; }
1346   _LIBCPP_HIDE_FROM_ABI constexpr const __union_t& __union() const { return __repr_.__v.__union_.__v; }
1347   _LIBCPP_HIDE_FROM_ABI constexpr _Err& __unex() { return __repr_.__v.__union_.__v.__unex_; }
1348   _LIBCPP_HIDE_FROM_ABI constexpr const _Err& __unex() const { return __repr_.__v.__union_.__v.__unex_; }
1349 
1350 private:
1351   _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__allow_reusing_expected_tail_padding, __repr> __repr_;
1352 };
1353 
1354 template <class _Tp, class _Err>
1355   requires is_void_v<_Tp>
1356 class expected<_Tp, _Err> : private __expected_void_base<_Err> {
1357   static_assert(__valid_std_unexpected<_Err>::value,
1358                 "[expected.void.general] A program that instantiates expected<T, E> with a E that is not a "
1359                 "valid argument for unexpected<E> is ill-formed");
1360 
1361   template <class, class>
1362   friend class expected;
1363 
1364   template <class _Up, class _OtherErr, class _OtherErrQual>
1365   using __can_convert =
1366       _And< is_void<_Up>,
1367             is_constructible<_Err, _OtherErrQual>,
1368             _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>&>>,
1369             _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>>>,
1370             _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>&>>,
1371             _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>>>>;
1372 
1373   using __base = __expected_void_base<_Err>;
1374 
1375 public:
1376   using value_type      = _Tp;
1377   using error_type      = _Err;
1378   using unexpected_type = unexpected<_Err>;
1379 
1380   template <class _Up>
1381   using rebind = expected<_Up, error_type>;
1382 
1383   // [expected.void.ctor], constructors
1384   _LIBCPP_HIDE_FROM_ABI constexpr expected() noexcept : __base(in_place) {}
1385 
1386   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete;
1387 
1388   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&)
1389     requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)
1390   = default;
1391 
1392   _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __rhs) noexcept(
1393       is_nothrow_copy_constructible_v<_Err>) // strengthened
1394     requires(is_copy_constructible_v<_Err> && !is_trivially_copy_constructible_v<_Err>)
1395       : __base(__rhs.__has_val(), __rhs.__union()) {}
1396 
1397   _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&)
1398     requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)
1399   = default;
1400 
1401   _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __rhs) noexcept(is_nothrow_move_constructible_v<_Err>)
1402     requires(is_move_constructible_v<_Err> && !is_trivially_move_constructible_v<_Err>)
1403       : __base(__rhs.__has_val(), std::move(__rhs.__union())) {}
1404 
1405   template <class _Up, class _OtherErr>
1406     requires __can_convert<_Up, _OtherErr, const _OtherErr&>::value
1407   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>)
1408       expected(const expected<_Up, _OtherErr>& __rhs) noexcept(
1409           is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened
1410       : __base(__rhs.__has_val(), __rhs.__union()) {}
1411 
1412   template <class _Up, class _OtherErr>
1413     requires __can_convert<_Up, _OtherErr, _OtherErr>::value
1414   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)
1415       expected(expected<_Up, _OtherErr>&& __rhs) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened
1416       : __base(__rhs.__has_val(), std::move(__rhs.__union())) {}
1417 
1418   template <class _OtherErr>
1419     requires is_constructible_v<_Err, const _OtherErr&>
1420   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>) expected(
1421       const unexpected<_OtherErr>& __unex) noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened
1422       : __base(unexpect, __unex.error()) {}
1423 
1424   template <class _OtherErr>
1425     requires is_constructible_v<_Err, _OtherErr>
1426   _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)
1427       expected(unexpected<_OtherErr>&& __unex) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened
1428       : __base(unexpect, std::move(__unex.error())) {}
1429 
1430   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t) noexcept : __base(in_place) {}
1431 
1432   template <class... _Args>
1433     requires is_constructible_v<_Err, _Args...>
1434   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) noexcept(
1435       is_nothrow_constructible_v<_Err, _Args...>) // strengthened
1436       : __base(unexpect, std::forward<_Args>(__args)...) {}
1437 
1438   template <class _Up, class... _Args>
1439     requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... >
1440   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(
1441       is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened
1442       : __base(unexpect, __il, std::forward<_Args>(__args)...) {}
1443 
1444 private:
1445   template <class _Func, class... _Args>
1446   _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(
1447       __expected_construct_unexpected_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)
1448       : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}
1449 
1450 public:
1451   // [expected.void.dtor], destructor
1452 
1453   _LIBCPP_HIDE_FROM_ABI constexpr ~expected() = default;
1454 
1455 private:
1456   template <class... _Args>
1457   _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(unexpect_t, _Args&&... __args) {
1458     _LIBCPP_ASSERT_INTERNAL(this->__has_val(), "__reinit_expected(unexpect_t, ...) needs value to be set");
1459 
1460     this->__destroy();
1461     auto __trans = std::__make_exception_guard([&] { this->__construct(in_place); });
1462     this->__construct(unexpect, std::forward<_Args>(__args)...);
1463     __trans.__complete();
1464   }
1465 
1466   _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(in_place_t) {
1467     _LIBCPP_ASSERT_INTERNAL(!this->__has_val(), "__reinit_expected(in_place_t, ...) needs value to be unset");
1468 
1469     this->__destroy();
1470     this->__construct(in_place);
1471   }
1472 
1473 public:
1474   // [expected.void.assign], assignment
1475   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete;
1476 
1477   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) noexcept(
1478       is_nothrow_copy_assignable_v<_Err> && is_nothrow_copy_constructible_v<_Err>) // strengthened
1479     requires(is_copy_assignable_v<_Err> && is_copy_constructible_v<_Err>)
1480   {
1481     if (this->__has_val()) {
1482       if (!__rhs.__has_val()) {
1483         __reinit_expected(unexpect, __rhs.__unex());
1484       }
1485     } else {
1486       if (__rhs.__has_val()) {
1487         __reinit_expected(in_place);
1488       } else {
1489         this->__unex() = __rhs.__unex();
1490       }
1491     }
1492     return *this;
1493   }
1494 
1495   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(expected&&) = delete;
1496 
1497   _LIBCPP_HIDE_FROM_ABI constexpr expected&
1498   operator=(expected&& __rhs) noexcept(is_nothrow_move_assignable_v<_Err> && is_nothrow_move_constructible_v<_Err>)
1499     requires(is_move_assignable_v<_Err> && is_move_constructible_v<_Err>)
1500   {
1501     if (this->__has_val()) {
1502       if (!__rhs.__has_val()) {
1503         __reinit_expected(unexpect, std::move(__rhs.__unex()));
1504       }
1505     } else {
1506       if (__rhs.__has_val()) {
1507         __reinit_expected(in_place);
1508       } else {
1509         this->__unex() = std::move(__rhs.__unex());
1510       }
1511     }
1512     return *this;
1513   }
1514 
1515   template <class _OtherErr>
1516     requires(is_constructible_v<_Err, const _OtherErr&> && is_assignable_v<_Err&, const _OtherErr&>)
1517   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) {
1518     if (this->__has_val()) {
1519       __reinit_expected(unexpect, __un.error());
1520     } else {
1521       this->__unex() = __un.error();
1522     }
1523     return *this;
1524   }
1525 
1526   template <class _OtherErr>
1527     requires(is_constructible_v<_Err, _OtherErr> && is_assignable_v<_Err&, _OtherErr>)
1528   _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) {
1529     if (this->__has_val()) {
1530       __reinit_expected(unexpect, std::move(__un.error()));
1531     } else {
1532       this->__unex() = std::move(__un.error());
1533     }
1534     return *this;
1535   }
1536 
1537   _LIBCPP_HIDE_FROM_ABI constexpr void emplace() noexcept {
1538     if (!this->__has_val()) {
1539       __reinit_expected(in_place);
1540     }
1541   }
1542 
1543   // [expected.void.swap], swap
1544   _LIBCPP_HIDE_FROM_ABI constexpr void
1545   swap(expected& __rhs) noexcept(is_nothrow_move_constructible_v<_Err> && is_nothrow_swappable_v<_Err>)
1546     requires(is_swappable_v<_Err> && is_move_constructible_v<_Err>)
1547   {
1548     auto __swap_val_unex_impl = [](expected& __with_val, expected& __with_err) {
1549       // May throw, but will re-engage `__with_val` in that case.
1550       __with_val.__reinit_expected(unexpect, std::move(__with_err.__unex()));
1551       // Will not throw.
1552       __with_err.__reinit_expected(in_place);
1553     };
1554 
1555     if (this->__has_val()) {
1556       if (!__rhs.__has_val()) {
1557         __swap_val_unex_impl(*this, __rhs);
1558       }
1559     } else {
1560       if (__rhs.__has_val()) {
1561         __swap_val_unex_impl(__rhs, *this);
1562       } else {
1563         using std::swap;
1564         swap(this->__unex(), __rhs.__unex());
1565       }
1566     }
1567   }
1568 
1569   _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) noexcept(noexcept(__x.swap(__y)))
1570     requires requires { __x.swap(__y); }
1571   {
1572     __x.swap(__y);
1573   }
1574 
1575   // [expected.void.obs], observers
1576   _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return this->__has_val(); }
1577 
1578   _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return this->__has_val(); }
1579 
1580   _LIBCPP_HIDE_FROM_ABI constexpr void operator*() const noexcept {
1581     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
1582         this->__has_val(), "expected::operator* requires the expected to contain a value");
1583   }
1584 
1585   _LIBCPP_HIDE_FROM_ABI constexpr void value() const& {
1586     static_assert(is_copy_constructible_v<_Err>);
1587     if (!this->__has_val()) {
1588       std::__throw_bad_expected_access<_Err>(this->__unex());
1589     }
1590   }
1591 
1592   _LIBCPP_HIDE_FROM_ABI constexpr void value() && {
1593     static_assert(is_copy_constructible_v<_Err> && is_move_constructible_v<_Err>);
1594     if (!this->__has_val()) {
1595       std::__throw_bad_expected_access<_Err>(std::move(this->__unex()));
1596     }
1597   }
1598 
1599   _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept {
1600     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
1601         !this->__has_val(), "expected::error requires the expected to contain an error");
1602     return this->__unex();
1603   }
1604 
1605   _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept {
1606     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
1607         !this->__has_val(), "expected::error requires the expected to contain an error");
1608     return this->__unex();
1609   }
1610 
1611   _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept {
1612     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
1613         !this->__has_val(), "expected::error requires the expected to contain an error");
1614     return std::move(this->__unex());
1615   }
1616 
1617   _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept {
1618     _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
1619         !this->__has_val(), "expected::error requires the expected to contain an error");
1620     return std::move(this->__unex());
1621   }
1622 
1623   template <class _Up = _Err>
1624   _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) const& {
1625     static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");
1626     static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");
1627     if (has_value()) {
1628       return std::forward<_Up>(__error);
1629     }
1630     return error();
1631   }
1632 
1633   template <class _Up = _Err>
1634   _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) && {
1635     static_assert(is_move_constructible_v<_Err>, "error_type has to be move constructible");
1636     static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");
1637     if (has_value()) {
1638       return std::forward<_Up>(__error);
1639     }
1640     return std::move(error());
1641   }
1642 
1643   // [expected.void.monadic], monadic
1644   template <class _Func>
1645     requires is_constructible_v<_Err, _Err&>
1646   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) & {
1647     using _Up = remove_cvref_t<invoke_result_t<_Func>>;
1648     static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");
1649     static_assert(
1650         is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");
1651     if (has_value()) {
1652       return std::invoke(std::forward<_Func>(__f));
1653     }
1654     return _Up(unexpect, error());
1655   }
1656 
1657   template <class _Func>
1658     requires is_constructible_v<_Err, const _Err&>
1659   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const& {
1660     using _Up = remove_cvref_t<invoke_result_t<_Func>>;
1661     static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");
1662     static_assert(
1663         is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");
1664     if (has_value()) {
1665       return std::invoke(std::forward<_Func>(__f));
1666     }
1667     return _Up(unexpect, error());
1668   }
1669 
1670   template <class _Func>
1671     requires is_constructible_v<_Err, _Err&&>
1672   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) && {
1673     using _Up = remove_cvref_t<invoke_result_t<_Func>>;
1674     static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");
1675     static_assert(
1676         is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");
1677     if (has_value()) {
1678       return std::invoke(std::forward<_Func>(__f));
1679     }
1680     return _Up(unexpect, std::move(error()));
1681   }
1682 
1683   template <class _Func>
1684     requires is_constructible_v<_Err, const _Err&&>
1685   _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const&& {
1686     using _Up = remove_cvref_t<invoke_result_t<_Func>>;
1687     static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");
1688     static_assert(
1689         is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");
1690     if (has_value()) {
1691       return std::invoke(std::forward<_Func>(__f));
1692     }
1693     return _Up(unexpect, std::move(error()));
1694   }
1695 
1696   template <class _Func>
1697   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) & {
1698     using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&>>;
1699     static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");
1700     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1701                   "The result of f(error()) must have the same value_type as this expected");
1702     if (has_value()) {
1703       return _Gp();
1704     }
1705     return std::invoke(std::forward<_Func>(__f), error());
1706   }
1707 
1708   template <class _Func>
1709   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const& {
1710     using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&>>;
1711     static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");
1712     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1713                   "The result of f(error()) must have the same value_type as this expected");
1714     if (has_value()) {
1715       return _Gp();
1716     }
1717     return std::invoke(std::forward<_Func>(__f), error());
1718   }
1719 
1720   template <class _Func>
1721   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) && {
1722     using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&&>>;
1723     static_assert(
1724         __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");
1725     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1726                   "The result of f(std::move(error())) must have the same value_type as this expected");
1727     if (has_value()) {
1728       return _Gp();
1729     }
1730     return std::invoke(std::forward<_Func>(__f), std::move(error()));
1731   }
1732 
1733   template <class _Func>
1734   _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const&& {
1735     using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&&>>;
1736     static_assert(
1737         __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");
1738     static_assert(is_same_v<typename _Gp::value_type, _Tp>,
1739                   "The result of f(std::move(error())) must have the same value_type as this expected");
1740     if (has_value()) {
1741       return _Gp();
1742     }
1743     return std::invoke(std::forward<_Func>(__f), std::move(error()));
1744   }
1745 
1746   template <class _Func>
1747     requires is_constructible_v<_Err, _Err&>
1748   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) & {
1749     using _Up = remove_cv_t<invoke_result_t<_Func>>;
1750     if (!has_value()) {
1751       return expected<_Up, _Err>(unexpect, error());
1752     }
1753     if constexpr (!is_void_v<_Up>) {
1754       return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));
1755     } else {
1756       std::invoke(std::forward<_Func>(__f));
1757       return expected<_Up, _Err>();
1758     }
1759   }
1760 
1761   template <class _Func>
1762     requires is_constructible_v<_Err, const _Err&>
1763   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const& {
1764     using _Up = remove_cv_t<invoke_result_t<_Func>>;
1765     if (!has_value()) {
1766       return expected<_Up, _Err>(unexpect, error());
1767     }
1768     if constexpr (!is_void_v<_Up>) {
1769       return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));
1770     } else {
1771       std::invoke(std::forward<_Func>(__f));
1772       return expected<_Up, _Err>();
1773     }
1774   }
1775 
1776   template <class _Func>
1777     requires is_constructible_v<_Err, _Err&&>
1778   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) && {
1779     using _Up = remove_cv_t<invoke_result_t<_Func>>;
1780     if (!has_value()) {
1781       return expected<_Up, _Err>(unexpect, std::move(error()));
1782     }
1783     if constexpr (!is_void_v<_Up>) {
1784       return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));
1785     } else {
1786       std::invoke(std::forward<_Func>(__f));
1787       return expected<_Up, _Err>();
1788     }
1789   }
1790 
1791   template <class _Func>
1792     requires is_constructible_v<_Err, const _Err&&>
1793   _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const&& {
1794     using _Up = remove_cv_t<invoke_result_t<_Func>>;
1795     if (!has_value()) {
1796       return expected<_Up, _Err>(unexpect, std::move(error()));
1797     }
1798     if constexpr (!is_void_v<_Up>) {
1799       return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));
1800     } else {
1801       std::invoke(std::forward<_Func>(__f));
1802       return expected<_Up, _Err>();
1803     }
1804   }
1805 
1806   template <class _Func>
1807   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) & {
1808     using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&>>;
1809     static_assert(__valid_std_unexpected<_Gp>::value,
1810                   "The result of f(error()) must be a valid template argument for unexpected");
1811     if (has_value()) {
1812       return expected<_Tp, _Gp>();
1813     }
1814     return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());
1815   }
1816 
1817   template <class _Func>
1818   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const& {
1819     using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&>>;
1820     static_assert(__valid_std_unexpected<_Gp>::value,
1821                   "The result of f(error()) must be a valid template argument for unexpected");
1822     if (has_value()) {
1823       return expected<_Tp, _Gp>();
1824     }
1825     return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());
1826   }
1827 
1828   template <class _Func>
1829   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) && {
1830     using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&&>>;
1831     static_assert(__valid_std_unexpected<_Gp>::value,
1832                   "The result of f(std::move(error())) must be a valid template argument for unexpected");
1833     if (has_value()) {
1834       return expected<_Tp, _Gp>();
1835     }
1836     return expected<_Tp, _Gp>(
1837         __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));
1838   }
1839 
1840   template <class _Func>
1841   _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const&& {
1842     using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&&>>;
1843     static_assert(__valid_std_unexpected<_Gp>::value,
1844                   "The result of f(std::move(error())) must be a valid template argument for unexpected");
1845     if (has_value()) {
1846       return expected<_Tp, _Gp>();
1847     }
1848     return expected<_Tp, _Gp>(
1849         __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));
1850   }
1851 
1852   // [expected.void.eq], equality operators
1853   template <class _T2, class _E2>
1854     requires is_void_v<_T2>
1855   _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y) {
1856     if (__x.__has_val() != __y.__has_val()) {
1857       return false;
1858     } else {
1859       return __x.__has_val() || static_cast<bool>(__x.__unex() == __y.__unex());
1860     }
1861   }
1862 
1863   template <class _E2>
1864   _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __y) {
1865     return !__x.__has_val() && static_cast<bool>(__x.__unex() == __y.error());
1866   }
1867 };
1868 
1869 _LIBCPP_END_NAMESPACE_STD
1870 
1871 #endif // _LIBCPP_STD_VER >= 23
1872 
1873 _LIBCPP_POP_MACROS
1874 
1875 #endif // _LIBCPP___EXPECTED_EXPECTED_H
1876