https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90388
Bug ID: 90388 Summary: Disabled hash specialization should not be invocable Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- [unord.hash] p4 says "Disabled specializations of hash are not function object types" but we fail to follow that: #include <memory> struct D { struct pointer { pointer(int*) { } }; void operator()(pointer) const noexcept { } }; int main() { static_assert( !std::is_invocable_v<std::hash<D::pointer>&, D::pointer> ); using UP = std::unique_ptr<int, D>; static_assert( !std::is_invocable_v<std::hash<UP>&, UP> ); } h.cc: In function 'int main()': h.cc:13:18: error: static assertion failed 13 | static_assert( !std::is_invocable_v<std::hash<UP>&, UP> ); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Also, hash<UP>::operator() should not be unconditionally noexcept, because (if it is enabled) hash<UP::pointer>::operator() might throw ([util.smartptr.hash] p1).