[libcxx][optional] adds missing constexpr operations
authorChristopher Di Bella <cjdb@google.com>
Sun, 9 May 2021 01:30:32 +0000 (01:30 +0000)
committerChristopher Di Bella <cjdb@google.com>
Thu, 10 Jun 2021 05:52:47 +0000 (05:52 +0000)
commit546449938a39dcc65f60f8d6e44e7b058a026549
tree14b6e02b18d1cba5bd9550ef3a2b0c586e0a2b33
parentb5d6da3587469246a77d573fdf17ffa85a07673c
[libcxx][optional] adds missing constexpr operations

Makes the following operations constexpr:
  * `std::swap(optional, optional)`
  * `optional(optional<U> const&)`
  * `optional(optional<U>&&)`
  * `~optional()`
  * `operator=(nullopt_t)`
  * `operator=(U&&)`
  * `operator=(optional<U> const&)`
  * `operator=(optional<U>&&)`
  * `emplace(Args&&...)`
  * `emplace(initializer_list<U>, Args&&...)`
  * `swap(optional&)`
  * `reset()`

P2231 has been accepted by plenary, with the committee recommending
implementers retroactively apply to C++20. It's necessary for us to
implement _`semiregular-box`_ and _`non-propagating-cache`_, both of
which are required for ranges (otherwise we'll need to reimplement
`std::optional` with these members `constexpr`ified).

Differential Revision: https://reviews.llvm.org/D102119
14 files changed:
libcxx/docs/Cxx2aStatusPaperStatus.csv
libcxx/include/optional
libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.fail.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp