[libcxx-commits] [libcxx] [libc++][NFC] Refactor `[[nodiscard]]` tests (PR #173451)
Hristo Hristov via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jan 6 12:54:38 PST 2026
https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/173451
>From 0794a4d87d6ae33331658caa733e1071e72a2d3e Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Wed, 24 Dec 2025 07:32:25 +0200
Subject: [PATCH 1/6] [libc++][NFC] Refactor `[[nodiscard]]` tests
Originally some `[[nodiscard]]` tests were implemented in `*/test/libcxx/diagnostics`. The Standard has a library `Diagnostics` and this folder should be reserved for it by convention. Many new tetss were added to their respective subfolders. This patch moves around the already implemented `[[nodiscard]]` tests to their respective folders where they belong and standardizes the name to `nodiscard.verify.cpp` whereever possible.
N.B. This refactors only tests, which were merged. The remaining will be moved in a future patch to reduce merge conflicts on their own.
---
.../nodiscard.verify.cpp} | 0
.../test/libcxx/atomics/nodiscard.verify.cpp | 84 +++++++++++--------
.../associative/map}/map.nodiscard.verify.cpp | 0
.../map}/multimap.nodiscard.verify.cpp | 0
.../set}/multiset.nodiscard.verify.cpp | 0
.../associative/set}/set.nodiscard.verify.cpp | 0
.../flat.map/nodiscard.verify.cpp} | 0
.../flat.multimap/nodiscard.verify.cpp} | 0
.../flat.multiset/nodiscard.verify.cpp} | 0
.../flat.set/nodiscard.verify.cpp} | 0
.../queue/nodiscard.verify.cpp} | 0
.../stack/nodiscard.verify.cpp} | 0
.../sequences/array/nodiscard.verify.cpp} | 0
.../sequences/deque/nodiscard.verify.cpp} | 0
.../forwardlist/nodiscard.verify.cpp} | 0
.../sequences/list/nodiscard.verify.cpp} | 0
.../sequences/vector/nodiscard.verify.cpp} | 0
.../unord/unord.map/nodiscard.verify.cpp} | 0
.../unord.multimap/nodiscard.verify.cpp} | 0
.../unord.multiset/nodiscard.verify.cpp} | 0
.../unord/unord.set/nodiscard.verify.cpp} | 0
.../diagnostics/atomic.nodiscard.verify.cpp | 33 --------
.../diagnostics/mutex.nodiscard.verify.cpp | 67 ---------------
.../diagnostics/new.nodiscard.verify.cpp | 57 -------------
.../system_error_win_codes.pass.cpp | 0
.../filesystems/nodiscard.verify.cpp} | 0
.../language.support/nodiscard.verify.cpp | 41 +++++++++
.../nodiscard.verify.cpp} | 0
.../basic.string/nodiscard.verify.cpp} | 0
.../string.view/nodiscard.verify.cpp} | 0
.../test/libcxx/thread/nodiscard.verify.cpp | 48 +++++++++++
.../nodiscard.verify.cpp} | 0
.../format/nodiscard.verify.cpp} | 0
.../function.objects/nodiscard.verify.cpp} | 0
.../utility/nodiscard.verify.cpp} | 0
35 files changed, 137 insertions(+), 193 deletions(-)
rename libcxx/test/libcxx/{diagnostics/algorithm.nodiscard.verify.cpp => algorithms/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics => containers/associative/map}/map.nodiscard.verify.cpp (100%)
rename libcxx/test/libcxx/{diagnostics => containers/associative/map}/multimap.nodiscard.verify.cpp (100%)
rename libcxx/test/libcxx/{diagnostics => containers/associative/set}/multiset.nodiscard.verify.cpp (100%)
rename libcxx/test/libcxx/{diagnostics => containers/associative/set}/set.nodiscard.verify.cpp (100%)
rename libcxx/test/libcxx/{diagnostics/flat_map.nodiscard.verify.cpp => containers/container.adaptors/flat.map/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/flat_multimap.nodiscard.verify.cpp => containers/container.adaptors/flat.multimap/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/flat_multiset.nodiscard.verify.cpp => containers/container.adaptors/flat.multiset/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/flat_set.nodiscard.verify.cpp => containers/container.adaptors/flat.set/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/queue.nodiscard.verify.cpp => containers/container.adaptors/queue/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/stack.nodiscard.verify.cpp => containers/container.adaptors/stack/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/array.nodiscard.verify.cpp => containers/sequences/array/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/deque.nodiscard.verify.cpp => containers/sequences/deque/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/forward_list.nodiscard.verify.cpp => containers/sequences/forwardlist/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/list.nodiscard.verify.cpp => containers/sequences/list/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/vector.nodiscard.verify.cpp => containers/sequences/vector/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/unordered_map.nodiscard.verify.cpp => containers/unord/unord.map/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/unordered_multimap.nodiscard.verify.cpp => containers/unord/unord.multimap/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/unordered_multiset.nodiscard.verify.cpp => containers/unord/unord.multiset/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/unordered_set.nodiscard.verify.cpp => containers/unord/unord.set/nodiscard.verify.cpp} (100%)
delete mode 100644 libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
delete mode 100644 libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
delete mode 100644 libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
rename libcxx/test/libcxx/diagnostics/{ => syserr}/system_error_win_codes.pass.cpp (100%)
rename libcxx/test/libcxx/{diagnostics/filesystem.nodiscard.verify.cpp => input.output/filesystems/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/regex.nodiscard.verify.cpp => re/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/string.nodiscard.verify.cpp => strings/basic.string/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/string_view.nodiscard.verify.cpp => strings/string.view/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/chrono.nodiscard.verify.cpp => time/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/format.nodiscard.verify.cpp => utilities/format/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/functional.nodiscard.verify.cpp => utilities/function.objects/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/utility.nodiscard.verify.cpp => utilities/utility/nodiscard.verify.cpp} (100%)
diff --git a/libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp b/libcxx/test/libcxx/algorithms/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp
rename to libcxx/test/libcxx/algorithms/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
index 3e00a94d219ee..57337dfe0e78e 100644
--- a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
@@ -6,50 +6,62 @@
//
//===----------------------------------------------------------------------===//
-// <atomic>
+// REQUIRES: std-at-least-c++26
-// Check that functions are marked [[nodiscard]]
+// check that <atomic> functions are marked [[nodiscard]]
#include <atomic>
+#include "atomic_helpers.h"
#include "test_macros.h"
+template <typename T>
+struct TestAtomicRef {
+ void operator()() const {
+ T x(T(1));
+ const std::atomic_ref<T> a(x);
+
+ a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+};
+
void test() {
-#if TEST_STD_VER >= 20
- {
- int i = 49;
- const std::atomic_ref<int> atRef{i};
+ TestAtomicRef<UserAtomicType>()();
+ TestAtomicRef<int>()();
+ TestAtomicRef<float>()();
+ TestAtomicRef<char*>()();
+}
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- atRef.is_lock_free();
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- atRef.load();
- }
-#endif
-
- {
- const volatile std::atomic<int> vat(82);
- const std::atomic<int> at(94);
-
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- vat.load();
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- at.load();
-
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_is_lock_free(&vat);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_is_lock_free(&at);
-
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_load(&vat);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_load(&at);
-
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_load_explicit(&vat, std::memory_order_seq_cst);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::atomic_load_explicit(&at, std::memory_order_seq_cst);
+// REQUIRES: std-at-least-c++26
+
+// check that <atomic> functions are marked [[nodiscard]]
+
+#include <atomic>
+
+#include "atomic_helpers.h"
+#include "test_macros.h"
+
+template <typename T>
+struct TestAtomicRef {
+ void operator()() const {
+ T x(T(1));
+ const std::atomic_ref<T> a(x);
+
+ a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
}
+};
+
+void test() {
+ TestAtomicRef<UserAtomicType>()();
+ TestAtomicRef<int>()();
+ TestAtomicRef<float>()();
+ TestAtomicRef<char*>()();
}
diff --git a/libcxx/test/libcxx/diagnostics/map.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/associative/map/map.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/map.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/associative/map/map.nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/multimap.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/associative/map/multimap.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/multimap.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/associative/map/multimap.nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/multiset.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/associative/set/multiset.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/multiset.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/associative/set/multiset.nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/set.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/associative/set/set.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/set.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/associative/set/set.nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/flat_map.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.map/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/flat_map.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/flat.map/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/flat_multimap.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.multimap/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/flat_multimap.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/flat.multimap/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/flat_multiset.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.multiset/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/flat_multiset.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/flat.multiset/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/flat_set.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.set/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/flat_set.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/flat.set/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/queue/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/queue/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/container.adaptors/stack/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/container.adaptors/stack/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/sequences/array/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/sequences/array/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/sequences/deque/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/sequences/deque/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/sequences/forwardlist/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/sequences/forwardlist/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/sequences/list/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/sequences/list/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/sequences/vector/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/sequences/vector/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/unordered_map.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/unord/unord.map/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/unordered_map.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/unord/unord.map/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/unordered_multimap.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/unord/unord.multimap/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/unordered_multimap.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/unord/unord.multimap/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/unordered_multiset.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/unord/unord.multiset/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/unordered_multiset.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/unord/unord.multiset/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/unordered_set.nodiscard.verify.cpp b/libcxx/test/libcxx/containers/unord/unord.set/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/unordered_set.nodiscard.verify.cpp
rename to libcxx/test/libcxx/containers/unord/unord.set/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
deleted file mode 100644
index 85e5f0b44d2d0..0000000000000
--- a/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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: std-at-least-c++26
-
-// check that <atomic> functions are marked [[nodiscard]]
-
-#include <atomic>
-
-#include "atomic_helpers.h"
-#include "test_macros.h"
-
-template <typename T>
-struct TestAtomicRef {
- void operator()() const {
- T x(T(1));
- const std::atomic_ref<T> a(x);
-
- a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
- }
-};
-
-void test() {
- TestAtomicRef<UserAtomicType>()();
- TestAtomicRef<int>()();
- TestAtomicRef<float>()();
- TestAtomicRef<char*>()();
-}
diff --git a/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
deleted file mode 100644
index c82a7edadcd06..0000000000000
--- a/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-// UNSUPPORTED: no-threads
-
-// check that <mutex> functions are marked [[nodiscard]]
-
-#include <mutex>
-#include <chrono>
-#include <utility>
-
-#include "test_macros.h"
-
-void test() {
- // std::scoped_lock
- {
-#if TEST_STD_VER >= 17
- using M = std::mutex;
- M m0, m1, m2;
- // clang-format off
- std::scoped_lock<>{}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M>{m0}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M, M>{m0, m1}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M, M, M>{m0, m1, m2}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
-
- std::scoped_lock<>{std::adopt_lock}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M>{std::adopt_lock, m0}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M, M>{std::adopt_lock, m0, m1}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::scoped_lock<M, M, M>{std::adopt_lock, m0, m1, m2}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- // clang-format on
-#endif
- }
-
- // std::unique_lock
- {
- using M = std::timed_mutex; // necessary for the time_point and duration constructors
- M m;
- std::chrono::time_point<std::chrono::steady_clock> time_point;
- std::chrono::milliseconds duration;
- std::unique_lock<M> other;
-
- // clang-format off
- std::unique_lock<M>(); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- (std::unique_lock<M>)(m); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(m, std::defer_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(m, std::try_to_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(m, std::adopt_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(m, time_point); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(m, duration); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::unique_lock<M>(std::move(other)); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- // clang-format on
- }
-
- // std::lock_guard
- {
- std::mutex m;
- // clang-format off
- (std::lock_guard<std::mutex>)(m); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- std::lock_guard<std::mutex>(m, std::adopt_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
- // clang-format on
- }
-}
diff --git a/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
deleted file mode 100644
index bd5b9dd001a11..0000000000000
--- a/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-// <new>
-
-// Check that functions are marked [[nodiscard]]
-
-#include <new>
-
-#include "test_macros.h"
-
-void test() {
- {
- std::bad_alloc ex;
-
- ex.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- }
- {
- std::bad_array_new_length ex;
-
- ex.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- }
-
- {
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new(0);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new(0, std::nothrow);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new[](0);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new[](0, std::nothrow);
-#if _LIBCPP_HAS_ALIGNED_ALLOCATION
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new(0, std::align_val_t{1});
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new(0, std::align_val_t{1}, std::nothrow);
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new[](0, std::align_val_t{1});
- // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- ::operator new[](0, std::align_val_t{1}, std::nothrow);
-#endif // _LIBCPP_HAS_ALIGNED_ALLOCATION
- }
-
-#if TEST_STD_VER >= 17
- {
- int* ptr = nullptr;
-
- std::launder(ptr); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- }
-#endif
-}
diff --git a/libcxx/test/libcxx/diagnostics/system_error_win_codes.pass.cpp b/libcxx/test/libcxx/diagnostics/syserr/system_error_win_codes.pass.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/system_error_win_codes.pass.cpp
rename to libcxx/test/libcxx/diagnostics/syserr/system_error_win_codes.pass.cpp
diff --git a/libcxx/test/libcxx/diagnostics/filesystem.nodiscard.verify.cpp b/libcxx/test/libcxx/input.output/filesystems/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/filesystem.nodiscard.verify.cpp
rename to libcxx/test/libcxx/input.output/filesystems/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/language.support/nodiscard.verify.cpp b/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
index 6d784f27440e1..3512dffa2cd24 100644
--- a/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
@@ -16,6 +16,7 @@
#include <coroutine>
#include <exception>
#include <initializer_list>
+#include <new>
#include <typeinfo>
#include <typeindex>
@@ -159,4 +160,44 @@ void test() {
bc.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
}
#endif
+
+ {
+ std::bad_alloc ex;
+
+ ex.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+ {
+ std::bad_array_new_length ex;
+
+ ex.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+
+ {
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new(0);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new(0, std::nothrow);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new[](0);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new[](0, std::nothrow);
+#if _LIBCPP_HAS_ALIGNED_ALLOCATION
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new(0, std::align_val_t{1});
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new(0, std::align_val_t{1}, std::nothrow);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new[](0, std::align_val_t{1});
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ ::operator new[](0, std::align_val_t{1}, std::nothrow);
+#endif // _LIBCPP_HAS_ALIGNED_ALLOCATION
+ }
+
+#if TEST_STD_VER >= 17
+ {
+ int* ptr = nullptr;
+
+ std::launder(ptr); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+#endif
}
diff --git a/libcxx/test/libcxx/diagnostics/regex.nodiscard.verify.cpp b/libcxx/test/libcxx/re/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/regex.nodiscard.verify.cpp
rename to libcxx/test/libcxx/re/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp b/libcxx/test/libcxx/strings/basic.string/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp
rename to libcxx/test/libcxx/strings/basic.string/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp b/libcxx/test/libcxx/strings/string.view/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp
rename to libcxx/test/libcxx/strings/string.view/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/thread/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
index 73e4f932b6369..86218a3e0c4b0 100644
--- a/libcxx/test/libcxx/thread/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
@@ -22,6 +22,54 @@
const auto timePoint = std::chrono::steady_clock::now();
void test() {
+ // std::scoped_lock
+ {
+#if TEST_STD_VER >= 17
+ using M = std::mutex;
+ M m0, m1, m2;
+ // clang-format off
+ std::scoped_lock<>{}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M>{m0}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M, M>{m0, m1}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M, M, M>{m0, m1, m2}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+
+ std::scoped_lock<>{std::adopt_lock}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M>{std::adopt_lock, m0}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M, M>{std::adopt_lock, m0, m1}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::scoped_lock<M, M, M>{std::adopt_lock, m0, m1, m2}; // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ // clang-format on
+#endif
+ }
+
+ // std::unique_lock
+ {
+ using M = std::timed_mutex; // necessary for the time_point and duration constructors
+ M m;
+ std::chrono::time_point<std::chrono::steady_clock> time_point;
+ std::chrono::milliseconds duration;
+ std::unique_lock<M> other;
+
+ // clang-format off
+ std::unique_lock<M>(); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ (std::unique_lock<M>)(m); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(m, std::defer_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(m, std::try_to_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(m, std::adopt_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(m, time_point); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(m, duration); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::unique_lock<M>(std::move(other)); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ // clang-format on
+ }
+
+ // std::lock_guard
+ {
+ std::mutex m;
+ // clang-format off
+ (std::lock_guard<std::mutex>)(m); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ std::lock_guard<std::mutex>(m, std::adopt_lock_t()); // expected-warning {{ignoring temporary created by a constructor declared with 'nodiscard' attribute}}
+ // clang-format on
+ }
+
// Threads
{
std::thread th;
diff --git a/libcxx/test/libcxx/diagnostics/chrono.nodiscard.verify.cpp b/libcxx/test/libcxx/time/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/chrono.nodiscard.verify.cpp
rename to libcxx/test/libcxx/time/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/format.nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/format/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/format.nodiscard.verify.cpp
rename to libcxx/test/libcxx/utilities/format/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/function.objects/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
rename to libcxx/test/libcxx/utilities/function.objects/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/utility/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp
rename to libcxx/test/libcxx/utilities/utility/nodiscard.verify.cpp
>From cea04984782590efac00f31c706f4ac4df58b1c5 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 6 Jan 2026 10:45:42 +0200
Subject: [PATCH 2/6] Moved more files to their correct locations
---
.../pstl.nodiscard.verify.cpp | 0
.../diagnostics/cstdlib.nodiscard.verify.cpp | 23 -------------------
.../diagnostics/future.nodiscard.verify.cpp | 22 ------------------
.../limits/nodiscard.verify.cpp} | 0
.../c.math/nodiscard.verify.cpp} | 6 +++++
.../test/libcxx/thread/nodiscard.verify.cpp | 7 ++++++
.../bit/nodiscard.verify.cpp} | 0
.../cstddef.nodiscard.verify.cpp | 0
8 files changed, 13 insertions(+), 45 deletions(-)
rename libcxx/test/libcxx/{diagnostics => algorithms}/pstl.nodiscard.verify.cpp (100%)
delete mode 100644 libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
delete mode 100644 libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
rename libcxx/test/libcxx/{diagnostics/limits.nodiscard.verify.cpp => language.support/limits/nodiscard.verify.cpp} (100%)
rename libcxx/test/libcxx/{diagnostics/cmath.nodiscard.verify.cpp => numerics/c.math/nodiscard.verify.cpp} (96%)
rename libcxx/test/libcxx/{diagnostics/bit.nodiscard.verify.cpp => utilities/bit/nodiscard.verify.cpp} (100%)
rename libcxx/test/{libcxx/diagnostics => std/language.support/support.types}/cstddef.nodiscard.verify.cpp (100%)
diff --git a/libcxx/test/libcxx/diagnostics/pstl.nodiscard.verify.cpp b/libcxx/test/libcxx/algorithms/pstl.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/pstl.nodiscard.verify.cpp
rename to libcxx/test/libcxx/algorithms/pstl.nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
deleted file mode 100644
index 52e897662fef6..0000000000000
--- a/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-// We don't control the implementation of the stdlib.h functions on windows
-// UNSUPPORTED: windows
-
-// check that <cstdlib> functions are marked [[nodiscard]]
-
-#include <cmath>
-#include "test_macros.h"
-
-void test() {
- std::abs(0l); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::abs(0ll); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::abs(0.f); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::abs(0.); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::abs(0.l); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
-}
diff --git a/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
deleted file mode 100644
index cc5c6135d109b..0000000000000
--- a/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-// UNSUPPORTED: c++03
-
-// UNSUPPORTED: no-threads
-
-// check that <future> functions are marked [[nodiscard]]
-
-// clang-format off
-
-#include <future>
-
-void test() {
- std::async([]() {}); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
- std::async(std::launch::any, []() {}); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
-}
diff --git a/libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp b/libcxx/test/libcxx/language.support/limits/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp
rename to libcxx/test/libcxx/language.support/limits/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/cmath.nodiscard.verify.cpp b/libcxx/test/libcxx/numerics/c.math/nodiscard.verify.cpp
similarity index 96%
rename from libcxx/test/libcxx/diagnostics/cmath.nodiscard.verify.cpp
rename to libcxx/test/libcxx/numerics/c.math/nodiscard.verify.cpp
index 14d1935bd5030..b2622c657b5a7 100644
--- a/libcxx/test/libcxx/diagnostics/cmath.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/numerics/c.math/nodiscard.verify.cpp
@@ -38,6 +38,12 @@ void test() {
std::trunc(0.); // expected-warning-re {{ignoring return value of function declared with {{.*}} attribute}}
#endif
+ std::abs(0l); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::abs(0ll); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::abs(0.f); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::abs(0.); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::abs(0.l); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+
std::signbit(0.f); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
std::signbit(0.); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
std::signbit(0.l); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
diff --git a/libcxx/test/libcxx/thread/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
index 86218a3e0c4b0..7940f741addb6 100644
--- a/libcxx/test/libcxx/thread/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
@@ -22,6 +22,13 @@
const auto timePoint = std::chrono::steady_clock::now();
void test() {
+ { // [futures.async]
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::async([]() {});
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::async(std::launch::any, []() {});
+ }
+
// std::scoped_lock
{
#if TEST_STD_VER >= 17
diff --git a/libcxx/test/libcxx/diagnostics/bit.nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/bit/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/bit.nodiscard.verify.cpp
rename to libcxx/test/libcxx/utilities/bit/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/diagnostics/cstddef.nodiscard.verify.cpp b/libcxx/test/std/language.support/support.types/cstddef.nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/cstddef.nodiscard.verify.cpp
rename to libcxx/test/std/language.support/support.types/cstddef.nodiscard.verify.cpp
>From af8dbaeef3c2b18b8f0b5733333b6baa40d4b6b7 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 6 Jan 2026 10:47:38 +0200
Subject: [PATCH 3/6] Fixed test
---
libcxx/test/libcxx/thread/nodiscard.verify.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libcxx/test/libcxx/thread/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
index 7940f741addb6..0844b454cedd4 100644
--- a/libcxx/test/libcxx/thread/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
@@ -12,6 +12,7 @@
#include <chrono>
#include <barrier>
+#include <future>
#include <latch>
#include <mutex>
#include <semaphore>
>From 4d3d9001e3a882eddac5b337530a22f63a2150cf Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 6 Jan 2026 11:04:49 +0200
Subject: [PATCH 4/6] Fixed atomics.nodiscard.verify.cpp after bad merge
---
.../test/libcxx/atomics/nodiscard.verify.cpp | 84 ++++++++-----------
1 file changed, 36 insertions(+), 48 deletions(-)
diff --git a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
index 57337dfe0e78e..3e00a94d219ee 100644
--- a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
@@ -6,62 +6,50 @@
//
//===----------------------------------------------------------------------===//
-// REQUIRES: std-at-least-c++26
+// <atomic>
-// check that <atomic> functions are marked [[nodiscard]]
+// Check that functions are marked [[nodiscard]]
#include <atomic>
-#include "atomic_helpers.h"
#include "test_macros.h"
-template <typename T>
-struct TestAtomicRef {
- void operator()() const {
- T x(T(1));
- const std::atomic_ref<T> a(x);
-
- a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
- }
-};
-
void test() {
- TestAtomicRef<UserAtomicType>()();
- TestAtomicRef<int>()();
- TestAtomicRef<float>()();
- TestAtomicRef<char*>()();
-}
+#if TEST_STD_VER >= 20
+ {
+ int i = 49;
+ const std::atomic_ref<int> atRef{i};
-//===----------------------------------------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ atRef.is_lock_free();
-// REQUIRES: std-at-least-c++26
-
-// check that <atomic> functions are marked [[nodiscard]]
-
-#include <atomic>
-
-#include "atomic_helpers.h"
-#include "test_macros.h"
-
-template <typename T>
-struct TestAtomicRef {
- void operator()() const {
- T x(T(1));
- const std::atomic_ref<T> a(x);
-
- a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ atRef.load();
+ }
+#endif
+
+ {
+ const volatile std::atomic<int> vat(82);
+ const std::atomic<int> at(94);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ vat.load();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ at.load();
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_is_lock_free(&vat);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_is_lock_free(&at);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_load(&vat);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_load(&at);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_load_explicit(&vat, std::memory_order_seq_cst);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::atomic_load_explicit(&at, std::memory_order_seq_cst);
}
-};
-
-void test() {
- TestAtomicRef<UserAtomicType>()();
- TestAtomicRef<int>()();
- TestAtomicRef<float>()();
- TestAtomicRef<char*>()();
}
>From 6e39462dbf6618efdb126df68b9cfcff1500fd18 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 6 Jan 2026 11:09:35 +0200
Subject: [PATCH 5/6] More fixes
---
libcxx/test/libcxx/atomics/nodiscard.verify.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
index 3e00a94d219ee..cf74efe5c8523 100644
--- a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
@@ -20,6 +20,9 @@ void test() {
int i = 49;
const std::atomic_ref<int> atRef{i};
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ a.address();
+
// expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
atRef.is_lock_free();
>From 02b058eafdb657d6b1c5aa9cd387ea6219e9cef5 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 6 Jan 2026 11:25:11 +0200
Subject: [PATCH 6/6] Fix again
---
libcxx/test/libcxx/atomics/nodiscard.verify.cpp | 4 +++-
libcxx/test/libcxx/thread/nodiscard.verify.cpp | 2 ++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
index cf74efe5c8523..c1c2b95ecf89f 100644
--- a/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
@@ -20,8 +20,10 @@ void test() {
int i = 49;
const std::atomic_ref<int> atRef{i};
+# if TEST_STD_VER >= 26
// expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
- a.address();
+ atRef.address();
+# endif
// expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
atRef.is_lock_free();
diff --git a/libcxx/test/libcxx/thread/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
index 0844b454cedd4..c6c2ffb62d862 100644
--- a/libcxx/test/libcxx/thread/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
@@ -23,12 +23,14 @@
const auto timePoint = std::chrono::steady_clock::now();
void test() {
+#if TEST_STD_VER >= 11
{ // [futures.async]
// expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::async([]() {});
// expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::async(std::launch::any, []() {});
}
+#endif
// std::scoped_lock
{
More information about the libcxx-commits
mailing list