From 70228a4ba99cdb5a152dceb10aa754bc0acb4aea Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Wed, 18 Sep 2024 16:05:31 -0400 Subject: gccrs: Add extra assertions to tl::optional gcc/rust/ChangeLog: * util/optional.h (optional): Add assertions to dereference operator overloads when C++14 is available. Signed-off-by: Owen Avery --- gcc/rust/util/optional.h | 86 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/util/optional.h b/gcc/rust/util/optional.h index b2011b7..2c59459 100644 --- a/gcc/rust/util/optional.h +++ b/gcc/rust/util/optional.h @@ -1249,19 +1249,56 @@ public: /// 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 @@ public: 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; } -- cgit v1.1