forked from OSchip/llvm-project
Allow a standard library to implement conditional noexcept for optional and unique_ptr hash functions.
These tests were unconditionally asserting that optional and unique_ptr declare throwing hashes, but MSVC++ implements conditional noexcept forwarding that of the underlying hash function. As a result we were failing these tests but there's nothing forbidding strengthening noexcept in that way. Changed the ASSERT_NOT_NOEXCEPT asserts to use types which themselves have non-noexcept hash functions. llvm-svn: 300516
This commit is contained in:
parent
1d2ae94b5d
commit
e52a34bd9d
|
@ -50,7 +50,7 @@ namespace std {
|
|||
|
||||
template <class T>
|
||||
struct hash<::min_pointer<T, std::integral_constant<size_t, 1>>> {
|
||||
size_t operator()(::min_pointer<T, std::integral_constant<size_t, 1>> p) const noexcept(false) {
|
||||
size_t operator()(::min_pointer<T, std::integral_constant<size_t, 1>> p) const TEST_NOEXCEPT_FALSE {
|
||||
if (!p) return 0;
|
||||
return std::hash<T*>{}(std::addressof(*p));
|
||||
}
|
||||
|
@ -67,11 +67,15 @@ 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));
|
||||
}
|
||||
#if TEST_STD_VER >= 11
|
||||
{
|
||||
std::unique_ptr<int, PointerDeleter<int, 1>> pThrowingHash;
|
||||
std::hash<std::unique_ptr<int, PointerDeleter<int, 1>>> fThrowingHash;
|
||||
ASSERT_NOT_NOEXCEPT(fThrowingHash(pThrowingHash));
|
||||
}
|
||||
{
|
||||
test_enabled_with_deleter<int, Deleter<int>>();
|
||||
test_enabled_with_deleter<int[], Deleter<int[]>>();
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace std {
|
|||
|
||||
template <>
|
||||
struct hash<B> {
|
||||
size_t operator()(B const&) noexcept(false) { return 0; }
|
||||
size_t operator()(B const&) TEST_NOEXCEPT_FALSE { return 0; }
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -37,10 +37,16 @@ int main()
|
|||
const std::size_t nullopt_hash =
|
||||
std::hash<optional<double>>{}(optional<double>{});
|
||||
|
||||
|
||||
{
|
||||
optional<B> opt;
|
||||
ASSERT_NOT_NOEXCEPT(std::hash<optional<B>>()(opt));
|
||||
ASSERT_NOT_NOEXCEPT(std::hash<optional<const B>>()(opt));
|
||||
}
|
||||
|
||||
{
|
||||
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));
|
||||
|
@ -48,7 +54,6 @@ 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));
|
||||
|
@ -56,7 +61,6 @@ 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));
|
||||
|
|
Loading…
Reference in New Issue