Optional: Avoid value() uses
authorFangrui Song <i@maskray.me>
Sat, 17 Dec 2022 22:30:35 +0000 (22:30 +0000)
committerFangrui Song <i@maskray.me>
Sat, 17 Dec 2022 22:30:35 +0000 (22:30 +0000)
prerequisite to deprecate the new API value() whose counterpart in
std::optional has undesired exception checking semantics and is
unavailable in older Xcode.

llvm/include/llvm/ADT/Optional.h
llvm/unittests/ADT/OptionalTest.cpp

index 2b8940c..331c681 100644 (file)
@@ -277,18 +277,18 @@ public:
   constexpr bool has_value() const { return Storage.has_value(); }
   constexpr const T *operator->() const { return &Storage.value(); }
   T *operator->() { return &Storage.value(); }
-  constexpr const T &operator*() const & { return value(); }
-  T &operator*() & { return value(); }
+  constexpr const T &operator*() const & { return Storage.value(); }
+  T &operator*() & { return Storage.value(); }
 
   template <typename U> constexpr T value_or(U &&alt) const & {
-    return has_value() ? value() : std::forward<U>(alt);
+    return has_value() ? operator*() : std::forward<U>(alt);
   }
 
   T &&value() && { return std::move(Storage.value()); }
   T &&operator*() && { return std::move(Storage.value()); }
 
   template <typename U> T value_or(U &&alt) && {
-    return has_value() ? std::move(value()) : std::forward<U>(alt);
+    return has_value() ? std::move(operator*()) : std::forward<U>(alt);
   }
 };
 
index bc344a2..af4cf2e 100644 (file)
@@ -34,9 +34,9 @@ void OptionalWorksInConstexpr() {
                 "Default construction and hasValue() are contexpr");
   constexpr auto y1 = Optional<int>(3);
   constexpr Optional<int> y2{3};
-  static_assert(y1.value() == y2.value() && y1.value() == 3,
+  static_assert(*y1 == *y2 && *y1 == 3,
                 "Construction with value and getValue() are constexpr");
-  static_assert(y1.value() == y2.value() && y1.value() == 3,
+  static_assert(*y1 == *y2 && *y1 == 3,
                 "Construction with value and getValue() are constexpr");
   static_assert(Optional<int>{3} >= 2 && Optional<int>{1} < Optional<int>{2},
                 "Comparisons work in constexpr");