[libcxx] r298573 - 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
Marshall Clow via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 22 19:40:29 PDT 2017
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, "");
}
{
More information about the cfe-commits
mailing list