-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc++] Fix bug in **tests** for std::atomic_ref<T*> increment and decrement operators #122271
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc++] Fix bug in **tests** for std::atomic_ref<T*> increment and decrement operators #122271
Conversation
@llvm/pr-subscribers-libcxx Author: Damien L-G (dalg24) ChangesFix https://github.com/llvm/llvm-project/pull/121414/files#r1908697882 The implementation is fine and has the proper increment/decrement operators defined llvm-project/libcxx/include/__atomic/atomic_ref.h Lines 364 to 367 in b4e17d4
The issue is in the tests
Full diff: https://github.com/llvm/llvm-project/pull/122271.diff 1 Files Affected:
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 f26a0bdf3663a5..0dfd797a908371 100644
--- a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp
@@ -42,43 +42,79 @@ constexpr bool does_not_have_increment_nor_decrement_operators() {
template <typename T>
struct TestDoesNotHaveIncrementDecrement {
- void operator()() const { static_assert(does_not_have_increment_nor_decrement_operators<T>()); }
+ void operator()() const { static_assert(does_not_have_increment_nor_decrement_operators<std::atomic_ref<T>>()); }
};
template <typename T>
struct TestIncrementDecrement {
void operator()() const {
- static_assert(std::is_integral_v<T>);
-
- T x(T(1));
- std::atomic_ref<T> const a(x);
-
- {
- std::same_as<T> decltype(auto) y = ++a;
- assert(y == T(2));
- assert(x == T(2));
- ASSERT_NOEXCEPT(++a);
- }
-
- {
- std::same_as<T> decltype(auto) y = --a;
- assert(y == T(1));
- assert(x == T(1));
- ASSERT_NOEXCEPT(--a);
- }
-
- {
- std::same_as<T> decltype(auto) y = a++;
- assert(y == T(1));
- assert(x == T(2));
- ASSERT_NOEXCEPT(a++);
- }
-
- {
- std::same_as<T> decltype(auto) y = a--;
- assert(y == T(2));
- assert(x == T(1));
- ASSERT_NOEXCEPT(a--);
+ static_assert(std::is_integral_v<T> || std::is_pointer_v<T>);
+ if constexpr (std::is_integral_v<T>) {
+ T x(T(1));
+ std::atomic_ref<T> const a(x);
+
+ {
+ std::same_as<T> decltype(auto) y = ++a;
+ assert(y == T(2));
+ assert(x == T(2));
+ ASSERT_NOEXCEPT(++a);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = --a;
+ assert(y == T(1));
+ assert(x == T(1));
+ ASSERT_NOEXCEPT(--a);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = a++;
+ assert(y == T(1));
+ assert(x == T(2));
+ ASSERT_NOEXCEPT(a++);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = a--;
+ assert(y == T(2));
+ assert(x == T(1));
+ ASSERT_NOEXCEPT(a--);
+ }
+ } else if constexpr (std::is_pointer_v<T>) {
+ using U = std::remove_pointer_t<T>;
+ U t[9] = {};
+ T p{&t[1]};
+ std::atomic_ref<T> const a(p);
+
+ {
+ std::same_as<T> decltype(auto) y = ++a;
+ assert(y == &t[2]);
+ assert(p == &t[2]);
+ ASSERT_NOEXCEPT(++a);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = --a;
+ assert(y == &t[1]);
+ assert(p == &t[1]);
+ ASSERT_NOEXCEPT(--a);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = a++;
+ assert(y == &t[1]);
+ assert(p == &t[2]);
+ ASSERT_NOEXCEPT(a++);
+ }
+
+ {
+ std::same_as<T> decltype(auto) y = a--;
+ assert(y == &t[2]);
+ assert(p == &t[1]);
+ ASSERT_NOEXCEPT(a--);
+ }
+ } else {
+ static_assert(std::is_void_v<T>);
}
}
};
@@ -88,7 +124,7 @@ int main(int, char**) {
TestEachFloatingPointType<TestDoesNotHaveIncrementDecrement>()();
- TestEachPointerType<TestDoesNotHaveIncrementDecrement>()();
+ TestEachPointerType<TestIncrementDecrement>()();
TestDoesNotHaveIncrementDecrement<bool>()();
TestDoesNotHaveIncrementDecrement<UserAtomicType>()();
|
libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp
Outdated
Show resolved
Hide resolved
…ment operators (llvm#122271) The implementation is fine and has the proper increment/decrement operators defined, but the tests were wrong: - a typo (`T` instead of `std::atomic_ref<T>`) when ensuring that increment/decrement operators are not defined in the primary template and specialization for floating point types, and - the specialization for pointer types was miscategorized.
Fix https://github.com/llvm/llvm-project/pull/121414/files#r1908697882
The implementation is fine and has the proper increment/decrement operators defined
llvm-project/libcxx/include/__atomic/atomic_ref.h
Lines 364 to 367 in b4e17d4
The issue is in the tests
T
instead ofstd::atomic_ref<T>
) when ensuring that increment/decrement operators are not defined in the primary template and specialization for floating point types, and