[libcxx-commits] [libcxx] f632673 - [libc++] [LWG3374] Mark `to_address(const Ptr& p)` overload `constexpr`.

Marek Kurdej via libcxx-commits libcxx-commits at lists.llvm.org
Sun Dec 6 06:26:30 PST 2020


Author: Marek Kurdej
Date: 2020-12-06T15:26:26+01:00
New Revision: f6326736ba166f0a9bfa4e9be019f84fc3143651

URL: https://github.com/llvm/llvm-project/commit/f6326736ba166f0a9bfa4e9be019f84fc3143651
DIFF: https://github.com/llvm/llvm-project/commit/f6326736ba166f0a9bfa4e9be019f84fc3143651.diff

LOG: [libc++] [LWG3374] Mark `to_address(const Ptr& p)` overload `constexpr`.

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D92659

Added: 
    

Modified: 
    libcxx/docs/Cxx2aStatusIssuesStatus.csv
    libcxx/include/memory
    libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/docs/Cxx2aStatusIssuesStatus.csv b/libcxx/docs/Cxx2aStatusIssuesStatus.csv
index 4c78b1655631..4ef24005a3c0 100644
--- a/libcxx/docs/Cxx2aStatusIssuesStatus.csv
+++ b/libcxx/docs/Cxx2aStatusIssuesStatus.csv
@@ -278,7 +278,7 @@
 "`3371 <https://wg21.link/LWG3371>`__","``visit_format_arg``\  and ``make_format_args``\  are not hidden friends","Prague","",""
 "`3372 <https://wg21.link/LWG3372>`__","``vformat_to``\  should not try to deduce ``Out``\  twice","Prague","",""
 "`3373 <https://wg21.link/LWG3373>`__","``{to,from}_chars_result``\  and ``format_to_n_result``\  need the  ""we really mean what we say"" wording","Prague","",""
-"`3374 <https://wg21.link/LWG3374>`__","P0653 + P1006 should have made the other ``std::to_address``\  overload ``constexpr``\ ","Prague","",""
+"`3374 <https://wg21.link/LWG3374>`__","P0653 + P1006 should have made the other ``std::to_address``\  overload ``constexpr``\ ","Prague","|Complete|","12.0"
 "`3375 <https://wg21.link/LWG3375>`__","``decay``\  in ``viewable_range``\  should be ``remove_cvref``\ ","Prague","",""
 "`3377 <https://wg21.link/LWG3377>`__","``elements_view::iterator``\  befriends a specialization of itself","Prague","",""
 "`3379 <https://wg21.link/LWG3379>`__","""``safe``\ "" in several library names is misleading","Prague","",""

diff  --git a/libcxx/include/memory b/libcxx/include/memory
index 402a735419c8..77d7b67112e3 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -46,7 +46,7 @@ struct pointer_traits<T*>
 };
 
 template <class T> constexpr T* to_address(T* p) noexcept; // C++20
-template <class Ptr> auto to_address(const Ptr& p) noexcept; // C++20
+template <class Ptr> constexpr auto to_address(const Ptr& p) noexcept; // C++20
 
 template <class Alloc>
 struct allocator_traits
@@ -1077,7 +1077,7 @@ to_address(_Tp* __p) _NOEXCEPT
 }
 
 template <class _Pointer>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY constexpr
 auto
 to_address(const _Pointer& __p) _NOEXCEPT
 {

diff  --git a/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp b/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
index 2b9928f4df7e..26eba0e06cff 100644
--- a/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
+++ b/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
@@ -11,7 +11,7 @@
 // UNSUPPORTED: c++03, c++11, c++14, c++17
 
 // template <class T> constexpr T* to_address(T* p) noexcept;
-// template <class Ptr> auto to_address(const Ptr& p) noexcept;
+// template <class Ptr> constexpr auto to_address(const Ptr& p) noexcept;
 
 #include <memory>
 #include <cassert>
@@ -22,10 +22,10 @@ class P1
 public:
     using element_type = int;
 
-    explicit P1(int* p)
+    constexpr explicit P1(int* p)
     : p_(p) { }
 
-    int* operator->() const noexcept
+    constexpr int* operator->() const noexcept
     { return p_; }
 
 private:
@@ -37,10 +37,10 @@ class P2
 public:
     using element_type = int;
 
-    explicit P2(int* p)
+    constexpr explicit P2(int* p)
     : p_(p) { }
 
-    P1 operator->() const noexcept
+    constexpr P1 operator->() const noexcept
     { return p_; }
 
 private:
@@ -50,10 +50,10 @@ class P2
 class P3
 {
 public:
-    explicit P3(int* p)
+    constexpr explicit P3(int* p)
     : p_(p) { }
 
-    int* get() const noexcept
+    constexpr int* get() const noexcept
     { return p_; }
 
 private:
@@ -65,7 +65,7 @@ namespace std
 template<>
 struct pointer_traits<::P3>
 {
-    static int* to_address(const ::P3& p) noexcept
+    static constexpr int* to_address(const ::P3& p) noexcept
     { return p.get(); }
 };
 }
@@ -73,13 +73,13 @@ struct pointer_traits<::P3>
 class P4
 {
 public:
-    explicit P4(int* p)
+    constexpr explicit P4(int* p)
     : p_(p) { }
 
-    int* operator->() const noexcept
+    constexpr int* operator->() const noexcept
     { return nullptr; }
 
-    int* get() const noexcept
+    constexpr int* get() const noexcept
     { return p_; }
 
 private:
@@ -91,7 +91,7 @@ namespace std
 template<>
 struct pointer_traits<::P4>
 {
-    static int* to_address(const ::P4& p) noexcept
+    constexpr static int* to_address(const ::P4& p) noexcept
     { return p.get(); }
 };
 }
@@ -99,23 +99,28 @@ struct pointer_traits<::P4>
 int n = 0;
 static_assert(std::to_address(&n) == &n);
 
-int main(int, char**)
-{
-    int i = 0;
-    ASSERT_NOEXCEPT(std::to_address(&i));
-    assert(std::to_address(&i) == &i);
-    P1 p1(&i);
-    ASSERT_NOEXCEPT(std::to_address(p1));
-    assert(std::to_address(p1) == &i);
-    P2 p2(&i);
-    ASSERT_NOEXCEPT(std::to_address(p2));
-    assert(std::to_address(p2) == &i);
-    P3 p3(&i);
-    ASSERT_NOEXCEPT(std::to_address(p3));
-    assert(std::to_address(p3) == &i);
-    P4 p4(&i);
-    ASSERT_NOEXCEPT(std::to_address(p4));
-    assert(std::to_address(p4) == &i);
+constexpr bool test() {
+  int i = 0;
+  ASSERT_NOEXCEPT(std::to_address(&i));
+  assert(std::to_address(&i) == &i);
+  P1 p1(&i);
+  ASSERT_NOEXCEPT(std::to_address(p1));
+  assert(std::to_address(p1) == &i);
+  P2 p2(&i);
+  ASSERT_NOEXCEPT(std::to_address(p2));
+  assert(std::to_address(p2) == &i);
+  P3 p3(&i);
+  ASSERT_NOEXCEPT(std::to_address(p3));
+  assert(std::to_address(p3) == &i);
+  P4 p4(&i);
+  ASSERT_NOEXCEPT(std::to_address(p4));
+  assert(std::to_address(p4) == &i);
+
+  return true;
+}
 
+int main(int, char**) {
+  test();
+  static_assert(test());
   return 0;
 }


        


More information about the libcxx-commits mailing list