summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-03-06 04:11:10 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-03-06 04:11:10 +0000
commit8845dbd7987ce70c4a8fa057742e11454651f509 (patch)
tree68b4962af9d30ab7d4d0c9bf111f4933bd010f12 /libcxx/test
parentd1163aa59e293754ed1f6acfad03a7dc4bd3e9c9 (diff)
downloadbcm5719-llvm-8845dbd7987ce70c4a8fa057742e11454651f509.tar.gz
bcm5719-llvm-8845dbd7987ce70c4a8fa057742e11454651f509.zip
Do not derive __gnu_cxx::hash<T> from std::hash<T>.
Instead, define explicit specializations for the basic types listed in the SGI documentation. This solves two problems: 1) Helps avoid silent ODR violations caused by the absence of a user-supplied __gnu_cxx::hash specialization in cases where a std::hash specialization exists (e.g. for std::string). 2) __gnu_cxx::hash semantics are slightly different to those of std::hash (for example, the former may dereference a pointer argument) so it is inappropriate for __gnu_cxx::hash to receive std::hash specializations by default. Differential Revision: http://llvm-reviews.chandlerc.com/D2747 llvm-svn: 203070
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/extensions/hash/specializations.fail.cpp17
-rw-r--r--libcxx/test/extensions/hash/specializations.pass.cpp29
-rw-r--r--libcxx/test/extensions/nothing_to_do.pass.cpp12
3 files changed, 58 insertions, 0 deletions
diff --git a/libcxx/test/extensions/hash/specializations.fail.cpp b/libcxx/test/extensions/hash/specializations.fail.cpp
new file mode 100644
index 00000000000..8eeffb5802e
--- /dev/null
+++ b/libcxx/test/extensions/hash/specializations.fail.cpp
@@ -0,0 +1,17 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+#include <assert.h>
+#include <ext/hash_map>
+#include <string>
+
+int main()
+{
+ assert(__gnu_cxx::hash<std::string>()(std::string()) == 0); // error
+}
diff --git a/libcxx/test/extensions/hash/specializations.pass.cpp b/libcxx/test/extensions/hash/specializations.pass.cpp
new file mode 100644
index 00000000000..884614ec8a2
--- /dev/null
+++ b/libcxx/test/extensions/hash/specializations.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+#include <assert.h>
+#include <ext/hash_map>
+#include <string>
+
+int main()
+{
+ char str[] = "test";
+ assert(__gnu_cxx::hash<const char *>()("test") ==
+ std::hash<std::string>()("test"));
+ assert(__gnu_cxx::hash<char *>()(str) == std::hash<std::string>()("test"));
+ assert(__gnu_cxx::hash<char>()(42) == 42);
+ assert(__gnu_cxx::hash<signed char>()(42) == 42);
+ assert(__gnu_cxx::hash<unsigned char>()(42) == 42);
+ assert(__gnu_cxx::hash<short>()(42) == 42);
+ assert(__gnu_cxx::hash<unsigned short>()(42) == 42);
+ assert(__gnu_cxx::hash<int>()(42) == 42);
+ assert(__gnu_cxx::hash<unsigned int>()(42) == 42);
+ assert(__gnu_cxx::hash<long>()(42) == 42);
+ assert(__gnu_cxx::hash<unsigned long>()(42) == 42);
+}
diff --git a/libcxx/test/extensions/nothing_to_do.pass.cpp b/libcxx/test/extensions/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..b58f5c55b64
--- /dev/null
+++ b/libcxx/test/extensions/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
OpenPOWER on IntegriCloud