From f6778c2841dd7bfcd6be919bcd86dbe23d3c33d7 Mon Sep 17 00:00:00 2001 From: Hristo Hristov 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 _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 -void test_queue() { - std::queue queue; - queue.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} -} +void test() { + { + std::queue q; + const std::queue 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 pq; -void test_priority_queue() { - std::priority_queue 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 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 _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