Implement N3672, optional<T>.

llvm-svn: 189772
diff --git a/libcxx/test/utilities/optional/optional.hash/hash.pass.cpp b/libcxx/test/utilities/optional/optional.hash/hash.pass.cpp
new file mode 100644
index 0000000..406632a
--- /dev/null
+++ b/libcxx/test/utilities/optional/optional.hash/hash.pass.cpp
@@ -0,0 +1,48 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <optional>
+
+// template <class T> struct hash<optional<T>>;
+
+#include <optional>
+#include <string>
+#include <memory>
+#include <cassert>
+
+#if _LIBCPP_STD_VER > 11
+
+#endif  // _LIBCPP_STD_VER > 11
+
+int main()
+{
+#if _LIBCPP_STD_VER > 11
+    {
+        typedef int T;
+        std::optional<T> opt;
+        assert(std::hash<std::optional<T>>{}(opt) == 0);
+        opt = 2;
+        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
+    }
+    {
+        typedef std::string T;
+        std::optional<T> opt;
+        assert(std::hash<std::optional<T>>{}(opt) == 0);
+        opt = std::string("123");
+        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
+    }
+    {
+        typedef std::unique_ptr<int> T;
+        std::optional<T> opt;
+        assert(std::hash<std::optional<T>>{}(opt) == 0);
+        opt = std::unique_ptr<int>(new int(3));
+        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
+    }
+#endif  // _LIBCPP_STD_VER > 11
+}