15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <functional>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template <class T>
125a83710eSEric Fiselier // struct hash
135a83710eSEric Fiselier // {
145a83710eSEric Fiselier //     size_t operator()(T val) const;
155a83710eSEric Fiselier // };
165a83710eSEric Fiselier 
175a83710eSEric Fiselier // Not very portable
185a83710eSEric Fiselier 
195a83710eSEric Fiselier #include <vector>
205a83710eSEric Fiselier #include <cassert>
213cd4531bSNikolas Klauser #include <iterator>
225a83710eSEric Fiselier #include <type_traits>
235a83710eSEric Fiselier 
247fc6a556SMarshall Clow #include "test_macros.h"
255a83710eSEric Fiselier #include "min_allocator.h"
265a83710eSEric Fiselier 
tests()27*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool tests()
285a83710eSEric Fiselier {
295a83710eSEric Fiselier     {
305a83710eSEric Fiselier     typedef std::vector<bool> T;
315a83710eSEric Fiselier     typedef std::hash<T> H;
32681cde7dSNikolas Klauser #if TEST_STD_VER <= 14
33d95510ebSMarshall Clow     static_assert((std::is_same<H::argument_type, T>::value), "" );
34d95510ebSMarshall Clow     static_assert((std::is_same<H::result_type, std::size_t>::value), "" );
35681cde7dSNikolas Klauser #endif
367c803385SMarshall Clow     ASSERT_NOEXCEPT(H()(T()));
37d95510ebSMarshall Clow 
385a83710eSEric Fiselier     bool ba[] = {true, false, true, true, false};
395a83710eSEric Fiselier     T vb(std::begin(ba), std::end(ba));
405a83710eSEric Fiselier     H h;
415a83710eSEric Fiselier     assert(h(vb) != 0);
425a83710eSEric Fiselier     }
43f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
445a83710eSEric Fiselier     {
455a83710eSEric Fiselier     typedef std::vector<bool, min_allocator<bool>> T;
465a83710eSEric Fiselier     typedef std::hash<T> H;
47681cde7dSNikolas Klauser #if TEST_STD_VER <= 14
483b018432SEric Fiselier     static_assert((std::is_same<H::argument_type, T>::value), "" );
493b018432SEric Fiselier     static_assert((std::is_same<H::result_type, std::size_t>::value), "" );
50681cde7dSNikolas Klauser #endif
517c803385SMarshall Clow     ASSERT_NOEXCEPT(H()(T()));
525a83710eSEric Fiselier     bool ba[] = {true, false, true, true, false};
535a83710eSEric Fiselier     T vb(std::begin(ba), std::end(ba));
545a83710eSEric Fiselier     H h;
555a83710eSEric Fiselier     assert(h(vb) != 0);
565a83710eSEric Fiselier     }
575a83710eSEric Fiselier #endif
582df59c50SJF Bastien 
59*c74059c5SNikolas Klauser     return true;
60*c74059c5SNikolas Klauser }
61*c74059c5SNikolas Klauser 
main(int,char **)62*c74059c5SNikolas Klauser int main(int, char**)
63*c74059c5SNikolas Klauser {
64*c74059c5SNikolas Klauser     tests();
65*c74059c5SNikolas Klauser #if TEST_STD_VER > 17
66*c74059c5SNikolas Klauser     static_assert(tests());
67*c74059c5SNikolas Klauser #endif
682df59c50SJF Bastien     return 0;
695a83710eSEric Fiselier }
70