[libcxx-commits] [libcxx] [lib++][test] Align `atomic_ref` underlying variable as required (PR #179780)
Alex Guteniev via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Feb 4 12:57:03 PST 2026
https://github.com/AlexGuteniev created https://github.com/llvm/llvm-project/pull/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.
>From 8b260eb2b6759ba5bd1f840740e0f162783b53b7 Mon Sep 17 00:00:00 2001
From: Alex Guteniev <gutenev at gmail.com>
Date: Wed, 4 Feb 2026 22:51:44 +0200
Subject: [PATCH] Align atomic_ref underlying variable as required
---
libcxx/test/std/atomics/atomics.ref/address.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/assign.pass.cpp | 2 +-
.../std/atomics/atomics.ref/bitwise_and_assign.pass.cpp | 2 +-
.../std/atomics/atomics.ref/bitwise_or_assign.pass.cpp | 2 +-
.../std/atomics/atomics.ref/bitwise_xor_assign.pass.cpp | 2 +-
.../atomics/atomics.ref/compare_exchange_strong.pass.cpp | 6 +++---
.../atomics/atomics.ref/compare_exchange_weak.pass.cpp | 4 ++--
libcxx/test/std/atomics/atomics.ref/convert.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/ctor.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/deduction.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/exchange.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/fetch_add.pass.cpp | 4 ++--
libcxx/test/std/atomics/atomics.ref/fetch_and.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/fetch_or.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/fetch_sub.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/fetch_xor.pass.cpp | 2 +-
.../std/atomics/atomics.ref/increment_decrement.pass.cpp | 4 ++--
.../std/atomics/atomics.ref/is_always_lock_free.pass.cpp | 8 ++++----
libcxx/test/std/atomics/atomics.ref/load.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/notify_all.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/notify_one.pass.cpp | 2 +-
.../atomics/atomics.ref/operator_minus_equals.pass.cpp | 4 ++--
.../std/atomics/atomics.ref/operator_plus_equals.pass.cpp | 4 ++--
.../atomics.ref/requires-trivially-copyable.verify.cpp | 3 ++-
libcxx/test/std/atomics/atomics.ref/store.pass.cpp | 2 +-
libcxx/test/std/atomics/atomics.ref/test_helper.h | 6 +++---
libcxx/test/std/atomics/atomics.ref/wait.pass.cpp | 2 +-
27 files changed, 40 insertions(+), 39 deletions(-)
diff --git a/libcxx/test/std/atomics/atomics.ref/address.pass.cpp b/libcxx/test/std/atomics/atomics.ref/address.pass.cpp
index e0db6a93e2eda..3e84342c8f658 100644
--- a/libcxx/test/std/atomics/atomics.ref/address.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/address.pass.cpp
@@ -20,7 +20,7 @@
template <typename T>
struct TestAddress {
void operator()() const {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
const std::atomic_ref<T> a(x);
std::same_as<T*> decltype(auto) p = a.address();
diff --git a/libcxx/test/std/atomics/atomics.ref/assign.pass.cpp b/libcxx/test/std/atomics/atomics.ref/assign.pass.cpp
index 9b2f9042e9836..6620da217fe3a 100644
--- a/libcxx/test/std/atomics/atomics.ref/assign.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/assign.pass.cpp
@@ -24,7 +24,7 @@ template <typename T>
struct TestAssign {
void operator()() const {
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a = T(2));
diff --git a/libcxx/test/std/atomics/atomics.ref/bitwise_and_assign.pass.cpp b/libcxx/test/std/atomics/atomics.ref/bitwise_and_assign.pass.cpp
index bfbd69f93845e..10155ce5becb5 100644
--- a/libcxx/test/std/atomics/atomics.ref/bitwise_and_assign.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/bitwise_and_assign.pass.cpp
@@ -32,7 +32,7 @@ struct TestBitwiseAndAssign {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a &= T(1));
diff --git a/libcxx/test/std/atomics/atomics.ref/bitwise_or_assign.pass.cpp b/libcxx/test/std/atomics/atomics.ref/bitwise_or_assign.pass.cpp
index e424da7167518..4d9da390b337d 100644
--- a/libcxx/test/std/atomics/atomics.ref/bitwise_or_assign.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/bitwise_or_assign.pass.cpp
@@ -32,7 +32,7 @@ struct TestBitwiseOrAssign {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a |= T(2));
diff --git a/libcxx/test/std/atomics/atomics.ref/bitwise_xor_assign.pass.cpp b/libcxx/test/std/atomics/atomics.ref/bitwise_xor_assign.pass.cpp
index 8a90d241e88e1..6a5b3d77d53a1 100644
--- a/libcxx/test/std/atomics/atomics.ref/bitwise_xor_assign.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/bitwise_xor_assign.pass.cpp
@@ -32,7 +32,7 @@ struct TestBitwiseXorAssign {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a ^= T(2));
diff --git a/libcxx/test/std/atomics/atomics.ref/compare_exchange_strong.pass.cpp b/libcxx/test/std/atomics/atomics.ref/compare_exchange_strong.pass.cpp
index 90aa5ea5b6df4..17a9cb877ca25 100644
--- a/libcxx/test/std/atomics/atomics.ref/compare_exchange_strong.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/compare_exchange_strong.pass.cpp
@@ -28,7 +28,7 @@ template <typename T>
struct TestCompareExchangeStrong {
void operator()() const {
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
T t(T(1));
@@ -44,7 +44,7 @@ struct TestCompareExchangeStrong {
ASSERT_NOEXCEPT(a.compare_exchange_strong(t, T(2)));
}
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
T t(T(1));
@@ -60,7 +60,7 @@ struct TestCompareExchangeStrong {
ASSERT_NOEXCEPT(a.compare_exchange_strong(t, T(2), std::memory_order_seq_cst));
}
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
T t(T(1));
diff --git a/libcxx/test/std/atomics/atomics.ref/compare_exchange_weak.pass.cpp b/libcxx/test/std/atomics/atomics.ref/compare_exchange_weak.pass.cpp
index 99c1385a2fe0b..ce3d5192f9b81 100644
--- a/libcxx/test/std/atomics/atomics.ref/compare_exchange_weak.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/compare_exchange_weak.pass.cpp
@@ -28,7 +28,7 @@ template <typename T>
struct TestCompareExchangeWeak {
void operator()() const {
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
T t(T(1));
@@ -44,7 +44,7 @@ struct TestCompareExchangeWeak {
ASSERT_NOEXCEPT(a.compare_exchange_weak(t, T(2)));
}
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
T t(T(1));
diff --git a/libcxx/test/std/atomics/atomics.ref/convert.pass.cpp b/libcxx/test/std/atomics/atomics.ref/convert.pass.cpp
index 2a58a5ea6ae2a..5bbfe228c805f 100644
--- a/libcxx/test/std/atomics/atomics.ref/convert.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/convert.pass.cpp
@@ -24,7 +24,7 @@ struct TestConvert {
void operator()() const {
T x(T(1));
- T copy = x;
+ alignas(std::atomic_ref<T>::required_alignment) T copy = x;
std::atomic_ref<T> const a(copy);
T converted = a;
diff --git a/libcxx/test/std/atomics/atomics.ref/ctor.pass.cpp b/libcxx/test/std/atomics/atomics.ref/ctor.pass.cpp
index d6c647406abf5..9fb06de357eb4 100644
--- a/libcxx/test/std/atomics/atomics.ref/ctor.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/ctor.pass.cpp
@@ -25,7 +25,7 @@ struct TestCtor {
static_assert(!std::is_convertible_v<T, std::atomic_ref<T>>);
static_assert(std::is_constructible_v<std::atomic_ref<T>, T&>);
- T x(T(0));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(0));
std::atomic_ref<T> a(x);
(void)a;
}
diff --git a/libcxx/test/std/atomics/atomics.ref/deduction.pass.cpp b/libcxx/test/std/atomics/atomics.ref/deduction.pass.cpp
index 24a399ac4711e..9a559f9a23f4d 100644
--- a/libcxx/test/std/atomics/atomics.ref/deduction.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/deduction.pass.cpp
@@ -21,7 +21,7 @@
template <typename T>
struct TestDeduction {
void operator()() const {
- T x(T(0));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(0));
std::atomic_ref a(x);
ASSERT_SAME_TYPE(decltype(a), std::atomic_ref<T>);
}
diff --git a/libcxx/test/std/atomics/atomics.ref/exchange.pass.cpp b/libcxx/test/std/atomics/atomics.ref/exchange.pass.cpp
index c2afa6b8dfd07..bd89ad1e3d245 100644
--- a/libcxx/test/std/atomics/atomics.ref/exchange.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/exchange.pass.cpp
@@ -24,7 +24,7 @@ template <typename T>
struct TestExchange {
void operator()() const {
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_add.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_add.pass.cpp
index 65a457a6129d5..93cda4f72ec73 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_add.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_add.pass.cpp
@@ -38,7 +38,7 @@ template <typename T>
struct TestFetchAdd {
void operator()() const {
if constexpr (std::is_arithmetic_v<T>) {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
@@ -57,7 +57,7 @@ struct TestFetchAdd {
} else if constexpr (std::is_pointer_v<T>) {
using U = std::remove_pointer_t<T>;
U t[9] = {};
- T p{&t[1]};
+ alignas(std::atomic_ref<T>::required_alignment) T p{&t[1]};
std::atomic_ref<T> const a(p);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_and.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_and.pass.cpp
index 9d1fa846a9e66..b0256e3d71dc3 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_and.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_and.pass.cpp
@@ -35,7 +35,7 @@ struct TestFetchAnd {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_or.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_or.pass.cpp
index 51500e3a62bea..607eb575389e7 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_or.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_or.pass.cpp
@@ -35,7 +35,7 @@ struct TestFetchOr {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_sub.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_sub.pass.cpp
index ab89ebdbde261..ae42c4ae08fe9 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_sub.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_sub.pass.cpp
@@ -38,7 +38,7 @@ template <typename T>
struct TestFetchSub {
void operator()() const {
if constexpr (std::is_arithmetic_v<T>) {
- T x(T(7));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(7));
std::atomic_ref<T> const a(x);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_xor.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_xor.pass.cpp
index 35437cbba3135..f33d0cb7361f5 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_xor.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_xor.pass.cpp
@@ -35,7 +35,7 @@ struct TestFetchXor {
void operator()() const {
static_assert(std::is_integral_v<T>);
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
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 15bf0ecda5363..f126b46da10d0 100644
--- a/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/increment_decrement.pass.cpp
@@ -49,7 +49,7 @@ template <typename T>
struct TestIncrementDecrement {
void operator()() const {
if constexpr (std::is_integral_v<T>) {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
@@ -82,7 +82,7 @@ struct TestIncrementDecrement {
} else if constexpr (std::is_pointer_v<T>) {
using U = std::remove_pointer_t<T>;
U t[9] = {};
- T p{&t[1]};
+ alignas(std::atomic_ref<T>::required_alignment) T p{&t[1]};
std::atomic_ref<T> const a(p);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/is_always_lock_free.pass.cpp b/libcxx/test/std/atomics/atomics.ref/is_always_lock_free.pass.cpp
index 78e46c0397951..678085210efff 100644
--- a/libcxx/test/std/atomics/atomics.ref/is_always_lock_free.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/is_always_lock_free.pass.cpp
@@ -60,16 +60,16 @@ void check_always_lock_free(std::atomic_ref<T> const& a) {
} while (0)
void test() {
- char c = 'x';
+ alignas(std::atomic_ref<char>::required_alignment) char c = 'x';
check_always_lock_free(std::atomic_ref<char>(c));
- int i = 0;
+ alignas(std::atomic_ref<int>::required_alignment) int i = 0;
check_always_lock_free(std::atomic_ref<int>(i));
- float f = 0.f;
+ alignas(std::atomic_ref<float>::required_alignment) float f = 0.f;
check_always_lock_free(std::atomic_ref<float>(f));
- int* p = &i;
+ alignas(std::atomic_ref<int*>::required_alignment) int* p = &i;
check_always_lock_free(std::atomic_ref<int*>(p));
CHECK_ALWAYS_LOCK_FREE(struct Empty{});
diff --git a/libcxx/test/std/atomics/atomics.ref/load.pass.cpp b/libcxx/test/std/atomics/atomics.ref/load.pass.cpp
index feed0fbaed842..521461e3e6c32 100644
--- a/libcxx/test/std/atomics/atomics.ref/load.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/load.pass.cpp
@@ -23,7 +23,7 @@
template <typename T>
struct TestLoad {
void operator()() const {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
{
diff --git a/libcxx/test/std/atomics/atomics.ref/notify_all.pass.cpp b/libcxx/test/std/atomics/atomics.ref/notify_all.pass.cpp
index 6b4702595e68a..c91030b6b967d 100644
--- a/libcxx/test/std/atomics/atomics.ref/notify_all.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/notify_all.pass.cpp
@@ -25,7 +25,7 @@
template <typename T>
struct TestNotifyAll {
void operator()() const {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
bool done = false;
diff --git a/libcxx/test/std/atomics/atomics.ref/notify_one.pass.cpp b/libcxx/test/std/atomics/atomics.ref/notify_one.pass.cpp
index 6ad9698b46e8f..a3240004cad94 100644
--- a/libcxx/test/std/atomics/atomics.ref/notify_one.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/notify_one.pass.cpp
@@ -25,7 +25,7 @@
template <typename T>
struct TestNotifyOne {
void operator()() const {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::thread t = support::make_test_thread([&]() {
diff --git a/libcxx/test/std/atomics/atomics.ref/operator_minus_equals.pass.cpp b/libcxx/test/std/atomics/atomics.ref/operator_minus_equals.pass.cpp
index 502eff772ab76..e6e23283255b6 100644
--- a/libcxx/test/std/atomics/atomics.ref/operator_minus_equals.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/operator_minus_equals.pass.cpp
@@ -34,7 +34,7 @@ template <typename T>
struct TestOperatorMinusEquals {
void operator()() const {
if constexpr (std::is_arithmetic_v<T>) {
- T x(T(3));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(3));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a -= T(2));
@@ -44,7 +44,7 @@ struct TestOperatorMinusEquals {
} else if constexpr (std::is_pointer_v<T>) {
using U = std::remove_pointer_t<T>;
U t[9] = {};
- T p{&t[3]};
+ alignas(std::atomic_ref<T>::required_alignment) T p{&t[3]};
std::atomic_ref<T> const a(p);
std::same_as<T> decltype(auto) y = (a -= 2);
diff --git a/libcxx/test/std/atomics/atomics.ref/operator_plus_equals.pass.cpp b/libcxx/test/std/atomics/atomics.ref/operator_plus_equals.pass.cpp
index 1f287f6945bda..17331aa135883 100644
--- a/libcxx/test/std/atomics/atomics.ref/operator_plus_equals.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/operator_plus_equals.pass.cpp
@@ -34,7 +34,7 @@ template <typename T>
struct TestOperatorPlusEquals {
void operator()() const {
if constexpr (std::is_arithmetic_v<T>) {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
std::same_as<T> decltype(auto) y = (a += T(2));
@@ -44,7 +44,7 @@ struct TestOperatorPlusEquals {
} else if constexpr (std::is_pointer_v<T>) {
using U = std::remove_pointer_t<T>;
U t[9] = {};
- T p{&t[1]};
+ alignas(std::atomic_ref<T>::required_alignment) T p{&t[1]};
std::atomic_ref<T> const a(p);
std::same_as<T> decltype(auto) y = (a += 2);
diff --git a/libcxx/test/std/atomics/atomics.ref/requires-trivially-copyable.verify.cpp b/libcxx/test/std/atomics/atomics.ref/requires-trivially-copyable.verify.cpp
index 9a8b036ffd1f8..0f4bcf90377e0 100644
--- a/libcxx/test/std/atomics/atomics.ref/requires-trivially-copyable.verify.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/requires-trivially-copyable.verify.cpp
@@ -20,7 +20,8 @@ void trivially_copyable() {
struct X {
X() = default;
X(X const&) {} // -> not trivially copyable
- } x;
+ };
+ alignas(std::atomic_ref<X>::required_alignment) X x;
// expected-error-re@*:* {{static assertion failed {{.*}}atomic_ref<T> requires that 'T' be a trivially copyable type}}
std::atomic_ref<X> r(x);
}
diff --git a/libcxx/test/std/atomics/atomics.ref/store.pass.cpp b/libcxx/test/std/atomics/atomics.ref/store.pass.cpp
index ea01a3d02a34f..e4632ec192b4d 100644
--- a/libcxx/test/std/atomics/atomics.ref/store.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/store.pass.cpp
@@ -22,7 +22,7 @@
template <typename T>
struct TestStore {
void operator()() const {
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
a.store(T(2));
diff --git a/libcxx/test/std/atomics/atomics.ref/test_helper.h b/libcxx/test/std/atomics/atomics.ref/test_helper.h
index 225a70c5a16ca..9e2c1d5e24239 100644
--- a/libcxx/test/std/atomics/atomics.ref/test_helper.h
+++ b/libcxx/test/std/atomics/atomics.ref/test_helper.h
@@ -48,9 +48,9 @@ void test_seq_cst(StoreOp store_op, LoadOp load_op) {
T old_value(make_value<T>(0));
T new_value(make_value<T>(1));
- T copy_x = old_value;
+ alignas(std::atomic_ref<T>::required_alignment) T copy_x = old_value;
std::atomic_ref<T> const x(copy_x);
- T copy_y = old_value;
+ alignas(std::atomic_ref<T>::required_alignment) T copy_y = old_value;
std::atomic_ref<T> const y(copy_y);
std::atomic_bool x_updated_first(false);
@@ -101,7 +101,7 @@ void test_acquire_release(StoreOp store_op, LoadOp load_op) {
T old_value(make_value<T>(0));
T new_value(make_value<T>(1));
- T copy = old_value;
+ alignas(std::atomic_ref<T>::required_alignment) T copy = old_value;
std::atomic_ref<T> const at(copy);
int non_atomic = 5;
diff --git a/libcxx/test/std/atomics/atomics.ref/wait.pass.cpp b/libcxx/test/std/atomics/atomics.ref/wait.pass.cpp
index fc8f6ef59ad2e..28dc02499613c 100644
--- a/libcxx/test/std/atomics/atomics.ref/wait.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/wait.pass.cpp
@@ -28,7 +28,7 @@ template <typename T>
struct TestWait {
void operator()() const {
{
- T x(T(1));
+ alignas(std::atomic_ref<T>::required_alignment) T x(T(1));
std::atomic_ref<T> const a(x);
assert(a.load() == T(1));
More information about the libcxx-commits
mailing list