1 #include <type_traits>
2 #include <utility>
3 
4 #if REVISION == 0
5 // Pre-a3942b3 layout.
6 #define NO_REMOVE_CV
7 #endif
8 // REVISION == 1: current layout
9 
10 namespace std {
11 namespace __lldb {
12 
13 struct in_place_t {
14   explicit in_place_t() = default;
15 };
16 constexpr in_place_t in_place{};
17 
18 template <class _Tp, bool = is_trivially_destructible<_Tp>::value>
19 struct __optional_destruct_base {
20   typedef _Tp value_type;
21   union {
22     char __null_state_;
23 #ifdef NO_REMOVE_CV
24     value_type __val_;
25 #else // !NO_REMOVE_CV
26     remove_cv_t<value_type> __val_;
27 #endif
28   };
29   bool __engaged_;
30 
31   template <class... _Args>
32   constexpr explicit __optional_destruct_base(in_place_t, _Args &&...__args)
33       : __val_(std::forward<_Args>(__args)...), __engaged_(true) {}
34 };
35 
36 template <class _Tp, bool = is_reference<_Tp>::value>
37 struct __optional_storage_base : __optional_destruct_base<_Tp> {
38   using __base = __optional_destruct_base<_Tp>;
39   using value_type = _Tp;
40   using __base::__base;
41 };
42 
43 template <class _Tp, bool = is_trivially_copy_constructible<_Tp>::value>
44 struct __optional_copy_base : __optional_storage_base<_Tp> {
45   using __optional_storage_base<_Tp>::__optional_storage_base;
46 };
47 
48 template <class _Tp, bool = is_trivially_move_constructible<_Tp>::value>
49 struct __optional_move_base : __optional_copy_base<_Tp> {
50   using __optional_copy_base<_Tp>::__optional_copy_base;
51 };
52 
53 template <class _Tp, bool = is_trivially_destructible<_Tp>::value &&
54                             is_trivially_copy_constructible<_Tp>::value &&
55                             is_trivially_copy_assignable<_Tp>::value>
56 struct __optional_copy_assign_base : __optional_move_base<_Tp> {
57   using __optional_move_base<_Tp>::__optional_move_base;
58 };
59 
60 template <class _Tp, bool = is_trivially_destructible<_Tp>::value &&
61                             is_trivially_move_constructible<_Tp>::value &&
62                             is_trivially_move_assignable<_Tp>::value>
63 struct __optional_move_assign_base : __optional_copy_assign_base<_Tp> {
64   using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
65 };
66 
67 template <bool _CanCopy, bool _CanMove> struct __sfinae_ctor_base {};
68 
69 template <class _Tp>
70 using __optional_sfinae_ctor_base_t =
71     __sfinae_ctor_base<is_copy_constructible<_Tp>::value,
72                        is_move_constructible<_Tp>::value>;
73 
74 template <bool _CanCopy, bool _CanMove> struct __sfinae_assign_base {};
75 
76 template <class _Tp>
77 using __optional_sfinae_assign_base_t = __sfinae_assign_base<
78     (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value),
79     (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value)>;
80 
81 template <class _Tp>
82 class optional : private __optional_move_assign_base<_Tp>,
83                  private __optional_sfinae_ctor_base_t<_Tp>,
84                  private __optional_sfinae_assign_base_t<_Tp> {
85   using __base = __optional_move_assign_base<_Tp>;
86 
87 public:
88   using value_type = _Tp;
89 
90 public:
91   template <class _Up = value_type>
92   constexpr explicit optional(_Up &&__v)
93       : __base(in_place, std::forward<_Up>(__v)) {}
94 };
95 
96 } // namespace __lldb
97 } // namespace std
98 
99 int main() {
100   std::__lldb::optional<char const *> maybe_string{"Hello"};
101   std::__lldb::optional<int> maybe_int{42};
102   return 0; // Break here
103 }
104