[libcxx-commits] [libcxx] [libc++] Implement P2988R12: `std::optional<T&> (PR #155202)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Aug 24 21:26:15 PDT 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff HEAD~1 HEAD --extensions h,,cpp -- libcxx/test/libcxx/utilities/optional/optional.object/optional.object.observe/value_or.compile.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ref_t.pass.cpp libcxx/include/__iterator/wrap_iter.h libcxx/include/optional libcxx/test/libcxx/utilities/optional/optional.iterator/iterator.compile.pass.cpp libcxx/test/std/utilities/optional/optional.iterator/begin.pass.cpp libcxx/test/std/utilities/optional/optional.iterator/end.pass.cpp libcxx/test/std/utilities/optional/optional.iterator/iterator.pass.cpp libcxx/test/std/utilities/optional/optional.monadic/and_then.pass.cpp libcxx/test/std/utilities/optional/optional.monadic/or_else.pass.cpp libcxx/test/std/utilities/optional/optional.monadic/transform.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp libcxx/test/std/utilities/optional/optional.object/optional_requires_destructible_object.verify.cpp
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/libcxx/test/libcxx/utilities/optional/optional.iterator/iterator.compile.pass.cpp b/libcxx/test/libcxx/utilities/optional/optional.iterator/iterator.compile.pass.cpp
index 472049a91..b604579e4 100644
--- a/libcxx/test/libcxx/utilities/optional/optional.iterator/iterator.compile.pass.cpp
+++ b/libcxx/test/libcxx/utilities/optional/optional.iterator/iterator.compile.pass.cpp
@@ -25,5 +25,5 @@ static_assert(has_iterator_aliases<std::optional<int>>);
 static_assert(has_iterator_aliases<std::optional<const int>>);
 static_assert(has_iterator_aliases<std::optional<int&>>);
 static_assert(has_iterator_aliases<std::optional<const int&>>);
-static_assert(!has_iterator_aliases<std::optional<int(&)[1]>>);
-static_assert(!has_iterator_aliases<std::optional<int(&)()>>);
+static_assert(!has_iterator_aliases<std::optional<int (&)[1]>>);
+static_assert(!has_iterator_aliases<std::optional<int (&)()>>);
diff --git a/libcxx/test/libcxx/utilities/optional/optional.object/optional.object.observe/value_or.compile.pass.cpp b/libcxx/test/libcxx/utilities/optional/optional.object/optional.object.observe/value_or.compile.pass.cpp
index 298e2f6f5..7c2c9bc23 100644
--- a/libcxx/test/libcxx/utilities/optional/optional.object/optional.object.observe/value_or.compile.pass.cpp
+++ b/libcxx/test/libcxx/utilities/optional/optional.object/optional.object.observe/value_or.compile.pass.cpp
@@ -23,5 +23,5 @@ concept has_value_or = requires(Opt opt, T&& t) {
 static_assert(has_value_or<std::optional<int>, int>);
 static_assert(has_value_or<std::optional<int&>, int&>);
 static_assert(has_value_or<std::optional<const int&>, const int&>);
-static_assert(!has_value_or<std::optional<int(&)[1]>&&, int(&)[1]>);
-static_assert(!has_value_or<std::optional<int(&)()>&&, int(&)()>);
+static_assert(!has_value_or<std::optional<int (&)[1]>&&, int (&)[1]>);
+static_assert(!has_value_or<std::optional<int (&)()>&&, int (&)()>);
diff --git a/libcxx/test/std/utilities/optional/optional.monadic/and_then.pass.cpp b/libcxx/test/std/utilities/optional/optional.monadic/and_then.pass.cpp
index 3d945e437..e9d44960c 100644
--- a/libcxx/test/std/utilities/optional/optional.monadic/and_then.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.monadic/and_then.pass.cpp
@@ -307,7 +307,6 @@ constexpr bool test_ref() {
 
   // Test && overload
   {
-
     //With & qualifier on F's operator()
     {
       int j = 42;
diff --git a/libcxx/test/std/utilities/optional/optional.monadic/transform.pass.cpp b/libcxx/test/std/utilities/optional/optional.monadic/transform.pass.cpp
index 0d14ceb3b..2faf58f79 100644
--- a/libcxx/test/std/utilities/optional/optional.monadic/transform.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.monadic/transform.pass.cpp
@@ -238,7 +238,7 @@ constexpr bool test_ref() {
     }
   }
   // const& overload
-  { 
+  {
     // Without & qualifier on F's operator()
     {
       int i = 42;
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
index d633f91dc..dda461e89 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
@@ -279,8 +279,7 @@ constexpr void test_with_ref() {
     assert(static_cast<bool>(opt) == false);
   }
 }
-#endif 
-
+#endif
 
 int main(int, char**)
 {
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
index 1c921f749..69709a076 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
@@ -224,20 +224,20 @@ TEST_CONSTEXPR_CXX20 bool test_empty_emplace() {
 #if TEST_STD_VER >= 26
 template <class T, std::remove_reference_t<T> _Val>
 constexpr bool test_ref() {
-    using Opt = std::optional<T&>;
-    T t{_Val};
-    {
-        Opt opt;
-        auto & v = opt.emplace(t);
-        static_assert(std::is_same_v<T&, decltype(v)>, "");
-        assert(static_cast<bool>(opt) == true);
-        assert(*opt == t);
-        assert(&v == &*opt);
-        assert(&t == &*opt);
-    }
-    return true;
+  using Opt = std::optional<T&>;
+  T t{_Val};
+  {
+    Opt opt;
+    auto& v = opt.emplace(t);
+    static_assert(std::is_same_v<T&, decltype(v)>, "");
+    assert(static_cast<bool>(opt) == true);
+    assert(*opt == t);
+    assert(&v == &*opt);
+    assert(&t == &*opt);
+  }
+  return true;
 }
-#endif 
+#endif
 
 int main(int, char**)
 {
@@ -314,6 +314,6 @@ int main(int, char**)
     static_assert(test_ref<double, 15.0>());
     assert((test_ref<int, 1>()));
     assert((test_ref<double, 15.0>()));
-#endif 
-  return 0;
+#endif
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
index a484a26f4..81b29c9ca 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
@@ -25,12 +25,16 @@ int main(int, char**)
 {
     {
 #if TEST_STD_VER >= 26
-    std::optional<int&&> opt2;         // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with an rvalue reference type is ill-formed}}
-#else     
-    std::optional<char &> o1;          // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with a reference type is ill-formed}}
-#endif 
-    std::optional<NonDestructible> o2; // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with a non-destructible type is ill-formed}}
-    std::optional<char[20]> o3;        // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with an array type is ill-formed}}
+      std::optional<int&&>
+          opt2; // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with an rvalue reference type is ill-formed}}
+#else
+      std::optional<char&>
+          o1; // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with a reference type is ill-formed}}
+#endif
+      std::optional<NonDestructible>
+          o2; // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with a non-destructible type is ill-formed}}
+      std::optional<char[20]>
+          o3; // expected-error-re at optional:* {{static assertion failed{{.*}}instantiation of optional with an array type is ill-formed}}
     }
 
     {
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ref_t.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ref_t.pass.cpp
index e3d225a82..3ef41f678 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ref_t.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ref_t.pass.cpp
@@ -25,8 +25,8 @@ constexpr bool test() {
     assert(&(*opt) == &item);
   }
   {
-    assert(*std::as_const(opt) == item);  
-    assert(&(*std::as_const(opt)) == &item);  
+    assert(*std::as_const(opt) == item);
+    assert(&(*std::as_const(opt)) == &item);
   }
 
   return true;
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
index f9744ae0c..a14e2dc21 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
@@ -66,10 +66,10 @@ int main(int, char**)
     }
 #if TEST_STD_VER >= 26
     {
-        typedef int& T;
-        static_assert(std::is_trivially_destructible<T>::value, "");
-        static_assert(std::is_trivially_destructible<optional<T>>::value, "");
+      typedef int& T;
+      static_assert(std::is_trivially_destructible<T>::value, "");
+      static_assert(std::is_trivially_destructible<optional<T>>::value, "");
     }
-#endif 
-  return 0;
+#endif
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
index e633e3f1d..e23e481f6 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
@@ -78,7 +78,7 @@ int main(int, char**)
       assert(X::dtor_called == false);
       assert(static_cast<bool>(opt) == false);
     }
-#endif 
+#endif
 
-  return 0;
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
index cbeb0c9e2..d2ebafbc3 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
@@ -45,21 +45,21 @@ int main(int, char**)
     }
 #if TEST_STD_VER >= 26
     {
-        X x{};
-        const optional<X&> opt{x};
-        ASSERT_SAME_TYPE(decltype(*opt), X&);
-        ASSERT_NOEXCEPT(*opt);
+      X x{};
+      const optional<X&> opt{x};
+      ASSERT_SAME_TYPE(decltype(*opt), X&);
+      ASSERT_NOEXCEPT(*opt);
     }
     {
-        X x{};
-        const optional<const X&> opt{x};
-        ASSERT_SAME_TYPE(decltype(*opt), const X&);
-        ASSERT_NOEXCEPT(*opt);
+      X x{};
+      const optional<const X&> opt{x};
+      ASSERT_SAME_TYPE(decltype(*opt), const X&);
+      ASSERT_NOEXCEPT(*opt);
     }
     {
-        static constexpr X x{};
-        constexpr optional<const X&> opt(x);
-        static_assert((*opt).test() == 3, "");
+      static constexpr X x{};
+      constexpr optional<const X&> opt(x);
+      static_assert((*opt).test() == 3, "");
     }
 #endif
     {
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
index ab5998fee..4e9d6cc1a 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
@@ -22,7 +22,7 @@ using std::optional;
 struct X
 {
     int test() noexcept {return 3;}
-    int test() const noexcept {return 3;}
+    int test() const noexcept { return 3; }
 };
 
 struct Y
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
index d5df58dd8..304ea451b 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
@@ -77,10 +77,10 @@ int main(int, char**)
     }
 #if TEST_STD_VER >= 26
     {
-        X y{3};
-        const optional<X&> opt;
-        assert(opt.value_or(y) == 3);
+      X y{3};
+      const optional<X&> opt;
+      assert(opt.value_or(y) == 3);
     }
-#endif 
-  return 0;
+#endif
+    return 0;
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/155202


More information about the libcxx-commits mailing list