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 // unsigned long long to_ullong() const; // constexpr since C++23
13 #include <type_traits>
17 #include "test_macros.h"
19 template <std::size_t N
>
20 TEST_CONSTEXPR_CXX23
void test_to_ullong() {
21 const std::size_t M
= sizeof(unsigned long long) * CHAR_BIT
< N
? sizeof(unsigned long long) * CHAR_BIT
: N
;
22 const bool is_M_zero
= std::integral_constant
<bool, M
== 0>::value
; // avoid compiler warnings
23 const std::size_t X
= is_M_zero
? sizeof(unsigned long long) * CHAR_BIT
- 1 : sizeof(unsigned long long) * CHAR_BIT
- M
;
24 const unsigned long long max
= is_M_zero
? 0 : (unsigned long long)(-1) >> X
;
25 unsigned long long tests
[] = {
27 std::min
<unsigned long long>(1, max
),
28 std::min
<unsigned long long>(2, max
),
29 std::min
<unsigned long long>(3, max
),
35 for (unsigned long long j
: tests
) {
37 assert(j
== v
.to_ullong());
39 { // test values bigger than can fit into the bitset
40 const unsigned long long val
= 0x55AAAAFFFFAAAA55ULL
;
41 const bool canFit
= N
< sizeof(unsigned long long) * CHAR_BIT
;
42 const unsigned long long mask
= canFit
? (1ULL << (canFit
? N
: 0)) - 1 : (unsigned long long)(-1); // avoid compiler warnings
43 std::bitset
<N
> v(val
);
44 assert(v
.to_ullong() == (val
& mask
)); // we shouldn't return bit patterns from outside the limits of the bitset.
48 TEST_CONSTEXPR_CXX23
bool test() {
57 test_to_ullong
<1000>();
62 int main(int, char**) {
65 static_assert(test());