Index: include/bits/shared_ptr.h
===================================================================
--- include/bits/shared_ptr.h	(revision 160601)
+++ include/bits/shared_ptr.h	(working copy)
@@ -514,6 +514,16 @@
 				  std::forward<_Args>(__args)...);
     }
 
+  /// std::hash specialization for shared_ptr.
+  template<typename _Tp>
+    struct hash<shared_ptr<_Tp>>
+    : public std::unary_function<shared_ptr<_Tp>, size_t>
+    {
+      size_t
+      operator()(const shared_ptr<_Tp>& __s) const
+      { return std::hash<_Tp*>()(__s.get()); }
+    };
+
   // @} group pointer_abstractions
 
 _GLIBCXX_END_NAMESPACE
Index: include/bits/unique_ptr.h
===================================================================
--- include/bits/unique_ptr.h	(revision 160601)
+++ include/bits/unique_ptr.h	(working copy)
@@ -233,7 +233,7 @@
   // [unique.ptr.runtime]
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // DR 740 - omit specialization for array objects with a compile time length
-  template<typename _Tp, typename _Tp_Deleter> 
+  template<typename _Tp, typename _Tp_Deleter>
     class unique_ptr<_Tp[], _Tp_Deleter>
     {
       typedef std::tuple<_Tp*, _Tp_Deleter>  __tuple_type;
@@ -444,6 +444,19 @@
 	       const unique_ptr<_Up, _Up_Deleter>& __y)
     { return !(__x.get() < __y.get()); }
 
+  /// std::hash specialization for unique_ptr.
+  template<typename _Tp, typename _Tp_Deleter>
+    struct hash<unique_ptr<_Tp, _Tp_Deleter>>
+    : public std::unary_function<unique_ptr<_Tp, _Tp_Deleter>, size_t>
+    {
+      size_t
+      operator()(const unique_ptr<_Tp, _Tp_Deleter>& __u) const
+      {
+	typedef unique_ptr<_Tp, _Tp_Deleter> _UP;
+	return std::hash<typename _UP::pointer>()(__u.get());
+      }
+    };
+
   // @} group pointer_abstractions
 
 _GLIBCXX_END_NAMESPACE
Index: include/bits/shared_ptr_base.h
===================================================================
--- include/bits/shared_ptr_base.h	(revision 160601)
+++ include/bits/shared_ptr_base.h	(working copy)
@@ -1164,6 +1164,16 @@
 					 std::forward<_Args>(__args)...);
     }
 
+  /// std::hash specialization for __shared_ptr.
+  template<typename _Tp, _Lock_policy _Lp>
+    struct hash<__shared_ptr<_Tp, _Lp>>
+    : public std::unary_function<__shared_ptr<_Tp, _Lp>, size_t>
+    {
+      size_t
+      operator()(const __shared_ptr<_Tp, _Lp>& __s) const
+      { return std::hash<_Tp*>()(__s.get()); }
+    };
+
 _GLIBCXX_END_NAMESPACE
 
 #endif // _SHARED_PTR_BASE_H
Index: testsuite/20_util/unique_ptr/hash/1.cc
===================================================================
--- testsuite/20_util/unique_ptr/hash/1.cc	(revision 0)
+++ testsuite/20_util/unique_ptr/hash/1.cc	(revision 0)
@@ -0,0 +1,48 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-06-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <memory>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  struct T { };
+
+  std::unique_ptr<T>                                 u0(new T);
+  std::hash<std::unique_ptr<T>>                      hu0;
+  std::hash<typename std::unique_ptr<T>::pointer>    hp0;
+
+  VERIFY( hu0(u0) == hp0(u0.get()) );
+
+  std::unique_ptr<T[]>                               u1(new T[10]);
+  std::hash<std::unique_ptr<T[]>>                    hu1;
+  std::hash<typename std::unique_ptr<T[]>::pointer>  hp1;
+
+  VERIFY( hu1(u1) == hp1(u1.get()) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/20_util/shared_ptr/hash/1.cc
===================================================================
--- testsuite/20_util/shared_ptr/hash/1.cc	(revision 0)
+++ testsuite/20_util/shared_ptr/hash/1.cc	(revision 0)
@@ -0,0 +1,48 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-06-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <memory>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  struct T { };
+
+  std::shared_ptr<T>                s0(new T);
+  std::hash<std::shared_ptr<T>>     hs0;
+  std::hash<T*>                     hp0;
+
+  VERIFY( hs0(s0) == hp0(s0.get()) );
+
+  std::__shared_ptr<T>              s1(new T);
+  std::hash<std::__shared_ptr<T>>   hs1;
+  std::hash<T*>                     hp1;
+
+  VERIFY( hs1(s1) == hp1(s1.get()) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
