1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
12 // template <class T> struct hash<optional<T>>;
19 #include "poisoned_hash_helper.h"
21 #include "test_macros.h"
30 std::size_t operator()(B
const&) noexcept(false) { return 0; }
38 const std::size_t nullopt_hash
=
39 std::hash
<optional
<double>>{}(optional
<double>{});
44 ASSERT_NOT_NOEXCEPT(std::hash
<optional
<B
>>()(opt
));
45 ASSERT_NOT_NOEXCEPT(std::hash
<optional
<const B
>>()(opt
));
51 assert(std::hash
<optional
<T
>>{}(opt
) == nullopt_hash
);
53 assert(std::hash
<optional
<T
>>{}(opt
) == std::hash
<T
>{}(*opt
));
56 typedef std::string T
;
58 assert(std::hash
<optional
<T
>>{}(opt
) == nullopt_hash
);
59 opt
= std::string("123");
60 assert(std::hash
<optional
<T
>>{}(opt
) == std::hash
<T
>{}(*opt
));
63 typedef std::unique_ptr
<int> T
;
65 assert(std::hash
<optional
<T
>>{}(opt
) == nullopt_hash
);
66 opt
= std::unique_ptr
<int>(new int(3));
67 assert(std::hash
<optional
<T
>>{}(opt
) == std::hash
<T
>{}(*opt
));
70 test_hash_enabled_for_type
<std::optional
<int> >();
71 test_hash_enabled_for_type
<std::optional
<int*> >();
72 test_hash_enabled_for_type
<std::optional
<const int> >();
73 test_hash_enabled_for_type
<std::optional
<int* const> >();
75 test_hash_disabled_for_type
<std::optional
<A
>>();
76 test_hash_disabled_for_type
<std::optional
<const A
>>();
78 test_hash_enabled_for_type
<std::optional
<B
>>();
79 test_hash_enabled_for_type
<std::optional
<const B
>>();