Skip to content

Commit afe849f

Browse files
committed
Follow pattern suggested by Louis in the tests
1 parent d84ec1f commit afe849f

File tree

6 files changed

+393
-369
lines changed

6 files changed

+393
-369
lines changed

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

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,53 @@
2020
#include "test_helper.h"
2121
#include "test_macros.h"
2222

23-
template <typename U>
23+
template <typename T>
2424
struct TestAssign {
2525
void operator()() const {
26-
static_assert(std::is_nothrow_assignable_v<std::atomic_ref<U>, U>);
27-
do_test<U>();
28-
do_test_atomic<U>();
29-
static_assert(!std::is_assignable_v<std::atomic_ref<U const>, U>);
30-
if constexpr (std::atomic_ref<U>::is_always_lock_free) {
31-
static_assert(std::is_nothrow_assignable_v<std::atomic_ref<U volatile>, U>);
32-
do_test<U volatile>();
33-
do_test_atomic<U volatile>();
34-
static_assert(!std::is_assignable_v<std::atomic_ref<U const volatile>, U>);
35-
}
36-
}
26+
using Unqualified = std::remove_cv_t<T>;
27+
static_assert(std::is_assignable_v<std::atomic_ref<T>, Unqualified> == !std::is_const_v<T>);
3728

38-
template <typename T>
39-
void do_test() const {
40-
T x(T(1));
41-
std::atomic_ref<T> const a(x);
29+
if constexpr (!std::is_const_v<T>) {
30+
{
31+
T x(Unqualified(1));
32+
std::atomic_ref<T> const a(x);
4233

43-
std::same_as<std::remove_cv_t<T>> decltype(auto) y = (a = T(2));
44-
assert(y == std::remove_cv_t<T>(2));
45-
assert(const_cast<std::remove_cv_t<T> const&>(x) == std::remove_cv_t<T>(2));
34+
std::same_as<Unqualified> decltype(auto) y = (a = Unqualified(2));
35+
assert(y == Unqualified(2));
36+
assert(const_cast<Unqualified const&>(x) == Unqualified(2));
4637

47-
ASSERT_NOEXCEPT(a = T(0));
38+
ASSERT_NOEXCEPT(a = Unqualified(0));
39+
static_assert(std::is_nothrow_assignable_v<std::atomic_ref<T>, Unqualified>);
40+
static_assert(!std::is_copy_assignable_v<std::atomic_ref<T>>);
41+
}
4842

49-
static_assert(!std::is_copy_assignable_v<std::atomic_ref<T>>);
43+
{
44+
auto assign = [](std::atomic_ref<T> const& y, T const&, T const& new_val) {
45+
y = const_cast<Unqualified const&>(new_val);
46+
};
47+
auto load = [](std::atomic_ref<T> const& y) { return y.load(); };
48+
test_seq_cst<T>(assign, load);
49+
}
50+
}
5051
}
52+
};
5153

52-
template <typename T>
53-
void do_test_atomic() const {
54-
{
55-
auto assign = [](std::atomic_ref<T> const& y, T const&, T const& new_val) {
56-
y = const_cast<std::remove_cv_t<T> const&>(new_val);
57-
};
58-
auto load = [](std::atomic_ref<T> const& y) { return y.load(); };
59-
test_seq_cst<T>(assign, load);
54+
template <template <class...> class F>
55+
struct CallWithCVQualifiers {
56+
template <class T>
57+
struct apply {
58+
void operator()() const {
59+
F<T>()();
60+
F<T const>()();
61+
if constexpr (std::atomic_ref<T>::is_always_lock_free) {
62+
F<T volatile>()();
63+
F<T const volatile>()();
64+
}
6065
}
61-
}
66+
};
6267
};
6368

6469
int main(int, char**) {
65-
TestEachAtomicType<TestAssign>()();
70+
TestEachAtomicType<CallWithCVQualifiers<TestAssign>::apply>()();
6671
return 0;
6772
}

0 commit comments

Comments
 (0)