Skip to content

Commit

Permalink
Add extra assertions to tl::optional
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* util/optional.h
	(optional): Add assertions to dereference operator overloads
	when C++14 is available.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
  • Loading branch information
powerboat9 committed Sep 18, 2024
1 parent 483ee3a commit 754d183
Showing 1 changed file with 79 additions and 7 deletions.
86 changes: 79 additions & 7 deletions gcc/rust/util/optional.h
Original file line number Diff line number Diff line change
Expand Up @@ -1249,19 +1249,56 @@ class optional : private detail::optional_move_assign_base<T>,

/// 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);
}

Expand Down Expand Up @@ -1988,14 +2025,49 @@ template <class T> class optional<T &> {
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; }

Expand Down

0 comments on commit 754d183

Please sign in to comment.