Author: marshall Date: Wed Mar 22 21:40:28 2017 New Revision: 298573 URL: http://llvm.org/viewvc/llvm-project?rev=298573&view=rev Log: Implement P0599: 'noexcept for hash functions'. Fix a couple of hash functions (optional<T> and unique_ptr<T>) which were mistakenly marked as 'noexcept'. Reviewed as https://reviews.llvm.org/D31234
Modified: libcxx/trunk/include/memory libcxx/trunk/include/optional libcxx/trunk/include/thread libcxx/trunk/include/variant libcxx/trunk/test/std/containers/sequences/vector.bool/vector_bool.pass.cpp libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_code.pass.cpp libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp libcxx/trunk/test/std/strings/basic.string.hash/strings.pass.cpp libcxx/trunk/test/std/strings/string.view/string.view.hash/string_view.pass.cpp libcxx/trunk/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp libcxx/trunk/test/std/utilities/function.objects/unord.hash/enum.pass.cpp libcxx/trunk/test/std/utilities/function.objects/unord.hash/floating.pass.cpp libcxx/trunk/test/std/utilities/function.objects/unord.hash/integral.pass.cpp libcxx/trunk/test/std/utilities/function.objects/unord.hash/pointer.pass.cpp libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp libcxx/trunk/test/std/utilities/template.bitset/bitset.hash/bitset.pass.cpp libcxx/trunk/test/std/utilities/variant/variant.hash/hash.pass.cpp Modified: libcxx/trunk/include/memory URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/memory?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/include/memory (original) +++ libcxx/trunk/include/memory Wed Mar 22 21:40:28 2017 @@ -3037,7 +3037,7 @@ struct _LIBCPP_TEMPLATE_VIS hash<__enabl typedef unique_ptr<_Tp, _Dp> argument_type; typedef size_t result_type; _LIBCPP_INLINE_VISIBILITY - result_type operator()(const argument_type& __ptr) const _NOEXCEPT + result_type operator()(const argument_type& __ptr) const { typedef typename argument_type::pointer pointer; return hash<pointer>()(__ptr.get()); Modified: libcxx/trunk/include/optional URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/include/optional (original) +++ libcxx/trunk/include/optional Wed Mar 22 21:40:28 2017 @@ -1301,7 +1301,7 @@ struct _LIBCPP_TEMPLATE_VIS hash< typedef size_t result_type; _LIBCPP_INLINE_VISIBILITY - result_type operator()(const argument_type& __opt) const _NOEXCEPT + result_type operator()(const argument_type& __opt) const { return static_cast<bool>(__opt) ? hash<remove_const_t<_Tp>>()(*__opt) : 0; } Modified: libcxx/trunk/include/thread URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/thread?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/include/thread (original) +++ libcxx/trunk/include/thread Wed Mar 22 21:40:28 2017 @@ -261,7 +261,7 @@ struct _LIBCPP_TEMPLATE_VIS hash<__threa : public unary_function<__thread_id, size_t> { _LIBCPP_INLINE_VISIBILITY - size_t operator()(__thread_id __v) const + size_t operator()(__thread_id __v) const _NOEXCEPT { return hash<__libcpp_thread_id>()(__v.__id_); } Modified: libcxx/trunk/include/variant URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/variant?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/include/variant (original) +++ libcxx/trunk/include/variant Wed Mar 22 21:40:28 2017 @@ -1562,7 +1562,7 @@ struct _LIBCPP_TEMPLATE_VIS hash<monosta using result_type = size_t; inline _LIBCPP_INLINE_VISIBILITY - result_type operator()(const argument_type&) const { + result_type operator()(const argument_type&) const _NOEXCEPT { return 66740831; // return a fundamentally attractive random value. } }; Modified: libcxx/trunk/test/std/containers/sequences/vector.bool/vector_bool.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector.bool/vector_bool.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/containers/sequences/vector.bool/vector_bool.pass.cpp (original) +++ libcxx/trunk/test/std/containers/sequences/vector.bool/vector_bool.pass.cpp Wed Mar 22 21:40:28 2017 @@ -31,7 +31,8 @@ int main() typedef std::hash<T> H; static_assert((std::is_same<H::argument_type, T>::value), "" ); static_assert((std::is_same<H::result_type, std::size_t>::value), "" ); - + ASSERT_NOEXCEPT(H()(T())); + bool ba[] = {true, false, true, true, false}; T vb(std::begin(ba), std::end(ba)); H h; @@ -43,6 +44,7 @@ int main() typedef std::hash<T> H; static_assert((std::is_same<H::argument_type, T>::value), "" ); static_assert((std::is_same<H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); bool ba[] = {true, false, true, true, false}; T vb(std::begin(ba), std::end(ba)); H h; Modified: libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_code.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_code.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_code.pass.cpp (original) +++ libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_code.pass.cpp Wed Mar 22 21:40:28 2017 @@ -29,6 +29,7 @@ test(int i) typedef std::hash<T> H; static_assert((std::is_same<H::argument_type, T>::value), "" ); static_assert((std::is_same<H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); H h; T ec(i, std::system_category()); const std::size_t result = h(ec); Modified: libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp (original) +++ libcxx/trunk/test/std/diagnostics/syserr/syserr.hash/error_condition.pass.cpp Wed Mar 22 21:40:28 2017 @@ -29,6 +29,7 @@ test(int i) typedef std::hash<T> H; static_assert((std::is_same<H::argument_type, T>::value), "" ); static_assert((std::is_same<H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); H h; T ec(i, std::system_category()); const std::size_t result = h(ec); Modified: libcxx/trunk/test/std/strings/basic.string.hash/strings.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string.hash/strings.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/strings/basic.string.hash/strings.pass.cpp (original) +++ libcxx/trunk/test/std/strings/basic.string.hash/strings.pass.cpp Wed Mar 22 21:40:28 2017 @@ -22,6 +22,8 @@ #include <cassert> #include <type_traits> +#include "test_macros.h" + template <class T> void test() @@ -29,6 +31,8 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); + H h; std::string g1 = "1234567890"; std::string g2 = "1234567891"; Modified: libcxx/trunk/test/std/strings/string.view/string.view.hash/string_view.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/string.view/string.view.hash/string_view.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/strings/string.view/string.view.hash/string_view.pass.cpp (original) +++ libcxx/trunk/test/std/strings/string.view/string.view.hash/string_view.pass.cpp Wed Mar 22 21:40:28 2017 @@ -23,6 +23,8 @@ #include <cassert> #include <type_traits> +#include "test_macros.h" + using std::string_view; template <class SV> @@ -36,6 +38,7 @@ test() typedef typename SV::value_type char_type; typedef std::basic_string<char_type> String; typedef std::hash<String> SH; + ASSERT_NOEXCEPT(H()(SV())); char_type g1 [ 10 ]; char_type g2 [ 10 ]; Modified: libcxx/trunk/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp (original) +++ libcxx/trunk/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/thread_id.pass.cpp Wed Mar 22 21:40:28 2017 @@ -23,6 +23,8 @@ #include <thread> #include <cassert> +#include "test_macros.h" + int main() { std::thread::id id1; @@ -30,6 +32,7 @@ int main() typedef std::hash<std::thread::id> H; static_assert((std::is_same<typename H::argument_type, std::thread::id>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(id2)); H h; assert(h(id1) != h(id2)); } Modified: libcxx/trunk/test/std/utilities/function.objects/unord.hash/enum.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/unord.hash/enum.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/function.objects/unord.hash/enum.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/function.objects/unord.hash/enum.pass.cpp Wed Mar 22 21:40:28 2017 @@ -36,6 +36,7 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); typedef typename std::underlying_type<T>::type under_type; H h1; Modified: libcxx/trunk/test/std/utilities/function.objects/unord.hash/floating.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/unord.hash/floating.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/function.objects/unord.hash/floating.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/function.objects/unord.hash/floating.pass.cpp Wed Mar 22 21:40:28 2017 @@ -24,6 +24,8 @@ #include <limits> #include <cmath> +#include "test_macros.h" + template <class T> void test() @@ -31,6 +33,7 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); H h; std::size_t t0 = h(0.); Modified: libcxx/trunk/test/std/utilities/function.objects/unord.hash/integral.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/unord.hash/integral.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/function.objects/unord.hash/integral.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/function.objects/unord.hash/integral.pass.cpp Wed Mar 22 21:40:28 2017 @@ -31,6 +31,7 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); H h; for (int i = 0; i <= 5; ++i) @@ -64,42 +65,42 @@ int main() test<long long>(); test<unsigned long long>(); -// LWG #2119 +// LWG #2119 test<std::ptrdiff_t>(); test<size_t>(); - test<int8_t>(); - test<int16_t>(); - test<int32_t>(); - test<int64_t>(); - - test<int_fast8_t>(); - test<int_fast16_t>(); - test<int_fast32_t>(); - test<int_fast64_t>(); - - test<int_least8_t>(); - test<int_least16_t>(); - test<int_least32_t>(); - test<int_least64_t>(); + test<int8_t>(); + test<int16_t>(); + test<int32_t>(); + test<int64_t>(); + + test<int_fast8_t>(); + test<int_fast16_t>(); + test<int_fast32_t>(); + test<int_fast64_t>(); + + test<int_least8_t>(); + test<int_least16_t>(); + test<int_least32_t>(); + test<int_least64_t>(); test<intmax_t>(); test<intptr_t>(); - test<uint8_t>(); - test<uint16_t>(); - test<uint32_t>(); - test<uint64_t>(); - - test<uint_fast8_t>(); - test<uint_fast16_t>(); - test<uint_fast32_t>(); - test<uint_fast64_t>(); - - test<uint_least8_t>(); - test<uint_least16_t>(); - test<uint_least32_t>(); - test<uint_least64_t>(); + test<uint8_t>(); + test<uint16_t>(); + test<uint32_t>(); + test<uint64_t>(); + + test<uint_fast8_t>(); + test<uint_fast16_t>(); + test<uint_fast32_t>(); + test<uint_fast64_t>(); + + test<uint_least8_t>(); + test<uint_least16_t>(); + test<uint_least32_t>(); + test<uint_least64_t>(); test<uintmax_t>(); test<uintptr_t>(); Modified: libcxx/trunk/test/std/utilities/function.objects/unord.hash/pointer.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/unord.hash/pointer.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/function.objects/unord.hash/pointer.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/function.objects/unord.hash/pointer.pass.cpp Wed Mar 22 21:40:28 2017 @@ -23,6 +23,8 @@ #include <type_traits> #include <limits> +#include "test_macros.h" + template <class T> void test() @@ -30,6 +32,7 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); H h; typedef typename std::remove_pointer<T>::type type; @@ -38,7 +41,17 @@ test() assert(h(&i) != h(&j)); } +void test_nullptr() +{ + typedef std::nullptr_t T; + typedef std::hash<T> H; + static_assert((std::is_same<typename H::argument_type, T>::value), "" ); + static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); +} + int main() { test<int*>(); + test_nullptr(); } Modified: libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.hash/hash_unique_ptr.pass.cpp Wed Mar 22 21:40:28 2017 @@ -67,6 +67,7 @@ int main() int* ptr = new int; std::unique_ptr<int> p(ptr); std::hash<std::unique_ptr<int> > f; + ASSERT_NOT_NOEXCEPT(f(p)); std::size_t h = f(p); assert(h == std::hash<int*>()(ptr)); } Modified: libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp Wed Mar 22 21:40:28 2017 @@ -36,6 +36,7 @@ int main() { typedef int T; optional<T> opt; + ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt)); assert(std::hash<optional<T>>{}(opt) == nullopt_hash); opt = 2; assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt)); @@ -43,6 +44,7 @@ int main() { typedef std::string T; optional<T> opt; + ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt)); assert(std::hash<optional<T>>{}(opt) == nullopt_hash); opt = std::string("123"); assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt)); @@ -50,6 +52,7 @@ int main() { typedef std::unique_ptr<int> T; optional<T> opt; + ASSERT_NOT_NOEXCEPT(std::hash<optional<T>>()(opt)); assert(std::hash<optional<T>>{}(opt) == nullopt_hash); opt = std::unique_ptr<int>(new int(3)); assert(std::hash<optional<T>>{}(opt) == std::hash<T>{}(*opt)); Modified: libcxx/trunk/test/std/utilities/template.bitset/bitset.hash/bitset.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/template.bitset/bitset.hash/bitset.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/template.bitset/bitset.hash/bitset.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/template.bitset/bitset.hash/bitset.pass.cpp Wed Mar 22 21:40:28 2017 @@ -30,6 +30,8 @@ test() typedef std::hash<T> H; static_assert((std::is_same<typename H::argument_type, T>::value), "" ); static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" ); + ASSERT_NOEXCEPT(H()(T())); + H h; T bs(static_cast<unsigned long long>(N)); const std::size_t result = h(bs); Modified: libcxx/trunk/test/std/utilities/variant/variant.hash/hash.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/variant/variant.hash/hash.pass.cpp?rev=298573&r1=298572&r2=298573&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/variant/variant.hash/hash.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/variant/variant.hash/hash.pass.cpp Wed Mar 22 21:40:28 2017 @@ -102,6 +102,7 @@ void test_hash_monostate() { assert(h(m1) == h(m2)); { ASSERT_SAME_TYPE(decltype(h(m1)), std::size_t); + ASSERT_NOEXCEPT(h(m1)); static_assert(std::is_copy_constructible<H>::value, ""); } { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits