Implement P0513R0 - "Poisoning the Hash"

Summary:
Exactly what the title says.

This patch also adds a `std::hash<nullptr_t>` specialization in C++17, but it was not added by this paper and I can't find the actual paper that adds it.

See http://wg21.link/P0513R0 for more info.

If there are no comments in the next couple of days I'll commit this

Reviewers: mclow.lists, K-ballo, EricWF

Reviewed By: EricWF

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D28938

llvm-svn: 292684
diff --git a/libcxx/test/std/utilities/optional/optional.hash/hash.pass.cpp b/libcxx/test/std/utilities/optional/optional.hash/hash.pass.cpp
index dfdd07d..ea89dc3 100644
--- a/libcxx/test/std/utilities/optional/optional.hash/hash.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.hash/hash.pass.cpp
@@ -17,6 +17,15 @@
 #include <memory>
 #include <cassert>
 
+#include "poisoned_hash_helper.hpp"
+
+struct A {};
+struct B {};
+
+template <>
+struct std::hash<B> {
+  size_t operator()(B const&) { return 0; }
+};
 
 int main()
 {
@@ -45,4 +54,16 @@
         opt = std::unique_ptr<int>(new int(3));
         assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt));
     }
+    {
+      test_hash_enabled_for_type<std::optional<int> >();
+      test_hash_enabled_for_type<std::optional<int*> >();
+      test_hash_enabled_for_type<std::optional<const int> >();
+      test_hash_enabled_for_type<std::optional<int* const> >();
+
+      test_hash_disabled_for_type<std::optional<A>>();
+      test_hash_disabled_for_type<std::optional<const A>>();
+
+      test_hash_enabled_for_type<std::optional<B>>();
+      test_hash_enabled_for_type<std::optional<const B>>();
+    }
 }