]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add extra assertions to tl::optional
authorOwen Avery <powerboat9.gamer@gmail.com>
Wed, 18 Sep 2024 20:05:31 +0000 (16:05 -0400)
committerCohenArthur <arthur.cohen@embecosm.com>
Tue, 24 Sep 2024 08:06:05 +0000 (08:06 +0000)
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 4518b4252e3e962f598b32235ff2c764cbfcd957..a8ef545a5ac79e54c917141c727c914efc33f680 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; }