[libcxx-commits] [libcxx] [libc++] Add `-Watomic-memory-ordering` diagnostic tests for `atomic_ref` (PR #130206)

Damien L-G via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 10 04:35:12 PDT 2025


https://github.com/dalg24 updated https://github.com/llvm/llvm-project/pull/130206

>From d14e44624a0ea1f9e500546cc29bc7da6f0de5ba Mon Sep 17 00:00:00 2001
From: Damien L-G <dalg24 at gmail.com>
Date: Thu, 6 Mar 2025 08:09:31 -0500
Subject: [PATCH 1/3] Drop `assert.` prefix in tests for atomic_ref
 preconditions

---
 ..._exchange_strong.pass.cpp => compare_exchange_strong.pass.cpp} | 0
 ...pare_exchange_weak.pass.cpp => compare_exchange_weak.pass.cpp} | 0
 .../atomics/atomics.ref/{assert.ctor.pass.cpp => ctor.pass.cpp}   | 0
 .../atomics/atomics.ref/{assert.load.pass.cpp => load.pass.cpp}   | 0
 .../atomics/atomics.ref/{assert.store.pass.cpp => store.pass.cpp} | 0
 .../atomics/atomics.ref/{assert.wait.pass.cpp => wait.pass.cpp}   | 0
 6 files changed, 0 insertions(+), 0 deletions(-)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.compare_exchange_strong.pass.cpp => compare_exchange_strong.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.compare_exchange_weak.pass.cpp => compare_exchange_weak.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.ctor.pass.cpp => ctor.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.load.pass.cpp => load.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.store.pass.cpp => store.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{assert.wait.pass.cpp => wait.pass.cpp} (100%)

diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_strong.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_strong.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_weak.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_weak.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.ctor.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/ctor.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.ctor.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/ctor.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.load.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/load.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.load.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/load.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.store.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/store.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.store.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/store.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/assert.wait.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/wait.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/assert.wait.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/wait.pass.cpp

>From 8ef8460a19bb3a04b7e85dc853c2b7c1062a2255 Mon Sep 17 00:00:00 2001
From: Damien L-G <dalg24 at gmail.com>
Date: Thu, 6 Mar 2025 18:49:24 -0500
Subject: [PATCH 2/3] Add -Watomic-memory-ordering diagnostic tests for
 atomic_ref

---
 .../compare_exchange_strong.verify.cpp        | 38 +++++++++++++++++++
 .../compare_exchange_weak.verify.cpp          | 38 +++++++++++++++++++
 .../atomics/atomics.ref/load.verify.cpp       | 33 ++++++++++++++++
 .../atomics/atomics.ref/store.verify.cpp      | 35 +++++++++++++++++
 .../atomics/atomics.ref/wait.verify.cpp       | 35 +++++++++++++++++
 5 files changed, 179 insertions(+)
 create mode 100644 libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.verify.cpp
 create mode 100644 libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.verify.cpp
 create mode 100644 libcxx/test/libcxx/atomics/atomics.ref/load.verify.cpp
 create mode 100644 libcxx/test/libcxx/atomics/atomics.ref/store.verify.cpp
 create mode 100644 libcxx/test/libcxx/atomics/atomics.ref/wait.verify.cpp

