]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add extra assertions to tl::optional
authorOwen Avery <powerboat9.gamer@gmail.com>
Wed, 18 Sep 2024 20:05:31 +0000 (16:05 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 19 Mar 2025 14:32:11 +0000 (15:32 +0100)
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>
gcc/rust/util/optional.h

index b2011b784b76d460426a377850ab8d4418068d70..2c59459cb940810114fe834e5e61b6bbd8c12b5c 100644 (file)
@@ -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; }