Skip to content

Conversation

@frederick-vs-ja
Copy link
Contributor

@frederick-vs-ja frederick-vs-ja commented Dec 15, 2025

  1. Remove incorrect [[nodiscard]] from compound assignment operators in <__filesystem/copy_options.h>. Also add regression tests.
  2. Add missing [[nodiscard]] mark for mdspan::size in <__mdspan/mdspan.h> and test it.
  3. Enable verifying [[nodiscard]] in C++03 for various components. These components are either present in C++03 or backported by libc++ from C++11/17.

@frederick-vs-ja frederick-vs-ja requested a review from a team as a code owner December 15, 2025 10:35
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Dec 15, 2025
@llvmbot
Copy link
Member

llvmbot commented Dec 15, 2025

@llvm/pr-subscribers-libcxx

Author: A. Jiang (frederick-vs-ja)

Changes
  1. Remove incorrect [[nodiscard]] from compound assignment operators in &lt;__filesystem/copy_options.h&gt;.
  2. Add missing [[nodiscard]] mark for mdspan::size in &lt;__mdspan/mdspan.h&gt; and test it.
  3. Enable verifying [[nodiscard]] in C++03 for various components. These components are either present in C++03 or backported by libc++ from C++11.

Full diff: https://github.com/llvm/llvm-project/pull/172275.diff

22 Files Affected:

  • (modified) libcxx/include/__filesystem/copy_options.h (+3-3)
  • (modified) libcxx/include/__mdspan/mdspan.h (+1-1)
  • (modified) libcxx/test/libcxx/containers/views/mdspan/nodiscard.verify.cpp (+2)
  • (modified) libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp (+1-3)
  • (modified) libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp (-2)
  • (modified) libcxx/test/libcxx/thread/nodiscard.verify.cpp (-1)
  • (modified) libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp (-2)
diff --git a/libcxx/include/__filesystem/copy_options.h b/libcxx/include/__filesystem/copy_options.h
index cba719dbed1f6..d9039a6492fc2 100644
--- a/libcxx/include/__filesystem/copy_options.h
+++ b/libcxx/include/__filesystem/copy_options.h
@@ -50,15 +50,15 @@ enum class copy_options : unsigned short {
   return static_cast<copy_options>(~static_cast<unsigned short>(__lhs));
 }
 
