-
Notifications
You must be signed in to change notification settings - Fork 15.5k
[libc++] Applied [[nodiscard]] to hash<shared_ptr>, hash<unique_ptr>, etc.
#170674
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
9cec609 to
fef23bd
Compare
Member
|
@llvm/pr-subscribers-libcxx Author: Hristo Hristov (H-G-Hristov) Changes
Full diff: https://github.com/llvm/llvm-project/pull/170674.diff 7 Files Affected:
diff --git a/libcxx/include/__functional/hash.h b/libcxx/include/__functional/hash.h
index f74f25fa6e84b..d81ff1abbdaba 100644
--- a/libcxx/include/__functional/hash.h
+++ b/libcxx/include/__functional/hash.h
@@ -435,7 +435,7 @@ struct hash : public __hash_impl<_Tp> {};
template <>
struct hash<nullptr_t> : public __unary_function<nullptr_t, size_t> {
- _LIBCPP_HIDE_FROM_ABI size_t operator()(nullptr_t) const _NOEXCEPT { return 662607004ull; }
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t operator()(nullptr_t) const _NOEXCEPT { return 662607004ull; }
};
#ifndef _LIBCPP_CXX03_LANG
diff --git a/libcxx/include/__memory/shared_ptr.h b/libcxx/include/__memory/shared_ptr.h
index 6eddc4daa4184..4fbd0af98463e 100644
--- a/libcxx/include/__memory/shared_ptr.h
+++ b/libcxx/include/__memory/shared_ptr.h
@@ -77,7 +77,7 @@ class _LIBCPP_EXPORTED_FROM_ABI bad_weak_ptr : public std::exception {
_LIBCPP_HIDE_FROM_ABI bad_weak_ptr(const bad_weak_ptr&) _NOEXCEPT = default;
_LIBCPP_HIDE_FROM_ABI bad_weak_ptr& operator=(const bad_weak_ptr&) _NOEXCEPT = default;
~bad_weak_ptr() _NOEXCEPT override;
- const char* what() const _NOEXCEPT override;
+ [[__nodiscard__]] const char* what() const _NOEXCEPT override;
};
[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_bad_weak_ptr() {
@@ -1423,7 +1423,7 @@ struct hash<shared_ptr<_Tp> > {
_LIBCPP_DEPRECATED_IN_CXX17 typedef size_t result_type;
#endif
- _LIBCPP_HIDE_FROM_ABI size_t operator()(const shared_ptr<_Tp>& __ptr) const _NOEXCEPT {
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t operator()(const shared_ptr<_Tp>& __ptr) const _NOEXCEPT {
return hash<typename shared_ptr<_Tp>::element_type*>()(__ptr.get());
}
};
diff --git a/libcxx/include/__memory/unique_ptr.h b/libcxx/include/__memory/unique_ptr.h
index b5f469365daed..6a4ec0a466ba7 100644
--- a/libcxx/include/__memory/unique_ptr.h
+++ b/libcxx/include/__memory/unique_ptr.h
@@ -800,7 +800,7 @@ struct hash<__enable_hash_helper< unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp,
_LIBCPP_DEPRECATED_IN_CXX17 typedef size_t result_type;
#endif
- _LIBCPP_HIDE_FROM_ABI size_t operator()(const unique_ptr<_Tp, _Dp>& __ptr) const {
+ [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t operator()(const unique_ptr<_Tp, _Dp>& __ptr) const {
typedef typename unique_ptr<_Tp, _Dp>::pointer pointer;
return hash<pointer>()(__ptr.get());
}
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 0ac5a1ade817f..c473b4a2c2d23 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -1660,7 +1660,10 @@ module std [system] {
}
module raw_storage_iterator { header "__memory/raw_storage_iterator.h" }
module shared_count { header "__memory/shared_count.h" }
- module shared_ptr { header "__memory/shared_ptr.h" }
+ module shared_ptr {
+ header "__memory/shared_ptr.h"
+ export std.functional.hash
+ }
module swap_allocator { header "__memory/swap_allocator.h" }
module temp_value { header "__memory/temp_value.h" }
module temporary_buffer {
@@ -1673,6 +1676,7 @@ module std [system] {
}
module unique_ptr {
header "__memory/unique_ptr.h"
+ export std.functional.hash
}
module unique_temporary_buffer {
header "__memory/unique_temporary_buffer.h"
@@ -2391,6 +2395,7 @@ module std [system] {
header "coroutine"
export *
+ export std.functional.hash
}
} // module std
diff --git a/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
index 898b2ac06e3f2..521870f2484a2 100644
--- a/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp
@@ -10,6 +10,7 @@
// check that <functional> functions are marked [[nodiscard]]
+#include <cstddef>
#include <functional>
#include "test_macros.h"
@@ -59,4 +60,9 @@ void test() {
std::ref(i); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
std::cref(i); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+
+ // Hash specializations
+
+ std::hash<std::nullptr_t> hash;
+ hash(nullptr); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
}
diff --git a/libcxx/test/libcxx/language.support/nodiscard.verify.cpp b/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
index b87b04ad9f1ef..b8f3a8a6e5ce2 100644
--- a/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/language.support/nodiscard.verify.cpp
@@ -12,7 +12,6 @@
#include <compare>
#include <coroutine>
-#include <functional>
#include <initializer_list>
#include "test_macros.h"
diff --git a/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
index 66e00d6fa66c0..6e713fe5217ba 100644
--- a/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/utilities/smartptr/nodiscard.verify.cpp
@@ -41,6 +41,14 @@ void test() {
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::make_unique_for_overwrite<int[]>(5);
#endif
+
+ std::hash<std::unique_ptr<int>> hash;
+ hash(uPtr); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+ { // [util.smartptr.weak.bad]
+ std::bad_weak_ptr bwp;
+
+ bwp.what(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
}
{ // [util.sharedptr]
std::shared_ptr<int[]> sPtr;
@@ -118,6 +126,9 @@ void test() {
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::get_deleter<int[]>(sPtr);
#endif
+
+ std::hash<std::shared_ptr<int[]>> hash;
+ hash(sPtr); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
}
{ // [util.smartptr.weak]
std::weak_ptr<int> wPtr;
|
[[nodiscard]][[nodiscard]] to hash<shared_ptr>, hash<unique_ptr>, etc.
fef23bd to
bf2987a
Compare
[[nodiscard]] to hash<shared_ptr>, hash<unique_ptr>, etc.[[nodiscard]] to hash<shared_ptr>, hash<unique_ptr>, etc.
`[[nodiscard]]`` should be applied to functions where discarding the return value is most likely a correctness issue. - https://libcxx.llvm.org/CodingGuidelines.html
bf2987a to
3ad03ea
Compare
Co-authored-by: A. Jiang <[email protected]>
Contributor
Author
|
@frederick-vs-ja Sorry again! Can we merge this too? |
frederick-vs-ja
approved these changes
Dec 6, 2025
Contributor
Author
|
Thank you! |
frederick-vs-ja
approved these changes
Dec 8, 2025
honeygoyal
pushed a commit
to honeygoyal/llvm-project
that referenced
this pull request
Dec 9, 2025
…ptr>`, etc. (llvm#170674) `[[nodiscard]]` should be applied to functions where discarding the return value is most likely a correctness issue. - https://libcxx.llvm.org/CodingGuidelines.html 1. `hash<shared_ptr>`, `hash<unique_ptr>`, `std::integer_sequence<>` etc. 2. Also implements fixes to llvm#169634 on the go (issues discovered during current implementation) --------- Co-authored-by: A. Jiang <[email protected]> Co-authored-by: Hristo Hristov <[email protected]>
84 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
[[nodiscard]]should be applied to functions where discarding the return value is most likely a correctness issue.hash<shared_ptr>,hash<unique_ptr>,std::integer_sequence<>etc.std.functional.hashshould be exported from Clang modules for some standard library headers #169634 on the go (issues discovered during current implementation)