https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90388
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Patch for both issues:
@@ -830,14 +847,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Tp, typename _Dp>
struct hash<unique_ptr<_Tp, _Dp>>
: public __hash_base<size_t, unique_ptr<_Tp, _Dp>>,
- private __poison_hash<typename unique_ptr<_Tp, _Dp>::pointer>
+ private __poison_hash<typename unique_ptr<_Tp, _Dp>::pointer>
{
- size_t
- operator()(const unique_ptr<_Tp, _Dp>& __u) const noexcept
- {
- typedef unique_ptr<_Tp, _Dp> _UP;
- return std::hash<typename _UP::pointer>()(__u.get());
- }
+ private:
+ using __poison_base
+ = __poison_hash<typename unique_ptr<_Tp, _Dp>::pointer>;
+ template<typename _Up>
+ using __enabled
+ = __and_<is_same<_Up, unique_ptr<_Tp, _Dp>>,
+ __bool_constant<__poison_base::__enable_hash_call>>;
+
+ public:
+ template<typename _Up>
+ typename enable_if<__enabled<_Up>::value, size_t>::type
+ operator()(const _Up& __u) const
+ {
+ return std::hash<typename _Up::pointer>()(__u.get());
+ }
};
#if __cplusplus > 201103L