-[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline copy_options& operator&=(copy_options& __lhs, copy_options __rhs) {
+_LIBCPP_HIDE_FROM_ABI inline copy_options& operator&=(copy_options& __lhs, copy_options __rhs) {
   return __lhs = __lhs & __rhs;
 }
 
-[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline copy_options& operator|=(copy_options& __lhs, copy_options __rhs) {
+_LIBCPP_HIDE_FROM_ABI inline copy_options& operator|=(copy_options& __lhs, copy_options __rhs) {
   return __lhs = __lhs | __rhs;
 }
 
-[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline copy_options& operator^=(copy_options& __lhs, copy_options __rhs) {
+_LIBCPP_HIDE_FROM_ABI inline copy_options& operator^=(copy_options& __lhs, copy_options __rhs) {
   return __lhs = __lhs ^ __rhs;
 }
 
diff --git a/libcxx/include/__mdspan/mdspan.h b/libcxx/include/__mdspan/mdspan.h
index 9f3139a874ff9..9d3d35cd558a1 100644
--- a/libcxx/include/__mdspan/mdspan.h
+++ b/libcxx/include/__mdspan/mdspan.h
@@ -214,7 +214,7 @@ class mdspan {
     }(make_index_sequence<rank()>()));
   }
 
-  _LIBCPP_HIDE_FROM_ABI constexpr size_type size() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_type size() const noexcept {
     // Could leave this as only checked in debug mode: semantically size() is never
     // guaranteed to be related to any accessible range
     _LIBCPP_ASSERT_UNCATEGORIZED(
diff --git a/libcxx/test/libcxx/containers/views/mdspan/nodiscard.verify.cpp b/libcxx/test/libcxx/containers/views/mdspan/nodiscard.verify.cpp
index 71f53f8f1f737..d248656ec0ae5 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/nodiscard.verify.cpp
@@ -33,6 +33,8 @@ void test() {
   mdsp.static_extent(0); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
   mdsp.extent(0);        // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
 
+  mdsp.size(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+
   mdsp.extents();     // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
   mdsp.data_handle(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
   mdsp.mapping();     // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
diff --git a/libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp
index 14febc12a8a2d..85d33e240a33e 100644
--- a/libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <algorithm> functions are marked [[nodiscard]]
 
 // clang-format off
diff --git a/libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp
index 8e49807732de7..9797cf70b244d 100644
--- a/libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <array> functions are marked [[nodiscard]]
 
 #include <array>
diff --git a/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
index d3c809f22816b..52e897662fef6 100644
--- a/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // We don't control the implementation of the stdlib.h functions on windows
 // UNSUPPORTED: windows
 
diff --git a/libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp
index a9adb1757b8ef..c10a99afee8fa 100644
--- a/libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <deque> functions are marked [[nodiscard]]
 
 #include <deque>
diff --git a/libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp
index 671c7f71ab2a2..596dc52cdd7aa 100644
--- a/libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <forward_list> functions are marked [[nodiscard]]
 
 #include <forward_list>
diff --git a/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
index 521870f2484a2..f76641adc016c 100644
--- a/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <functional> functions are marked [[nodiscard]]
 
 #include <cstddef>
@@ -20,7 +18,7 @@ void test() {
 
   // Function wrappers
 
-#if !defined(TEST_HAS_NO_RTTI)
+#if TEST_STD_VER >= 11 && !defined(TEST_HAS_NO_RTTI)
   std::function<void(int)> f;
   const std::function<void(int)> cf;
 
diff --git a/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
index cc5c6135d109b..63f395da36c4d 100644
--- a/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // UNSUPPORTED: no-threads
 
 // check that <future> functions are marked [[nodiscard]]
diff --git a/libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp
index 7a81b84378c52..d3bea9ea031f4 100644
--- a/libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <limits> functions are marked [[nodiscard]]
 
 #include <limits>
diff --git a/libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp
index bfce9b85ef76c..cff607e738d35 100644
--- a/libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <list> functions are marked [[nodiscard]]
 
 #include <list>
diff --git a/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
index b9890ced55bb1..e34766828c3fe 100644
--- a/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // UNSUPPORTED: no-threads
 
 // check that <mutex> functions are marked [[nodiscard]]
diff --git a/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
index 505618c0b88d7..b2af8d4a74027 100644
--- a/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <array> functions are marked [[nodiscard]]
 
 // clang-format off
diff --git a/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
index da1f9ff3f01f6..b16a7480cc540 100644
--- a/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <queue> functions are marked [[nodiscard]]
 
 #include <queue>
diff --git a/libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp
index a0a5b3c898a8c..d176fd4cf6f68 100644
--- a/libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <stack> functions are marked [[nodiscard]]
 
 #include <stack>
diff --git a/libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp
index 0ff92cac3a3b2..3a941598e6e68 100644
--- a/libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <string> functions are marked [[nodiscard]]
 
 #include <string>
diff --git a/libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp
index 89e4a5b44ab48..5620e71a56c62 100644
--- a/libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <string_view> functions are marked [[nodiscard]]
 
 #include <string_view>
diff --git a/libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp
index 2f5b3ba0fc642..3d6ff423dc917 100644
--- a/libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <utility> functions are marked [[nodiscard]]
 
 #include <utility>
diff --git a/libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp
index a5cad1a1627e6..3a443a367a77b 100644
--- a/libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // check that <vector> functions are marked [[nodiscard]]
 
 #include <type_traits>
diff --git a/libcxx/test/libcxx/thread/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
index 19e43f88db700..5cdf2a43037da 100644
--- a/libcxx/test/libcxx/thread/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/thread/nodiscard.verify.cpp
@@ -6,7 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
 // UNSUPPORTED: no-threads
 
 // Check that functions are marked [[nodiscard]]
diff --git a/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
index 6e713fe5217ba..42a11ea3ef9df 100644
--- a/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// UNSUPPORTED: c++03
-
 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX20_REMOVED_SHARED_PTR_UNIQUE -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
 
 // <memory>

Comment on lines +53 to 63
_LIBCPP_HIDE_FROM_ABI inline copy_options& operator&=(copy_options& __lhs, copy_options __rhs) {
return __lhs = __lhs & __rhs;
}

[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline copy_options& operator|=(copy_options& __lhs, copy_options __rhs) {
_LIBCPP_HIDE_FROM_ABI inline copy_options& operator|=(copy_options& __lhs, copy_options __rhs) {
return __lhs = __lhs | __rhs;
}

[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline copy_options& operator^=(copy_options& __lhs, copy_options __rhs) {
_LIBCPP_HIDE_FROM_ABI inline copy_options& operator^=(copy_options& __lhs, copy_options __rhs) {
return __lhs = __lhs ^ __rhs;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a regression test. I wasn't able to find any tests for these functions, so it'd be appreciated if they were added. That would probably have caught this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I'm adding it to libcxx/test/std/input.output/filesystems/fs.enum/enum.copy_options.pass.cpp.

@frederick-vs-ja frederick-vs-ja force-pushed the nodiscard-mini-cleanup branch 2 times, most recently from 0f2293b to 95fcf72 Compare December 15, 2025 11:36
libc++ backports many things from C++11 to C++03, so it would be
suitable to verify `[[nodiscard]]` in C++03 mode for them.

Some test files are skipped because they're being touch by other
patches.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants