xref: /llvm-project/libcxx/test/std/utilities/function.objects/unord.hash/non_enum.pass.cpp (revision 3f3abaf40ad5c732277e0d0be3c0e86b8ba49f34)
1 //===----------------------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03
10 
11 // <functional>
12 
13 //  Hashing a struct w/o a defined hash should *not* fail, but it should
14 // create a type that is not constructible and not callable.
15 // See also: https://cplusplus.github.io/LWG/lwg-defects.html#2543
16 
17 #include <functional>
18 #include <cassert>
19 #include <type_traits>
20 
21 #include "test_macros.h"
22 
23 struct X {};
24 
main(int,char **)25 int main(int, char**)
26 {
27     using H = std::hash<X>;
28     static_assert(!std::is_default_constructible<H>::value, "");
29     static_assert(!std::is_copy_constructible<H>::value, "");
30     static_assert(!std::is_move_constructible<H>::value, "");
31     static_assert(!std::is_copy_assignable<H>::value, "");
32     static_assert(!std::is_move_assignable<H>::value, "");
33 #if TEST_STD_VER > 14
34     static_assert(!std::is_invocable<H, X&>::value, "");
35     static_assert(!std::is_invocable<H, X const&>::value, "");
36 #endif
37 
38   return 0;
39 }
40