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: 299734
This commit is contained in:
Billy Robert O'Neal III 2017-04-06 23:50:21 +00:00
parent 10169b6d0d
commit eaeeaaf375
2 changed files with 11 additions and 4 deletions

View File

@ -67,10 +67,14 @@ 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));
}
{
std::unique_ptr<int, PointerDeleter<int, 1>> pThrowingHash;
std::hash<std::unique_ptr<int, PointerDeleter<int, 1>>> fThrowingHash;
ASSERT_NOT_NOEXCEPT(fThrowingHash(pThrowingHash));
}
#if TEST_STD_VER >= 11
{
test_enabled_with_deleter<int, Deleter<int>>();

View File

@ -37,10 +37,15 @@ 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 +53,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 +60,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));