$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63716 - in trunk: boost/functional/hash libs/functional/hash/test
From: daniel_james_at_[hidden]
Date: 2010-07-06 19:32:39
Author: danieljames
Date: 2010-07-06 19:32:37 EDT (Tue, 06 Jul 2010)
New Revision: 63716
URL: http://svn.boost.org/trac/boost/changeset/63716
Log:
Try preventing static casts when calling `hash_value`.
Added:
   trunk/libs/functional/hash/test/implicit_fail_test.cpp   (contents, props changed)
   trunk/libs/functional/hash/test/shared_ptr_fail_test.cpp   (contents, props changed)
Text files modified: 
   trunk/boost/functional/hash/hash.hpp       |     9 +++++++++                               
   trunk/libs/functional/hash/test/Jamfile.v2 |     2 ++                                      
   2 files changed, 11 insertions(+), 0 deletions(-)
Modified: trunk/boost/functional/hash/hash.hpp
==============================================================================
--- trunk/boost/functional/hash/hash.hpp	(original)
+++ trunk/boost/functional/hash/hash.hpp	2010-07-06 19:32:37 EDT (Tue, 06 Jul 2010)
@@ -15,6 +15,7 @@
 #include <boost/functional/hash/detail/hash_float.hpp>
 #include <string>
 #include <boost/limits.hpp>
+#include <boost/static_assert.hpp>
 
 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 #include <boost/type_traits/is_pointer.hpp>
@@ -29,6 +30,14 @@
 
 namespace boost
 {
+    // If you get a static assertion here, it's because hash_value
+    // isn't declared for your type.
+    template <typename T>
+    std::size_t hash_value(T const&) {
+        BOOST_STATIC_ASSERT((T*) 0 && false);
+        return 0;
+    }
+
     std::size_t hash_value(bool);
     std::size_t hash_value(char);
     std::size_t hash_value(unsigned char);
Modified: trunk/libs/functional/hash/test/Jamfile.v2
==============================================================================
--- trunk/libs/functional/hash/test/Jamfile.v2	(original)
+++ trunk/libs/functional/hash/test/Jamfile.v2	2010-07-06 19:32:37 EDT (Tue, 06 Jul 2010)
@@ -50,6 +50,8 @@
         [ run container_no_fwd_test.cpp ]
         [ compile-fail hash_no_ext_fail_test.cpp ]
         [ compile-fail namespace_fail_test.cpp ]
+        [ compile-fail implicit_fail_test.cpp ]
+        [ compile-fail shared_ptr_fail_test.cpp ]
         [ run hash_no_ext_macro_1.cpp ]
         [ run hash_no_ext_macro_2.cpp ]
     ;
Added: trunk/libs/functional/hash/test/implicit_fail_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/functional/hash/test/implicit_fail_test.cpp	2010-07-06 19:32:37 EDT (Tue, 06 Jul 2010)
@@ -0,0 +1,16 @@
+#include <boost/functional/hash.hpp>
+
+namespace test
+{
+    struct base {};
+    std::size_t hash_value(base const&) { return 0; }
+    
+    struct converts { operator base() const { return base(); } };
+}
+
+int main() {
+    boost::hash<test::converts> hash;
+    test::converts x;
+    
+    hash(x);
+}
\ No newline at end of file
Added: trunk/libs/functional/hash/test/shared_ptr_fail_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/functional/hash/test/shared_ptr_fail_test.cpp	2010-07-06 19:32:37 EDT (Tue, 06 Jul 2010)
@@ -0,0 +1,11 @@
+#include <boost/functional/hash.hpp>
+#include <boost/shared_ptr.hpp>
+
+// This should obviously pass if shared_ptr ever supports Boost.Hash.
+
+int main() {
+    boost::hash<boost::shared_ptr<int> > hash;
+    boost::shared_ptr<int> x(new int(10));
+    
+    hash(x);
+}
\ No newline at end of file