Author: bion
Date: Thu Apr  6 18:50:21 2017
New Revision: 299734

URL: http://llvm.org/viewvc/llvm-project?rev=299734&view=rev
Log:
Allow a standard library to implement conditional noexcept for optional and 
unique_ptr hash functions.

These tests were unconditionally asserting that optional and unique_ptr declare 
throwing hashes, but MSVC++ implements conditional noexcept forwarding that of 
the underlying hash function. As a result we were failing these tests but 
there's nothing forbidding strengthening noexcept in that way.

Changed the ASSERT_NOT_NOEXCEPT asserts to use types which themselves have 
non-noexcept hash functions.

Modified:
    
libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp
    libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp

Modified: 
libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp?rev=299734&r1=299733&r2=299734&view=diff
==============================================================================
--- 
libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp
 (original)
+++ 
libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp
 Thu Apr  6 18:50:21 2017
@@ -67,10 +67,14 @@ int main()
     int* ptr = new int;
     std::unique_ptr<int> p(ptr);
     std::hash<std::unique_ptr<int> > f;
-    ASSERT_NOT_NOEXCEPT(f(p));
     std::size_t h = f(p);
     assert(h == std::hash<int*>()(ptr));
   }
+  {
+    std::unique_ptr<int, PointerDeleter<int, 1>> pThrowingHash;
+    std::hash<std::unique_ptr<int, PointerDeleter<int, 1>>> fThrowingHash;
+    ASSERT_NOT_NOEXCEPT(fThrowingHash(pThrowingHash));
+  }
 #if TEST_STD_VER >= 11
   {
     test_enabled_with_deleter<int, Deleter<int>>();

Modified: libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp?rev=299734&r1=299733&r2=299734&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp 
(original)
+++ libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp Thu 
Apr  6 18:50:21 2017
@@ -38,9 +38,14 @@ int main()
         std::hash<optional<double>>{}(optional<double>{});
 
     {
+        optional<B> opt;
+        ASSERT_NOT_NOEXCEPT(std::hash<optional<B>>()(opt));
+        ASSERT_NOT_NOEXCEPT(std::hash<optional<const B>>()(opt));
+    }
+
+    {
         typedef int T;
         optional<T> opt;
-        ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt));
         assert(std::hash<optional<T>>{}(opt) == nullopt_hash);
         opt = 2;
         assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt));
@@ -48,7 +53,6 @@ int main()
     {
         typedef std::string T;
         optional<T> opt;
-        ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt));
         assert(std::hash<optional<T>>{}(opt) == nullopt_hash);
         opt = std::string("123");
         assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt));
@@ -56,7 +60,6 @@ int main()
     {
         typedef std::unique_ptr<int> T;
         optional<T> opt;
-        ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt));
         assert(std::hash<optional<T>>{}(opt) == nullopt_hash);
         opt = std::unique_ptr<int>(new int(3));
         assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt));


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to