diff --git a/gcc/rust/util/optional.h b/gcc/rust/util/optional.h index 4518b4252e3e..a8ef545a5ac7 100644 --- a/gcc/rust/util/optional.h +++ b/gcc/rust/util/optional.h @@ -1249,19 +1249,56 @@ class optional : private detail::optional_move_assign_base, /// Returns a pointer to the stored value constexpr const T *operator->() const { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + return std::addressof(this->m_value); } TL_OPTIONAL_11_CONSTEXPR T *operator->() { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + return std::addressof(this->m_value); } /// Returns the stored value - TL_OPTIONAL_11_CONSTEXPR T &operator*() & { return this->m_value; } + TL_OPTIONAL_11_CONSTEXPR T &operator*() & + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif - constexpr const T &operator*() const & { return this->m_value; } + return this->m_value; + } + + constexpr const T &operator*() const & + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + + return this->m_value; + } + + TL_OPTIONAL_11_CONSTEXPR T &&operator*() && + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif - TL_OPTIONAL_11_CONSTEXPR T &&operator*() && { return std::move(this->m_value); } @@ -1988,14 +2025,49 @@ template class optional { void swap(optional &rhs) noexcept { std::swap(m_value, rhs.m_value); } /// Returns a pointer to the stored value - constexpr const T *operator->() const noexcept { return m_value; } + constexpr const T *operator->() const noexcept + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + + return m_value; + } - TL_OPTIONAL_11_CONSTEXPR T *operator->() noexcept { return m_value; } + TL_OPTIONAL_11_CONSTEXPR T *operator->() noexcept + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + + return m_value; + } /// Returns the stored value - TL_OPTIONAL_11_CONSTEXPR T &operator*() noexcept { return *m_value; } + TL_OPTIONAL_11_CONSTEXPR T &operator*() noexcept { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + + return *m_value; + } - constexpr const T &operator*() const noexcept { return *m_value; } + constexpr const T &operator*() const noexcept + { + // constexpr function must only contain a return statement in C++11 +#ifdef TL_OPTIONAL_CXX14 + // undefined behavior if we don't have a value + rust_assert(has_value ()); +#endif + + return *m_value; + } constexpr bool has_value() const noexcept { return m_value != nullptr; }