diff --git a/libcxx/include/optional b/libcxx/include/optional --- a/libcxx/include/optional +++ b/libcxx/include/optional @@ -906,7 +906,7 @@ _LIBCPP_INLINE_VISIBILITY constexpr const value_type& - operator*() const& + operator*() const& noexcept { _LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value"); return this->__get(); @@ -915,7 +915,7 @@ _LIBCPP_INLINE_VISIBILITY constexpr value_type& - operator*() & + operator*() & noexcept { _LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value"); return this->__get(); @@ -924,7 +924,7 @@ _LIBCPP_INLINE_VISIBILITY constexpr value_type&& - operator*() && + operator*() && noexcept { _LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value"); return _VSTD::move(this->__get()); @@ -933,7 +933,7 @@ _LIBCPP_INLINE_VISIBILITY constexpr const value_type&& - operator*() const&& + operator*() const&& noexcept { _LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value"); return _VSTD::move(this->__get()); diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp --- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp @@ -44,6 +44,7 @@ { optional opt; ((void)opt); ASSERT_SAME_TYPE(decltype(*opt), X&); + LIBCPP_STATIC_ASSERT(noexcept(*opt)); // ASSERT_NOT_NOEXCEPT(*opt); // FIXME: This assertion fails with GCC because it can see that // (A) operator*() is constexpr, and diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp --- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp @@ -37,6 +37,7 @@ { const optional opt; ((void)opt); ASSERT_SAME_TYPE(decltype(*opt), X const&); + LIBCPP_STATIC_ASSERT(noexcept(*opt)); // ASSERT_NOT_NOEXCEPT(*opt); // FIXME: This assertion fails with GCC because it can see that // (A) operator*() is constexpr, and diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp --- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp @@ -37,6 +37,7 @@ { const optional opt; ((void)opt); ASSERT_SAME_TYPE(decltype(*std::move(opt)), X const &&); + LIBCPP_STATIC_ASSERT(noexcept(*opt)); // ASSERT_NOT_NOEXCEPT(*std::move(opt)); // FIXME: This assertion fails with GCC because it can see that // (A) operator*() is constexpr, and diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp --- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp @@ -44,6 +44,7 @@ { optional opt; ((void)opt); ASSERT_SAME_TYPE(decltype(*std::move(opt)), X&&); + LIBCPP_STATIC_ASSERT(noexcept(*opt)); // ASSERT_NOT_NOEXCEPT(*std::move(opt)); // FIXME: This assertion fails with GCC because it can see that // (A) operator*() is constexpr, and