]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Make pointer_traits::pointer_to constexpr for main template. master trunk
authorTomasz Kamiński <tkaminsk@redhat.com>
Tue, 28 Apr 2026 14:01:47 +0000 (16:01 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Tue, 28 Apr 2026 14:08:36 +0000 (16:08 +0200)
This resolves LWG3454, "pointer_traits::pointer_to should be constexpr",
accepted in Kona 2025.

The change is applied since C++20, i.e. standard in which pointer_to
was made constexpr for T* specialization.

libstdc++-v3/ChangeLog:

* include/bits/ptr_traits.h (__ptr_traits_ptr_to::pointer_to):
Define as constexpr since C++20.
* testsuite/20_util/pointer_traits/pointer_to_constexpr.cc:
New test for custom pointer-like type.

libstdc++-v3/include/bits/ptr_traits.h
libstdc++-v3/testsuite/20_util/pointer_traits/pointer_to_constexpr.cc

index df83e0cad1d4cdd44cbaa25d13001928e5afc2b6..c1dc76509cee3f4e69549ea14974405f11d9a085 100644 (file)
@@ -97,13 +97,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       using pointer = _Ptr;
       using element_type = _Elt;
 
       using pointer = _Ptr;
       using element_type = _Elt;
 
+      // _GLIBCXX_RESOLVE_LIB_DEFECTS
+      // 3454. pointer_traits::pointer_to should be constexpr
       /**
        *  @brief  Obtain a pointer to an object
        *  @param  __r  A reference to an object of type `element_type`
        *  @return `pointer::pointer_to(__r)`
        *  @pre `pointer::pointer_to(__r)` is a valid expression.
       */
       /**
        *  @brief  Obtain a pointer to an object
        *  @param  __r  A reference to an object of type `element_type`
        *  @return `pointer::pointer_to(__r)`
        *  @pre `pointer::pointer_to(__r)` is a valid expression.
       */
-      static pointer
+      static _GLIBCXX20_CONSTEXPR pointer
       pointer_to(element_type& __r)
 #if __cpp_lib_concepts
       requires requires {
       pointer_to(element_type& __r)
 #if __cpp_lib_concepts
       requires requires {
index cfd35f899c41e5281202b6d769fb0bba65abe896..929d004fd4a1e1b4c133e0d44ea73a5f05ea7b37 100644 (file)
@@ -24,3 +24,17 @@ static_assert( std::pointer_traits<int*>::pointer_to(i) == &i );
 
 struct X { } x;
 static_assert( std::pointer_traits<X*>::pointer_to(x) == &x );
 
 struct X { } x;
 static_assert( std::pointer_traits<X*>::pointer_to(x) == &x );
+
+template<typename T>
+struct Ptr
+{
+  T* value;
+
+  constexpr static Ptr
+  pointer_to(T& t) { return Ptr{&t}; }
+
+  friend bool operator==(Ptr, Ptr) = default;
+};
+
+static_assert( std::pointer_traits<Ptr<int>>::pointer_to(i) == Ptr<int>{&i} );
+static_assert( std::pointer_traits<Ptr<X>>::pointer_to(x) == Ptr<X>{&x} );