https://gcc.gnu.org/g:a9d6de2007d142c9dee14b45664e5a3a7e0b2df6

commit r14-12158-ga9d6de2007d142c9dee14b45664e5a3a7e0b2df6
Author: Jonathan Wakely <[email protected]>
Date:   Thu Sep 26 23:38:41 2024 +0100

    libstdc++: Fix test FAIL due to -Wpointer-arith
    
    This fixes a FAIL due to a -Wpointer-arith warning when testing with
    c++11 or c++14 dialects. As an extension our std::atomic<void*> supports
    pointer arithmetic in C++11 and C++14, but due to the system header
    changes there is now a warning about it. The warning seems reasonable,
    so rather than suppress it we should make the test expect it.
    
    While looking into this I decided to simplify some of the code related
    to atomic<T*> arithmetic.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/atomic_base.h (__atomic_base<T*>::_M_type_size):
            Replace overloaded functions with static _S_type_size.
            * include/std/atomic (atomic<T*>): Use is_object_v instead of
            is_object.
            * testsuite/29_atomics/atomic/operators/pointer_partial_void.cc:
            Add dg-warning for -Wpointer-arith warning.
    
    (cherry picked from commit 500046d178bc78a8f18d529c62f7b45c8ad2c861)

Diff:
---
 libstdc++-v3/include/bits/atomic_base.h            | 33 ++++++++++------------
 libstdc++-v3/include/std/atomic                    | 32 ++++++++++-----------
 .../atomic/operators/pointer_partial_void.cc       |  1 +
 3 files changed, 32 insertions(+), 34 deletions(-)

diff --git a/libstdc++-v3/include/bits/atomic_base.h 
b/libstdc++-v3/include/bits/atomic_base.h
index 20901b7fc06f..4e0947c7ce34 100644
--- a/libstdc++-v3/include/bits/atomic_base.h
+++ b/libstdc++-v3/include/bits/atomic_base.h
@@ -686,12 +686,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       __pointer_type   _M_p _GLIBCXX20_INIT(nullptr);
 
-      // Factored out to facilitate explicit specialization.
-      constexpr ptrdiff_t
-      _M_type_size(ptrdiff_t __d) const { return __d * sizeof(_PTp); }
-
-      constexpr ptrdiff_t
-      _M_type_size(ptrdiff_t __d) const volatile { return __d * sizeof(_PTp); }
+      static constexpr ptrdiff_t
+      _S_type_size(ptrdiff_t __d)
+      { return __d * sizeof(_PTp); }
 
     public:
       __atomic_base() noexcept = default;
@@ -741,42 +738,42 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       __pointer_type
       operator++() noexcept
