[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