Skip to content

Commit 2a6263c

Browse files
committed
Avoid abusing conversions and split up pointer testing
1 parent 47ef4ac commit 2a6263c

File tree

1 file changed

+66
-30
lines changed

1 file changed

+66
-30
lines changed

libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp

Lines changed: 66 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,72 @@ template <typename T>
4949
struct TestIncrementDecrement {
5050
void operator()() const {
5151
static_assert(std::is_integral_v<T> || std::is_pointer_v<T>);
52-
53-
T x(T(1));
54-
std::atomic_ref<T> const a(x);
55-
56-
{
57-
std::same_as<T> decltype(auto) y = ++a;
58-
assert(y == T(1) + 1);
59-
assert(x == T(1) + 1);
60-
ASSERT_NOEXCEPT(++a);
61-
}
62-
63-
{
64-
std::same_as<T> decltype(auto) y = --a;
65-
assert(y == T(1));
66-
assert(x == T(1));
67-
ASSERT_NOEXCEPT(--a);
68-
}
69-
70-
{
71-
std::same_as<T> decltype(auto) y = a++;
72-
assert(y == T(1));
73-
assert(x == T(1) + 1);
74-
ASSERT_NOEXCEPT(a++);
75-
}
76-
77-
{
78-
std::same_as<T> decltype(auto) y = a--;
79-
assert(y == T(1) + 1);
80-
assert(x == T(1));
81-
ASSERT_NOEXCEPT(a--);
52+
if constexpr (std::is_integral_v<T>) {
53+
T x(T(1));
54+
std::atomic_ref<T> const a(x);
55+
56+
{
57+
std::same_as<T> decltype(auto) y = ++a;
58+
assert(y == T(2));
59+
assert(x == T(2));
60+
ASSERT_NOEXCEPT(++a);
61+
}
62+
63+
{
64+
std::same_as<T> decltype(auto) y = --a;
65+
assert(y == T(1));
66+
assert(x == T(1));
67+
ASSERT_NOEXCEPT(--a);
68+
}
69+
70+
{
71+
std::same_as<T> decltype(auto) y = a++;
72+
assert(y == T(1));
73+
assert(x == T(2));
74+
ASSERT_NOEXCEPT(a++);
75+
}
76+
77+
{
78+
std::same_as<T> decltype(auto) y = a--;
79+
assert(y == T(2));
80+
assert(x == T(1));
81+
ASSERT_NOEXCEPT(a--);
82+
}
83+
} else if constexpr (std::is_pointer_v<T>) {
84+
using U = std::remove_pointer_t<T>;
85+
U t[9] = {};
86+
T p{&t[1]};
87+
std::atomic_ref<T> const a(p);
88+
89+
{
90+
std::same_as<T> decltype(auto) y = ++a;
91+
assert(y == &t[2]);
92+
assert(p == &t[2]);
93+
ASSERT_NOEXCEPT(++a);
94+
}
95+
96+
{
97+
std::same_as<T> decltype(auto) y = --a;
98+
assert(y == &t[1]);
99+
assert(p == &t[1]);
100+
ASSERT_NOEXCEPT(--a);
101+
}
102+
103+
{
104+
std::same_as<T> decltype(auto) y = a++;
105+
assert(y == &t[1]);
106+
assert(p == &t[2]);
107+
ASSERT_NOEXCEPT(a++);
108+
}
109+
110+
{
111+
std::same_as<T> decltype(auto) y = a--;
112+
assert(y == &t[2]);
113+
assert(p == &t[1]);
114+
ASSERT_NOEXCEPT(a--);
115+
}
116+
} else {
117+
static_assert(std::is_void_v<T>);
82118
}
83119
}
84120
};

0 commit comments

Comments
 (0)