diff --git a/include/string b/include/string
index 3b01c41..8d4e13c 100644
--- a/include/string
+++ b/include/string
@@ -1420,7 +1420,7 @@
     _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
 
     _LIBCPP_INLINE_VISIBILITY void __clear_and_shrink() _NOEXCEPT;
-    
+
     _LIBCPP_INLINE_VISIBILITY
     bool __is_long() const _NOEXCEPT
         {return bool(__r_.first().__s.__size_ & __short_mask);}
@@ -1682,7 +1682,7 @@
   -> basic_string<_CharT, _Traits, _Allocator>;
 #endif
 
-                  
+
 template <class _CharT, class _Traits, class _Allocator>
 inline
 void
@@ -4227,21 +4227,17 @@
     const typename basic_string<_CharT, _Traits, _Allocator>::size_type
                    basic_string<_CharT, _Traits, _Allocator>::npos;
 
-template<class _CharT, class _Traits, class _Allocator>
-struct _LIBCPP_TEMPLATE_VIS hash<basic_string<_CharT, _Traits, _Allocator> >
-    : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
+template <class _CharT, class _Allocator>
+struct _LIBCPP_TEMPLATE_VIS
+    hash<basic_string<_CharT, char_traits<_CharT>, _Allocator> >
+    : public unary_function<
+          basic_string<_CharT, char_traits<_CharT>, _Allocator>, size_t>
 {
     size_t
-        operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
+    operator()(const basic_string<_CharT, char_traits<_CharT>, _Allocator>& __val) const _NOEXCEPT
+    { return __do_string_hash(__val.data(), __val.data() + __val.size()); }
 };
 
-template<class _CharT, class _Traits, class _Allocator>
-size_t
-hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
-        const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
-{
-    return __do_string_hash(__val.data(), __val.data() + __val.size());
-}
 
 template<class _CharT, class _Traits, class _Allocator>
 basic_ostream<_CharT, _Traits>&
diff --git a/test/std/strings/basic.string.hash/char_type_hash.fail.cpp b/test/std/strings/basic.string.hash/char_type_hash.fail.cpp
new file mode 100644
index 0000000..542ae05
--- /dev/null
+++ b/test/std/strings/basic.string.hash/char_type_hash.fail.cpp
@@ -0,0 +1,66 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++98, c++03
+
+// <string>
+
+// Test that hash specializations for <string> require "char_traits<_CharT>" not just any "_Trait".
+
+#include <string>
+
+template <class _CharT>
+struct trait // copied from <__string>
+{
+    typedef _CharT         char_type;
+    typedef int            int_type;
+    typedef std::streamoff off_type;
+    typedef std::streampos pos_type;
+    typedef std::mbstate_t state_type;
+
+    static inline void assign(char_type& __c1, const char_type& __c2) {
+        __c1 = __c2;
+    }
+    static inline bool eq(char_type __c1, char_type __c2) { return __c1 == __c2; }
+    static inline bool lt(char_type __c1, char_type __c2) { return __c1 < __c2; }
+
+    static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
+    static size_t length(const char_type* __s);
+    static const char_type* find(const char_type* __s, size_t __n,
+                                 const char_type& __a);
+
+    static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
+    static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
+    static char_type* assign(char_type* __s, size_t __n, char_type __a);
+
+    static inline int_type not_eof(int_type __c) {
+        return eq_int_type(__c, eof()) ? ~eof() : __c;
+    }
+    static inline char_type to_char_type(int_type __c) { return char_type(__c); }
+    static inline int_type to_int_type(char_type __c) { return int_type(__c); }
+    static inline bool eq_int_type(int_type __c1, int_type __c2) {
+        return __c1 == __c2;
+    }
+    static inline int_type eof() { return int_type(EOF); }
+};
+
+template <class CharT>
+void test() {
+    typedef std::basic_string<CharT, trait<CharT> > str_t;
+    std::hash<str_t>
+        h; // call to implicitly-deleted default constructor of 'std::hash<str_t>' {{*}}}}
+}
+
+int main(int, char**) {
+    test<char>();
+    test<wchar_t>();
+    test<char16_t>();
+    test<char32_t>();
+
+    return 0;
+}
