https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/169469
>From f6778c2841dd7bfcd6be919bcd86dbe23d3c33d7 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Tue, 25 Nov 2025 09:54:14 +0200
Subject: [PATCH 1/2] [libc++][queue] Applied `[[nodiscard]]`
`[[nodiscard]]` should be applied to functions where discarding the return value is most likely a correctness issue.
- https://libcxx.llvm.org/CodingGuidelines.html#apply-nodiscard-where-relevant
---
libcxx/include/queue | 22 ++++++++--------
.../diagnostics/queue.nodiscard.verify.cpp | 26 ++++++++++++++-----
2 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/libcxx/include/queue b/libcxx/include/queue
index b4b79fb25a35f..63ef17b21e188 100644
--- a/libcxx/include/queue
+++ b/libcxx/include/queue
@@ -376,12 +376,12 @@ public:
# endif // _LIBCPP_CXX03_LANG
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool empty() const { return c.empty(); }
- _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
- _LIBCPP_HIDE_FROM_ABI reference front() { return c.front(); }
- _LIBCPP_HIDE_FROM_ABI const_reference front() const { return c.front(); }
- _LIBCPP_HIDE_FROM_ABI reference back() { return c.back(); }
- _LIBCPP_HIDE_FROM_ABI const_reference back() const { return c.back(); }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI reference front() { return c.front(); }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI const_reference front() const { return c.front(); }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI reference back() { return c.back(); }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI const_reference back() const { return c.back(); }
_LIBCPP_HIDE_FROM_ABI void push(const value_type& __v) { c.push_back(__v); }
# ifndef _LIBCPP_CXX03_LANG
@@ -401,13 +401,11 @@ public:
template <class... _Args>
_LIBCPP_HIDE_FROM_ABI
# if _LIBCPP_STD_VER >= 17
- decltype(auto)
- emplace(_Args&&... __args) {
+ decltype(auto) emplace(_Args&&... __args) {
return c.emplace_back(std::forward<_Args>(__args)...);
}
# else
- void
- emplace(_Args&&... __args) {
+ void emplace(_Args&&... __args) {
c.emplace_back(std::forward<_Args>(__args)...);
}
# endif
@@ -664,8 +662,10 @@ public:
# endif
[[__nodiscard__]] _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI bool empty() const { return c.empty(); }
- _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
- _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI const_reference top() const { return c.front(); }
+ [[__nodiscard__]] _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI size_type size() const { return c.size(); }
+ [[__nodiscard__]] _LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI const_reference top() const {
+ return c.front();
+ }
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI void push(const value_type& __v);
# ifndef _LIBCPP_CXX03_LANG
diff --git a/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
index 77d3367cc2f4a..da1f9ff3f01f6 100644
--- a/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp
@@ -12,12 +12,24 @@
#include <queue>
-void test_queue() {
- std::queue<int> queue;
- queue.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
-}
+void test() {
+ {
+ std::queue<int> q;
+ const std::queue<int> cq{};
+
+ q.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ q.size(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ q.front(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ cq.front(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ q.back(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ cq.back(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+
+ {
+ std::priority_queue<int> pq;
-void test_priority_queue() {
- std::priority_queue<int> priority_queue;
- priority_queue.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ pq.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ pq.size(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ pq.top(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
}
>From 532c86cb9b88b70ebb9b360c0c4c63462b4d256a Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Wed, 26 Nov 2025 16:18:10 +0200
Subject: [PATCH 2/2] Review comments
---
libcxx/include/queue | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/libcxx/include/queue b/libcxx/include/queue
index 63ef17b21e188..a1686bc7c502e 100644
--- a/libcxx/include/queue
+++ b/libcxx/include/queue
@@ -401,11 +401,13 @@ public:
template <class... _Args>
_LIBCPP_HIDE_FROM_ABI
# if _LIBCPP_STD_VER >= 17
- decltype(auto) emplace(_Args&&... __args) {
+ decltype(auto)
+ emplace(_Args&&... __args) {
return c.emplace_back(std::forward<_Args>(__args)...);
}
# else
- void emplace(_Args&&... __args) {
+ void
+ emplace(_Args&&... __args) {
c.emplace_back(std::forward<_Args>(__args)...);
}
# endif