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 }
