===================================================================
@@ -2731,6 +2731,66 @@
#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+
+#include <bits/functional_hash.h>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+ /// std::hash specialization for __vstring.
+ template<>
+ struct hash<__gnu_cxx::__vstring>
+ : public __hash_base<size_t, __gnu_cxx::__vstring>
+ {
+ size_t
+ operator()(const __gnu_cxx::__vstring& __s) const
+ { return std::_Hash_impl::hash(__s.data(), __s.length()); }
+ };
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+ /// std::hash specialization for __wvstring.
+ template<>
+ struct hash<__gnu_cxx::__wvstring>
+ : public __hash_base<size_t, __gnu_cxx::__wvstring>
+ {
+ size_t
+ operator()(const __gnu_cxx::__wvstring& __s) const
+ { return std::_Hash_impl::hash(__s.data(),
+ __s.length() * sizeof(wchar_t)); }
+ };
+#endif
+
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+ /// std::hash specialization for __u16vstring.
+ template<>
+ struct hash<__gnu_cxx::__u16vstring>
+ : public __hash_base<size_t, __gnu_cxx::__u16vstring>
+ {
+ size_t
+ operator()(const __gnu_cxx::__u16vstring& __s) const
+ { return std::_Hash_impl::hash(__s.data(),
+ __s.length() * sizeof(char16_t)); }
+ };
+
+ /// std::hash specialization for __u32vstring.
+ template<>
+ struct hash<__gnu_cxx::__u32vstring>
+ : public __hash_base<size_t, __gnu_cxx::__u32vstring>
+ {
+ size_t
+ operator()(const __gnu_cxx::__u32vstring& __s) const
+ { return std::_Hash_impl::hash(__s.data(),
+ __s.length() * sizeof(char32_t)); }
+ };
+#endif
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+
+#endif /* __GXX_EXPERIMENTAL_CXX0X__ */
+
#include "vstring.tcc"
#endif /* _VSTRING_H */
===================================================================
@@ -0,0 +1,55 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-require-string-conversions "" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <ext/vstring.h>
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+// libstdc++/47773
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ typedef __gnu_cxx::__wvstring vstring_t;
+ typedef std::unordered_map<vstring_t, int> map_t;
+
+ map_t mymap;
+
+ mymap.insert(std::make_pair(L"hello", 10));
+ mymap.insert(std::make_pair(L"hi", 20));
+
+ VERIFY( mymap.size() == 2 );
+
+ map_t::const_iterator imap = mymap.begin();
+
+ VERIFY( vstring_t(imap->first.c_str()) == L"hi" );
+ VERIFY( imap->second == 20 );
+
+ ++imap;
+
+ VERIFY( vstring_t(imap->first.c_str()) == L"hello" );
+ VERIFY( imap->second == 10 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
===================================================================
@@ -0,0 +1,55 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-require-string-conversions "" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <ext/vstring.h>
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+// libstdc++/47773
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ typedef __gnu_cxx::__vstring vstring_t;
+ typedef std::unordered_map<vstring_t, int> map_t;
+
+ map_t mymap;
+
+ mymap.insert(std::make_pair("hello", 10));
+ mymap.insert(std::make_pair("hi", 20));
+
+ VERIFY( mymap.size() == 2 );
+
+ map_t::const_iterator imap = mymap.begin();
+
+ VERIFY( vstring_t(imap->first.c_str()) == "hi" );
+ VERIFY( imap->second == 20 );
+
+ ++imap;
+
+ VERIFY( vstring_t(imap->first.c_str()) == "hello" );
+ VERIFY( imap->second == 10 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}