Patchwork [v3] libstdc++/47773

login
register
mail settings
Submitter Paolo Carlini
Date Feb. 17, 2011, 1:26 a.m.
Message ID <4D5C793C.4090009@oracle.com>
Download mbox | patch
Permalink /patch/83420/
State New
Headers show

Comments

Paolo Carlini - Feb. 17, 2011, 1:26 a.m.
Hi,

tested x86_64-linux, committed to mainline.

Paolo.

//////////////////////////
2011-02-16  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/47773
	* include/ext/vstring.h (hash<__gnu_cxx::__vstring>,
	hash<__gnu_cxx::__wvstring>, hash<__gnu_cxx::__u16vstring>,
	hash<__gnu_cxx::__u32vstring>): Add.
	* testsuite/ext/vstring/hash/char/1.cc: New.
	* testsuite/ext/vstring/hash/wchar_t/1.cc: Likewise.
H.J. Lu - Feb. 17, 2011, 3:59 a.m.
On Wed, Feb 16, 2011 at 5:26 PM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
> Hi,
>
> tested x86_64-linux, committed to mainline.
>
> Paolo.

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47776

They fail only on ia32.

Patch

Index: include/ext/vstring.h
===================================================================
--- include/ext/vstring.h	(revision 170209)
+++ include/ext/vstring.h	(working copy)
@@ -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 */
Index: testsuite/ext/vstring/hash/wchar_t/1.cc
===================================================================
--- testsuite/ext/vstring/hash/wchar_t/1.cc	(revision 0)
+++ testsuite/ext/vstring/hash/wchar_t/1.cc	(revision 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::__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;
+}
Index: testsuite/ext/vstring/hash/char/1.cc
===================================================================
--- testsuite/ext/vstring/hash/char/1.cc	(revision 0)
+++ testsuite/ext/vstring/hash/char/1.cc	(revision 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;
+}