Skip to content

Commit 39d60bb

Browse files
authored
[lib++][test] Align atomic_ref underlying variable as required (llvm#179780)
There is one pre-existing `alignas(std::atomic_ref<T>::required_alignment)`: https://github.com/llvm/llvm-project/blob/1f8a3f2fdbf51cbba4635ef05e8139039a105c2c/libcxx/test/std/atomics/atomics.ref/is_always_lock_free.pass.cpp#L54-L60 This PR adds more of them. On 32-bit Windows ABI just creating a variable on stack is not enough, so 32-bit MSVC fails these tests before the fix.
1 parent c7dd96e commit 39d60bb

27 files changed

Lines changed: 40 additions & 39 deletions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
template <typename T>
2121
struct TestAddress {
2222
void operator()() const {
23-
T x(T(1));
23+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
2424
const std::atomic_ref<T> a(x);
2525

2626
std::same_as<T*> decltype(auto) p = a.address();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ template <typename T>
2424
struct TestAssign {
2525
void operator()() const {
2626
{
27-
T x(T(1));
27+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
2828
std::atomic_ref<T> const a(x);
2929

3030
std::same_as<T> decltype(auto) y = (a = T(2));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct TestBitwiseAndAssign {
3232
void operator()() const {
3333
static_assert(std::is_integral_v<T>);
3434

35-
T x(T(1));
35+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
3636
std::atomic_ref<T> const a(x);
3737

3838
std::same_as<T> decltype(auto) y = (a &= T(1));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct TestBitwiseOrAssign {
3232
void operator()() const {
3333
static_assert(std::is_integral_v<T>);
3434

35-
T x(T(1));
35+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
3636
std::atomic_ref<T> const a(x);
3737

3838
std::same_as<T> decltype(auto) y = (a |= T(2));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct TestBitwiseXorAssign {
3232
void operator()() const {
3333
static_assert(std::is_integral_v<T>);
3434

35-
T x(T(1));
35+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
3636
std::atomic_ref<T> const a(x);
3737

3838
std::same_as<T> decltype(auto) y = (a ^= T(2));

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ template <typename T>
2828
struct TestCompareExchangeStrong {
2929
void operator()() const {
3030
{
31-
T x(T(1));
31+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
3232
std::atomic_ref<T> const a(x);
3333

3434
T t(T(1));
@@ -44,7 +44,7 @@ struct TestCompareExchangeStrong {
4444
ASSERT_NOEXCEPT(a.compare_exchange_strong(t, T(2)));
4545
}
4646
{
47-
T x(T(1));
47+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
4848
std::atomic_ref<T> const a(x);
4949

5050
T t(T(1));
@@ -60,7 +60,7 @@ struct TestCompareExchangeStrong {
6060
ASSERT_NOEXCEPT(a.compare_exchange_strong(t, T(2), std::memory_order_seq_cst));
6161
}
6262
{
63-
T x(T(1));
63+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
6464
std::atomic_ref<T> const a(x);
6565

6666
T t(T(1));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ template <typename T>
2828
struct TestCompareExchangeWeak {
2929
void operator()() const {
3030
{
31-
T x(T(1));
31+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
3232
std::atomic_ref<T> const a(x);
3333

3434
T t(T(1));
@@ -44,7 +44,7 @@ struct TestCompareExchangeWeak {
4444
ASSERT_NOEXCEPT(a.compare_exchange_weak(t, T(2)));
4545
}
4646
{
47-
T x(T(1));
47+
alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
4848
std::atomic_ref<T> const a(x);
4949

5050
T t(T(1));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct TestConvert {
2424
void operator()() const {
2525
T x(T(1));
2626

27-
T copy = x;
27+
alignas(std::atomic_ref<T>::required_alignment) T copy = x;
2828
std::atomic_ref<T> const a(copy);
2929

3030
T converted = a;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct TestCtor {
2525
static_assert(!std::is_convertible_v<T, std::atomic_ref<T>>);
2626
static_assert(std::is_constructible_v<std::atomic_ref<T>, T&>);
2727

28-
T x(T(0));
28+
alignas(std::atomic_ref<T>::required_alignment) T x(T(0));
2929
std::atomic_ref<T> a(x);
3030
(void)a;
3131
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
template <typename T>
2222
struct TestDeduction {
2323
void operator()() const {
24-
T x(T(0));
24+
alignas(std::atomic_ref<T>::required_alignment) T x(T(0));
2525
std::atomic_ref a(x);
2626
ASSERT_SAME_TYPE(decltype(a), std::atomic_ref<T>);
2727
}

0 commit comments

Comments
 (0)