[libcxx-commits] [libcxx] [libc++][NFC] Refactor `[[nodiscard]]` tests (PR #173451)

Hristo Hristov via libcxx-commits libcxx-commits at lists.llvm.org
Tue Dec 23 21:32:47 PST 2025


https://github.com/H-G-Hristov created https://github.com/llvm/llvm-project/pull/173451

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.

>From a89951c431f2c294f39d1a1111b853be00f85e57 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] [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
 .../nodiscard.verify.cpp}                     |  0
 .../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/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
 34 files changed, 89 insertions(+), 124 deletions(-)
 rename libcxx/test/libcxx/{diagnostics/algorithm.nodiscard.verify.cpp => algorithms/nodiscard.verify.cpp} (100%)
 rename libcxx/test/libcxx/{diagnostics/atomic.nodiscard.verify.cpp => atomics/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/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/diagnostics/atomic.nodiscard.verify.cpp b/libcxx/test/libcxx/atomics/nodiscard.verify.cpp
similarity index 100%
rename from libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
rename to libcxx/test/libcxx/atomics/nodiscard.verify.cpp
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/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



More information about the libcxx-commits mailing list