diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2014-03-06 04:11:10 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2014-03-06 04:11:10 +0000 |
| commit | 8845dbd7987ce70c4a8fa057742e11454651f509 (patch) | |
| tree | 68b4962af9d30ab7d4d0c9bf111f4933bd010f12 /libcxx/test | |
| parent | d1163aa59e293754ed1f6acfad03a7dc4bd3e9c9 (diff) | |
| download | bcm5719-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.cpp | 17 | ||||
| -rw-r--r-- | libcxx/test/extensions/hash/specializations.pass.cpp | 29 | ||||
| -rw-r--r-- | libcxx/test/extensions/nothing_to_do.pass.cpp | 12 |
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() +{ +} |