-      { return __atomic_add_fetch(&_M_p, _M_type_size(1),
+      { return __atomic_add_fetch(&_M_p, _S_type_size(1),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator++() volatile noexcept
-      { return __atomic_add_fetch(&_M_p, _M_type_size(1),
+      { return __atomic_add_fetch(&_M_p, _S_type_size(1),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator--() noexcept
-      { return __atomic_sub_fetch(&_M_p, _M_type_size(1),
+      { return __atomic_sub_fetch(&_M_p, _S_type_size(1),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator--() volatile noexcept
-      { return __atomic_sub_fetch(&_M_p, _M_type_size(1),
+      { return __atomic_sub_fetch(&_M_p, _S_type_size(1),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator+=(ptrdiff_t __d) noexcept
-      { return __atomic_add_fetch(&_M_p, _M_type_size(__d),
+      { return __atomic_add_fetch(&_M_p, _S_type_size(__d),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator+=(ptrdiff_t __d) volatile noexcept
-      { return __atomic_add_fetch(&_M_p, _M_type_size(__d),
+      { return __atomic_add_fetch(&_M_p, _S_type_size(__d),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator-=(ptrdiff_t __d) noexcept
-      { return __atomic_sub_fetch(&_M_p, _M_type_size(__d),
+      { return __atomic_sub_fetch(&_M_p, _S_type_size(__d),
                                  int(memory_order_seq_cst)); }
 
       __pointer_type
       operator-=(ptrdiff_t __d) volatile noexcept
-      { return __atomic_sub_fetch(&_M_p, _M_type_size(__d),
+      { return __atomic_sub_fetch(&_M_p, _S_type_size(__d),
                                  int(memory_order_seq_cst)); }
 
       bool
@@ -931,22 +928,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       fetch_add(ptrdiff_t __d,
                memory_order __m = memory_order_seq_cst) noexcept
-      { return __atomic_fetch_add(&_M_p, _M_type_size(__d), int(__m)); }
+      { return __atomic_fetch_add(&_M_p, _S_type_size(__d), int(__m)); }
 
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       fetch_add(ptrdiff_t __d,
                memory_order __m = memory_order_seq_cst) volatile noexcept
-      { return __atomic_fetch_add(&_M_p, _M_type_size(__d), int(__m)); }
+      { return __atomic_fetch_add(&_M_p, _S_type_size(__d), int(__m)); }
 
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       fetch_sub(ptrdiff_t __d,
                memory_order __m = memory_order_seq_cst) noexcept
-      { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), int(__m)); }
+      { return __atomic_fetch_sub(&_M_p, _S_type_size(__d), int(__m)); }
 
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       fetch_sub(ptrdiff_t __d,
                memory_order __m = memory_order_seq_cst) volatile noexcept
-      { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), int(__m)); }
+      { return __atomic_fetch_sub(&_M_p, _S_type_size(__d), int(__m)); }
     };
 
   namespace __atomic_impl
diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
index 1462cf5ec23f..608a9e7ca28d 100644
--- a/libstdc++-v3/include/std/atomic
+++ b/libstdc++-v3/include/std/atomic
@@ -450,7 +450,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator++(int) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b++;
       }
@@ -459,7 +459,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator++(int) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b++;
       }
@@ -468,7 +468,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator--(int) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b--;
       }
@@ -477,7 +477,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator--(int) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b--;
       }
@@ -486,7 +486,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator++() noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return ++_M_b;
       }
@@ -495,7 +495,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator++() volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return ++_M_b;
       }
@@ -504,7 +504,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator--() noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return --_M_b;
       }
@@ -513,7 +513,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator--() volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return --_M_b;
       }
@@ -522,7 +522,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator+=(ptrdiff_t __d) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.operator+=(__d);
       }
@@ -531,7 +531,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator+=(ptrdiff_t __d) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.operator+=(__d);
       }
@@ -540,7 +540,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator-=(ptrdiff_t __d) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.operator-=(__d);
       }
@@ -549,7 +549,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       operator-=(ptrdiff_t __d) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.operator-=(__d);
       }
@@ -670,7 +670,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                memory_order __m = memory_order_seq_cst) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.fetch_add(__d, __m);
       }
@@ -680,7 +680,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                memory_order __m = memory_order_seq_cst) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.fetch_add(__d, __m);
       }
@@ -690,7 +690,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                memory_order __m = memory_order_seq_cst) noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.fetch_sub(__d, __m);
       }
@@ -700,7 +700,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                memory_order __m = memory_order_seq_cst) volatile noexcept
       {
 #if __cplusplus >= 201703L
-       static_assert( is_object<_Tp>::value, "pointer to object type" );
+       static_assert( is_object_v<_Tp>, "pointer to object type" );
 #endif
        return _M_b.fetch_sub(__d, __m);
       }
diff --git 
a/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc 
b/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
index 255912e85c4c..5e5054a2ae45 100644
--- a/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
+++ b/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
@@ -69,3 +69,4 @@ int main(void)
 
   return 0;
 }
+// { dg-warning "invalid application of 'sizeof' to a void type" "" { target 
*-*-* } 0 }

Reply via email to