[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