diff --git a/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.verify.cpp b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.verify.cpp
new file mode 100644
index 0000000000000..34ff5736c3c64
--- /dev/null
+++ b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.verify.cpp
@@ -0,0 +1,38 @@
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: diagnose-if-support
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <atomic>
+
+// bool compare_exchange_strong(T& expected, T desired, memory_order success,
+// memory_order failure) const noexcept;
+//
+// Preconditions: failure is memory_order::relaxed, memory_order::consume,
+// memory_order::acquire, or memory_order::seq_cst.
+
+#include <atomic>
+
+void test() {
+  using T = int;
+
+  T x(T(1));
+  std::atomic_ref const a(x);
+
+  T expected(T(2));
+  T const desired(T(3));
+  std::memory_order const success = std::memory_order_relaxed;
+  // clang-format off
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_relaxed);
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_consume);
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_acquire);
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_seq_cst);
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
+  a.compare_exchange_strong(expected, desired, success, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
+  // clang-format on
+}
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.verify.cpp b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.verify.cpp
new file mode 100644
index 0000000000000..77b5a5c44d5cc
--- /dev/null
+++ b/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.verify.cpp
@@ -0,0 +1,38 @@
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: diagnose-if-support
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <atomic>
+
+// bool compare_exchange_weak(T& expected, T desired, memory_order success,
+// memory_order failure) const noexcept;
+//
+// Preconditions: failure is memory_order::relaxed, memory_order::consume,
+// memory_order::acquire, or memory_order::seq_cst.
+
+#include <atomic>
+
+void test() {
+  using T = int;
+
+  T x(T(42));
+  std::atomic_ref const a(x);
+
+  T expected(T(2));
+  T const desired(T(3));
+  std::memory_order const success = std::memory_order_relaxed;
+  // clang-format off
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_relaxed);
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_consume);
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_acquire);
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_seq_cst);
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
+  a.compare_exchange_weak(expected, desired, success, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
+  // clang-format on
+}
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/load.verify.cpp b/libcxx/test/libcxx/atomics/atomics.ref/load.verify.cpp
new file mode 100644
index 0000000000000..b2192a500833f
--- /dev/null
+++ b/libcxx/test/libcxx/atomics/atomics.ref/load.verify.cpp
@@ -0,0 +1,33 @@
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: diagnose-if-support
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <atomic>
+
+// T load(memory_order order = memory_order::seq_cst) const noexcept;
+//
+// Preconditions: order is memory_order::relaxed, memory_order::consume, memory_order::acquire, or memory_order::seq_cst.
+
+#include <atomic>
+
+void test() {
+  using T = int;
+
+  T x(T(1));
+  std::atomic_ref const a(x);
+
+  // clang-format off
+  (void)a.load(std::memory_order_relaxed);
+  (void)a.load(std::memory_order_consume);
+  (void)a.load(std::memory_order_acquire);
+  (void)a.load(std::memory_order_seq_cst);
+  (void)a.load(std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
+  (void)a.load(std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
+  // clang-format on
+}
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/store.verify.cpp b/libcxx/test/libcxx/atomics/atomics.ref/store.verify.cpp
new file mode 100644
index 0000000000000..ef97a3296f374
--- /dev/null
+++ b/libcxx/test/libcxx/atomics/atomics.ref/store.verify.cpp
@@ -0,0 +1,35 @@
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: diagnose-if-support
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <atomic>
+
+// void store(T desired, memory_order order = memory_order::seq_cst) const noexcept;
+//
+// Preconditions: order is memory_order::relaxed, memory_order::release, or memory_order::seq_cst.
+
+#include <atomic>
+
+void test() {
+  using T = int;
+
+  T x(T(1));
+  std::atomic_ref const a(x);
+
+  T const desired(T(2));
+
+  // clang-format off
+  a.store(desired, std::memory_order_relaxed);
+  a.store(desired, std::memory_order_release);
+  a.store(desired, std::memory_order_seq_cst);
+  a.store(desired, std::memory_order_consume); // expected-warning {{memory order argument to atomic operation is invalid}}
+  a.store(desired, std::memory_order_acquire); // expected-warning {{memory order argument to atomic operation is invalid}}
+  a.store(desired, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
+  // clang-format on
+}
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/wait.verify.cpp b/libcxx/test/libcxx/atomics/atomics.ref/wait.verify.cpp
new file mode 100644
index 0000000000000..d30a55bae10f4
--- /dev/null
+++ b/libcxx/test/libcxx/atomics/atomics.ref/wait.verify.cpp
@@ -0,0 +1,35 @@
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: diagnose-if-support
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// <atomic>
+
+// void wait(T old, memory_order order = memory_order::seq_cst) const noexcept;
+//
+// Preconditions: order is memory_order::relaxed, memory_order::consume, memory_order::acquire, or memory_order::seq_cst.
+
+#include <atomic>
+
+void test() {
+  using T = int;
+
+  T x(T(1));
+  std::atomic_ref const a(x);
+
+  T const old(T(2));
+
+  // clang-format off
+  a.wait(old, std::memory_order_relaxed);
+  a.wait(old, std::memory_order_consume);
+  a.wait(old, std::memory_order_acquire);
+  a.wait(old, std::memory_order_seq_cst);
+  a.wait(old, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
+  a.wait(old, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
+  // clang-format on
+}

>From a2afe6442b1691ae4511e7104b03c8dfa3429175 Mon Sep 17 00:00:00 2001
From: Damien L-G <dalg24 at gmail.com>
Date: Mon, 10 Mar 2025 07:34:41 -0400
Subject: [PATCH 3/3] Revert "Drop `assert.` prefix in tests for atomic_ref
 preconditions"

This reverts commit d14e44624a0ea1f9e500546cc29bc7da6f0de5ba.
---
 ...ge_strong.pass.cpp => assert.compare_exchange_strong.pass.cpp} | 0
 ...change_weak.pass.cpp => assert.compare_exchange_weak.pass.cpp} | 0
 .../atomics/atomics.ref/{ctor.pass.cpp => assert.ctor.pass.cpp}   | 0
 .../atomics/atomics.ref/{load.pass.cpp => assert.load.pass.cpp}   | 0
 .../atomics/atomics.ref/{store.pass.cpp => assert.store.pass.cpp} | 0
 .../atomics/atomics.ref/{wait.pass.cpp => assert.wait.pass.cpp}   | 0
 6 files changed, 0 insertions(+), 0 deletions(-)
 rename libcxx/test/libcxx/atomics/atomics.ref/{compare_exchange_strong.pass.cpp => assert.compare_exchange_strong.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{compare_exchange_weak.pass.cpp => assert.compare_exchange_weak.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{ctor.pass.cpp => assert.ctor.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{load.pass.cpp => assert.load.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{store.pass.cpp => assert.store.pass.cpp} (100%)
 rename libcxx/test/libcxx/atomics/atomics.ref/{wait.pass.cpp => assert.wait.pass.cpp} (100%)

diff --git a/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_strong.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_strong.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_strong.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_weak.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/compare_exchange_weak.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.compare_exchange_weak.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/ctor.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.ctor.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/ctor.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.ctor.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/load.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.load.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/load.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.load.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/store.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.store.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/store.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.store.pass.cpp
diff --git a/libcxx/test/libcxx/atomics/atomics.ref/wait.pass.cpp b/libcxx/test/libcxx/atomics/atomics.ref/assert.wait.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/atomics/atomics.ref/wait.pass.cpp
rename to libcxx/test/libcxx/atomics/atomics.ref/assert.wait.pass.cpp



More information about the libcxx-commits mailing list