From 47ef4ac5560a62f0867a44731bc17f2ae497e71d Mon Sep 17 00:00:00 2001 From: Damien L-G Date: Thu, 9 Jan 2025 07:50:20 -0500 Subject: [PATCH 1/3] [libc++] Fix bug in atomic_ref test --- .../atomics.ref/increment_decrement.pass.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp index f26a0bdf3663a..84777c95f0569 100644 --- a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp +++ b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp @@ -42,21 +42,21 @@ constexpr bool does_not_have_increment_nor_decrement_operators() { template struct TestDoesNotHaveIncrementDecrement { - void operator()() const { static_assert(does_not_have_increment_nor_decrement_operators()); } + void operator()() const { static_assert(does_not_have_increment_nor_decrement_operators>()); } }; template struct TestIncrementDecrement { void operator()() const { - static_assert(std::is_integral_v); + static_assert(std::is_integral_v || std::is_pointer_v); T x(T(1)); std::atomic_ref const a(x); { std::same_as decltype(auto) y = ++a; - assert(y == T(2)); - assert(x == T(2)); + assert(y == T(1) + 1); + assert(x == T(1) + 1); ASSERT_NOEXCEPT(++a); } @@ -70,13 +70,13 @@ struct TestIncrementDecrement { { std::same_as decltype(auto) y = a++; assert(y == T(1)); - assert(x == T(2)); + assert(x == T(1) + 1); ASSERT_NOEXCEPT(a++); } { std::same_as decltype(auto) y = a--; - assert(y == T(2)); + assert(y == T(1) + 1); assert(x == T(1)); ASSERT_NOEXCEPT(a--); } @@ -88,7 +88,7 @@ int main(int, char**) { TestEachFloatingPointType()(); - TestEachPointerType()(); + TestEachPointerType()(); TestDoesNotHaveIncrementDecrement()(); TestDoesNotHaveIncrementDecrement()(); From 2a6263c903b1ba7e98dc9eb263638c0cc86109a6 Mon Sep 17 00:00:00 2001 From: Damien L-G Date: Thu, 9 Jan 2025 08:01:15 -0500 Subject: [PATCH 2/3] Avoid abusing conversions and split up pointer testing --- .../atomics.ref/increment_decrement.pass.cpp | 96 +++++++++++++------ 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp index 84777c95f0569..0dfd797a90837 100644 --- a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp +++ b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp @@ -49,36 +49,72 @@ template struct TestIncrementDecrement { void operator()() const { static_assert(std::is_integral_v || std::is_pointer_v); - - T x(T(1)); - std::atomic_ref const a(x); - - { - std::same_as decltype(auto) y = ++a; - assert(y == T(1) + 1); - assert(x == T(1) + 1); - ASSERT_NOEXCEPT(++a); - } - - { - std::same_as decltype(auto) y = --a; - assert(y == T(1)); - assert(x == T(1)); - ASSERT_NOEXCEPT(--a); - } - - { - std::same_as decltype(auto) y = a++; - assert(y == T(1)); - assert(x == T(1) + 1); - ASSERT_NOEXCEPT(a++); - } - - { - std::same_as decltype(auto) y = a--; - assert(y == T(1) + 1); - assert(x == T(1)); - ASSERT_NOEXCEPT(a--); + if constexpr (std::is_integral_v) { + T x(T(1)); + std::atomic_ref const a(x); + + { + std::same_as decltype(auto) y = ++a; + assert(y == T(2)); + assert(x == T(2)); + ASSERT_NOEXCEPT(++a); + } + + { + std::same_as decltype(auto) y = --a; + assert(y == T(1)); + assert(x == T(1)); + ASSERT_NOEXCEPT(--a); + } + + { + std::same_as decltype(auto) y = a++; + assert(y == T(1)); + assert(x == T(2)); + ASSERT_NOEXCEPT(a++); + } + + { + std::same_as decltype(auto) y = a--; + assert(y == T(2)); + assert(x == T(1)); + ASSERT_NOEXCEPT(a--); + } + } else if constexpr (std::is_pointer_v) { + using U = std::remove_pointer_t; + U t[9] = {}; + T p{&t[1]}; + std::atomic_ref const a(p); + + { + std::same_as decltype(auto) y = ++a; + assert(y == &t[2]); + assert(p == &t[2]); + ASSERT_NOEXCEPT(++a); + } + + { + std::same_as decltype(auto) y = --a; + assert(y == &t[1]); + assert(p == &t[1]); + ASSERT_NOEXCEPT(--a); + } + + { + std::same_as decltype(auto) y = a++; + assert(y == &t[1]); + assert(p == &t[2]); + ASSERT_NOEXCEPT(a++); + } + + { + std::same_as decltype(auto) y = a--; + assert(y == &t[2]); + assert(p == &t[1]); + ASSERT_NOEXCEPT(a--); + } + } else { + static_assert(std::is_void_v); } } }; From f81156619d9629e0c93e78845ab9a042b058799e Mon Sep 17 00:00:00 2001 From: Damien L-G Date: Thu, 9 Jan 2025 21:04:46 -0500 Subject: [PATCH 3/3] Drop stray debug static assertion --- libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp index 0dfd797a90837..15bf0ecda5363 100644 --- a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp +++ b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp @@ -48,7 +48,6 @@ struct TestDoesNotHaveIncrementDecrement { template struct TestIncrementDecrement { void operator()() const { - static_assert(std::is_integral_v || std::is_pointer_v); if constexpr (std::is_integral_v) { T x(T(1)); std::atomic_ref const a(x);