// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++14 -fsyntax-only -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++14 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter namespace test_stdc_leading_zeros { static_assert(__builtin_stdc_leading_zeros((unsigned char)0) == 8, ""); static_assert(__builtin_stdc_leading_zeros((unsigned char)1) == 7, ""); static_assert(__builtin_stdc_leading_zeros((unsigned char)0x80) == 0, ""); static_assert(__builtin_stdc_leading_zeros((unsigned char)0xFF) == 0, ""); static_assert(__builtin_stdc_leading_zeros((unsigned short)0) == 16, ""); static_assert(__builtin_stdc_leading_zeros((unsigned short)1) == 15, ""); static_assert(__builtin_stdc_leading_zeros((unsigned short)0x8000) == 0, ""); static_assert(__builtin_stdc_leading_zeros(0U) == 32, ""); static_assert(__builtin_stdc_leading_zeros(1U) == 31, ""); static_assert(__builtin_stdc_leading_zeros(0x80000000U) == 0, ""); static_assert(__builtin_stdc_leading_zeros(0ULL) == 64, ""); static_assert(__builtin_stdc_leading_zeros(1ULL) == 63, ""); static_assert(__builtin_stdc_leading_zeros(0x8000000000000000ULL) == 0, ""); } // namespace test_stdc_leading_zeros namespace test_stdc_leading_ones { static_assert(__builtin_stdc_leading_ones((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_leading_ones((unsigned char)0xFF) == 8, ""); static_assert(__builtin_stdc_leading_ones((unsigned char)0xF0) == 4, ""); static_assert(__builtin_stdc_leading_ones((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_leading_ones((unsigned short)0xFFFF) == 16, ""); static_assert(__builtin_stdc_leading_ones((unsigned short)0xF000) == 4, ""); static_assert(__builtin_stdc_leading_ones(0U) == 0, ""); static_assert(__builtin_stdc_leading_ones(0xFFFFFFFFU) == 32, ""); static_assert(__builtin_stdc_leading_ones(0xF0000000U) == 4, ""); static_assert(__builtin_stdc_leading_ones(0ULL) == 0, ""); static_assert(__builtin_stdc_leading_ones(0xFFFFFFFFFFFFFFFFULL) == 64, ""); } // namespace test_stdc_leading_ones namespace test_stdc_trailing_zeros { static_assert(__builtin_stdc_trailing_zeros((unsigned char)0) == 8, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned char)1) == 0, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned char)0x80) == 7, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned short)0) == 16, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned short)1) == 0, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned short)0x8000) == 15, ""); static_assert(__builtin_stdc_trailing_zeros(0U) == 32, ""); static_assert(__builtin_stdc_trailing_zeros(1U) == 0, ""); static_assert(__builtin_stdc_trailing_zeros(0x80000000U) == 31, ""); static_assert(__builtin_stdc_trailing_zeros(0ULL) == 64, ""); static_assert(__builtin_stdc_trailing_zeros(1ULL) == 0, ""); static_assert(__builtin_stdc_trailing_zeros(0x8000000000000000ULL) == 63, ""); } // namespace test_stdc_trailing_zeros namespace test_stdc_trailing_ones { static_assert(__builtin_stdc_trailing_ones((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned char)0xFF) == 8, ""); static_assert(__builtin_stdc_trailing_ones((unsigned char)0x0F) == 4, ""); static_assert(__builtin_stdc_trailing_ones((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned short)0xFFFF) == 16, ""); static_assert(__builtin_stdc_trailing_ones((unsigned short)0x000F) == 4, ""); static_assert(__builtin_stdc_trailing_ones(0U) == 0, ""); static_assert(__builtin_stdc_trailing_ones(1U) == 1, ""); static_assert(__builtin_stdc_trailing_ones(0xFFFFFFFFU) == 32, ""); static_assert(__builtin_stdc_trailing_ones(0x0000000FU) == 4, ""); static_assert(__builtin_stdc_trailing_ones(0ULL) == 0, ""); static_assert(__builtin_stdc_trailing_ones(1ULL) == 1, ""); static_assert(__builtin_stdc_trailing_ones(0xFFFFFFFFFFFFFFFFULL) == 64, ""); } // namespace test_stdc_trailing_ones namespace test_stdc_first_leading_zero { static_assert(__builtin_stdc_first_leading_zero((unsigned char)0) == 1, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned char)0xFF) == 0, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned char)0xF0) == 5, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned char)0x80) == 2, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned short)0) == 1, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned short)0xFFFF) == 0, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned short)0xF000) == 5, ""); static_assert(__builtin_stdc_first_leading_zero(0xFFFFFFFFU) == 0, ""); static_assert(__builtin_stdc_first_leading_zero(0xF0000000U) == 5, ""); static_assert(__builtin_stdc_first_leading_zero(0ULL) == 1, ""); static_assert(__builtin_stdc_first_leading_zero(0xFFFFFFFFFFFFFFFFULL) == 0, ""); static_assert(__builtin_stdc_first_leading_zero(0xF000000000000000ULL) == 5, ""); } // namespace test_stdc_first_leading_zero namespace test_stdc_first_leading_one { static_assert(__builtin_stdc_first_leading_one((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_first_leading_one((unsigned char)0x80) == 1, ""); static_assert(__builtin_stdc_first_leading_one((unsigned char)0x01) == 8, ""); static_assert(__builtin_stdc_first_leading_one((unsigned char)0x0F) == 5, ""); static_assert(__builtin_stdc_first_leading_one((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_first_leading_one((unsigned short)0x8000) == 1, ""); static_assert(__builtin_stdc_first_leading_one((unsigned short)1) == 16, ""); static_assert(__builtin_stdc_first_leading_one(0U) == 0, ""); static_assert(__builtin_stdc_first_leading_one(0x80000000U) == 1, ""); static_assert(__builtin_stdc_first_leading_one(1U) == 32, ""); static_assert(__builtin_stdc_first_leading_one(0ULL) == 0, ""); static_assert(__builtin_stdc_first_leading_one(0x8000000000000000ULL) == 1, ""); static_assert(__builtin_stdc_first_leading_one(1ULL) == 64, ""); } // namespace test_stdc_first_leading_one namespace test_stdc_first_trailing_zero { static_assert(__builtin_stdc_first_trailing_zero((unsigned char)0) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned char)0xFF) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned char)0x0F) == 5, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned char)0x01) == 2, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned short)0) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned short)0xFFFF) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned short)0x000F) == 5, ""); static_assert(__builtin_stdc_first_trailing_zero(0xFFFFFFFFU) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero(0x0000000FU) == 5, ""); static_assert(__builtin_stdc_first_trailing_zero(0ULL) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero(0xFFFFFFFFFFFFFFFFULL) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero(0x000000000000000FULL) == 5, ""); } // namespace test_stdc_first_trailing_zero namespace test_stdc_first_trailing_one { static_assert(__builtin_stdc_first_trailing_one((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned char)0x01) == 1, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned char)0x80) == 8, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned char)0xF0) == 5, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned short)1) == 1, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned short)0x8000) == 16, ""); static_assert(__builtin_stdc_first_trailing_one(0U) == 0, ""); static_assert(__builtin_stdc_first_trailing_one(0x80000000U) == 32, ""); static_assert(__builtin_stdc_first_trailing_one(1U) == 1, ""); static_assert(__builtin_stdc_first_trailing_one(0ULL) == 0, ""); static_assert(__builtin_stdc_first_trailing_one(1ULL) == 1, ""); static_assert(__builtin_stdc_first_trailing_one(0x8000000000000000ULL) == 64, ""); } // namespace test_stdc_first_trailing_one namespace test_stdc_count_zeros { static_assert(__builtin_stdc_count_zeros((unsigned char)0) == 8, ""); static_assert(__builtin_stdc_count_zeros((unsigned char)0xFF) == 0, ""); static_assert(__builtin_stdc_count_zeros((unsigned char)0xAA) == 4, ""); static_assert(__builtin_stdc_count_zeros((unsigned short)0) == 16, ""); static_assert(__builtin_stdc_count_zeros((unsigned short)0xFFFF) == 0, ""); static_assert(__builtin_stdc_count_zeros((unsigned short)0xAAAA) == 8, ""); static_assert(__builtin_stdc_count_zeros(0U) == 32, ""); static_assert(__builtin_stdc_count_zeros(0xFFFFFFFFU) == 0, ""); static_assert(__builtin_stdc_count_zeros(0xAAAAAAAAU) == 16, ""); static_assert(__builtin_stdc_count_zeros(0ULL) == 64, ""); static_assert(__builtin_stdc_count_zeros(0xFFFFFFFFFFFFFFFFULL) == 0, ""); static_assert(__builtin_stdc_count_zeros(0xAAAAAAAAAAAAAAAAULL) == 32, ""); } // namespace test_stdc_count_zeros namespace test_stdc_count_ones { static_assert(__builtin_stdc_count_ones((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_count_ones((unsigned char)0xFF) == 8, ""); static_assert(__builtin_stdc_count_ones((unsigned char)0xAA) == 4, ""); static_assert(__builtin_stdc_count_ones((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_count_ones((unsigned short)0xFFFF) == 16, ""); static_assert(__builtin_stdc_count_ones((unsigned short)0xAAAA) == 8, ""); static_assert(__builtin_stdc_count_ones(0U) == 0, ""); static_assert(__builtin_stdc_count_ones(0xFFFFFFFFU) == 32, ""); static_assert(__builtin_stdc_count_ones(0xAAAAAAAAU) == 16, ""); static_assert(__builtin_stdc_count_ones(0ULL) == 0, ""); static_assert(__builtin_stdc_count_ones(0xFFFFFFFFFFFFFFFFULL) == 64, ""); static_assert(__builtin_stdc_count_ones(0xAAAAAAAAAAAAAAAAULL) == 32, ""); } // namespace test_stdc_count_ones namespace test_stdc_has_single_bit { static_assert(__builtin_stdc_has_single_bit((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned char)1) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned char)2) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned char)3) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned char)0x80) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned short)1) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned short)0x8000) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned short)0xFFFF) == 0, ""); static_assert(__builtin_stdc_has_single_bit(0U) == 0, ""); static_assert(__builtin_stdc_has_single_bit(1U) == 1, ""); static_assert(__builtin_stdc_has_single_bit(0x80000000U) == 1, ""); static_assert(__builtin_stdc_has_single_bit(0xFFFFFFFFU) == 0, ""); static_assert(__builtin_stdc_has_single_bit(0ULL) == 0, ""); static_assert(__builtin_stdc_has_single_bit(1ULL) == 1, ""); static_assert(__builtin_stdc_has_single_bit(0x8000000000000000ULL) == 1, ""); static_assert(__builtin_stdc_has_single_bit(0xFFFFFFFFFFFFFFFFULL) == 0, ""); } // namespace test_stdc_has_single_bit namespace test_stdc_bit_width { static_assert(__builtin_stdc_bit_width((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned char)1) == 1, ""); static_assert(__builtin_stdc_bit_width((unsigned char)2) == 2, ""); static_assert(__builtin_stdc_bit_width((unsigned char)3) == 2, ""); static_assert(__builtin_stdc_bit_width((unsigned char)0x80) == 8, ""); static_assert(__builtin_stdc_bit_width((unsigned char)0xFF) == 8, ""); static_assert(__builtin_stdc_bit_width((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned short)1) == 1, ""); static_assert(__builtin_stdc_bit_width((unsigned short)0x8000) == 16, ""); static_assert(__builtin_stdc_bit_width(0U) == 0, ""); static_assert(__builtin_stdc_bit_width(1U) == 1, ""); static_assert(__builtin_stdc_bit_width(0x80000000U) == 32, ""); static_assert(__builtin_stdc_bit_width(0ULL) == 0, ""); static_assert(__builtin_stdc_bit_width(1ULL) == 1, ""); static_assert(__builtin_stdc_bit_width(0x8000000000000000ULL) == 64, ""); } // namespace test_stdc_bit_width namespace test_stdc_bit_floor { static_assert(__builtin_stdc_bit_floor((unsigned char)0) == 0, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)1) == 1, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)2) == 2, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)3) == 2, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)4) == 4, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)5) == 4, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)0x80) == 0x80, ""); static_assert(__builtin_stdc_bit_floor((unsigned char)0xFF) == 0x80, ""); static_assert(__builtin_stdc_bit_floor((unsigned short)0) == 0, ""); static_assert(__builtin_stdc_bit_floor((unsigned short)1) == 1, ""); static_assert(__builtin_stdc_bit_floor((unsigned short)0xFFFF) == 0x8000, ""); static_assert(__builtin_stdc_bit_floor(0U) == 0U, ""); static_assert(__builtin_stdc_bit_floor(1U) == 1U, ""); static_assert(__builtin_stdc_bit_floor(7U) == 4U, ""); static_assert(__builtin_stdc_bit_floor(0x80000000U) == 0x80000000U, ""); static_assert(__builtin_stdc_bit_floor(0xFFFFFFFFU) == 0x80000000U, ""); static_assert(__builtin_stdc_bit_floor(0ULL) == 0ULL, ""); static_assert(__builtin_stdc_bit_floor(1ULL) == 1ULL, ""); static_assert(__builtin_stdc_bit_floor(0xFFFFFFFFFFFFFFFFULL) == 0x8000000000000000ULL, ""); } // namespace test_stdc_bit_floor namespace test_stdc_bit_ceil { static_assert(__builtin_stdc_bit_ceil((unsigned char)0) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)1) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)2) == 2, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)3) == 4, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)4) == 4, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)5) == 8, ""); static_assert(__builtin_stdc_bit_ceil((unsigned char)0x80) == 0x80, ""); static_assert(__builtin_stdc_bit_ceil((unsigned short)0) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned short)1) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned short)7) == 8, ""); static_assert(__builtin_stdc_bit_ceil((unsigned short)0x8000) == 0x8000, ""); static_assert(__builtin_stdc_bit_ceil(0U) == 1U, ""); static_assert(__builtin_stdc_bit_ceil(1U) == 1U, ""); static_assert(__builtin_stdc_bit_ceil(7U) == 8U, ""); static_assert(__builtin_stdc_bit_ceil(0x80000000U) == 0x80000000U, ""); // Overflow: next power of 2 exceeds type width; wraps to zero. static_assert(__builtin_stdc_bit_ceil(0xFFFFFFFFU) == 0U, ""); static_assert(__builtin_stdc_bit_ceil(0ULL) == 1ULL, ""); static_assert(__builtin_stdc_bit_ceil(1ULL) == 1ULL, ""); static_assert(__builtin_stdc_bit_ceil(7ULL) == 8ULL, ""); static_assert(__builtin_stdc_bit_ceil(0x8000000000000000ULL) == 0x8000000000000000ULL, ""); } // namespace test_stdc_bit_ceil #ifdef __SIZEOF_INT128__ namespace test_int128 { static_assert(__builtin_stdc_leading_zeros((unsigned __int128)0) == 128, ""); static_assert(__builtin_stdc_leading_zeros((unsigned __int128)1) == 127, ""); static_assert(__builtin_stdc_leading_ones((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_leading_ones((unsigned __int128)-1) == 128, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned __int128)0) == 128, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned __int128)1) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned __int128)-1) == 128, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned __int128)0) == 1, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned __int128)-1) == 0, ""); static_assert(__builtin_stdc_first_leading_one((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned __int128)0) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned __int128)-1) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned __int128)1) == 1, ""); static_assert(__builtin_stdc_count_ones((unsigned __int128)0xFFFFFFFF) == 32, ""); static_assert(__builtin_stdc_count_zeros((unsigned __int128)0) == 128, ""); static_assert(__builtin_stdc_count_zeros((unsigned __int128)-1) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned __int128)1) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned __int128)3) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned __int128)1) == 1, ""); static_assert(__builtin_stdc_bit_floor((unsigned __int128)0) == 0, ""); static_assert(__builtin_stdc_bit_floor((unsigned __int128)1) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned __int128)0) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned __int128)1) == 1, ""); static_assert(__builtin_stdc_bit_ceil((unsigned __int128)3) == 4, ""); // MSB tests using constexpr to form the value. constexpr unsigned __int128 int128_one = 1; constexpr unsigned __int128 int128_msb = int128_one << 127; static_assert(__builtin_stdc_leading_zeros(int128_msb) == 0, ""); static_assert(__builtin_stdc_leading_ones(int128_msb) == 1, ""); static_assert(__builtin_stdc_trailing_zeros(int128_msb) == 127, ""); static_assert(__builtin_stdc_trailing_ones(int128_msb) == 0, ""); static_assert(__builtin_stdc_first_leading_zero(int128_msb) == 2, ""); static_assert(__builtin_stdc_first_leading_one(int128_msb) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero(int128_msb) == 1, ""); static_assert(__builtin_stdc_first_trailing_one(int128_msb) == 128, ""); static_assert(__builtin_stdc_count_ones(int128_msb) == 1, ""); static_assert(__builtin_stdc_count_zeros(int128_msb) == 127, ""); static_assert(__builtin_stdc_has_single_bit(int128_msb) == 1, ""); static_assert(__builtin_stdc_bit_width(int128_msb) == 128, ""); static_assert(__builtin_stdc_bit_floor(int128_msb) == int128_msb, ""); static_assert(__builtin_stdc_bit_ceil(int128_msb) == int128_msb, ""); } // namespace test_int128 #endif // __SIZEOF_INT128__ namespace test_bitint { // _BitInt(37): all 14 builtins static_assert(__builtin_stdc_leading_zeros((unsigned _BitInt(37))0) == 37, ""); static_assert(__builtin_stdc_leading_zeros((unsigned _BitInt(37))1) == 36, ""); static_assert(__builtin_stdc_leading_ones((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_leading_ones((unsigned _BitInt(37))-1) == 37, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned _BitInt(37))0) == 37, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned _BitInt(37))1) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_trailing_ones((unsigned _BitInt(37))-1) == 37, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned _BitInt(37))0) == 1, ""); static_assert(__builtin_stdc_first_leading_zero((unsigned _BitInt(37))-1) == 0, ""); static_assert(__builtin_stdc_first_leading_one((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_first_leading_one((unsigned _BitInt(37))1) == 37, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned _BitInt(37))0) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero((unsigned _BitInt(37))-1) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_first_trailing_one((unsigned _BitInt(37))1) == 1, ""); static_assert(__builtin_stdc_count_ones((unsigned _BitInt(37))0x1F) == 5, ""); static_assert(__builtin_stdc_count_zeros((unsigned _BitInt(37))0) == 37, ""); static_assert(__builtin_stdc_count_zeros((unsigned _BitInt(37))-1) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned _BitInt(37))0x10) == 1, ""); static_assert(__builtin_stdc_has_single_bit((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned _BitInt(37))3) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned _BitInt(37))0x10) == 5, ""); static_assert(__builtin_stdc_bit_width((unsigned _BitInt(37))0) == 0, ""); static_assert(__builtin_stdc_bit_width((unsigned _BitInt(37))-1) == 37, ""); static_assert(__builtin_stdc_bit_floor((unsigned _BitInt(37))0x1F) == 0x10, ""); static_assert(__builtin_stdc_bit_ceil((unsigned _BitInt(37))0x11) == 0x20, ""); // Overflow: next power of 2 exceeds _BitInt(17) width; wraps to zero. static_assert(__builtin_stdc_bit_ceil((unsigned _BitInt(17))(-1)) == (unsigned _BitInt(17))(0), ""); // _BitInt(128): sparse pattern, leading zero count, popcount. constexpr unsigned _BitInt(128) bi128_pattern = 0x123456789ABCDEF0ULL; static_assert(__builtin_stdc_count_ones(bi128_pattern) == 32, ""); static_assert(__builtin_stdc_leading_zeros(bi128_pattern) == 67, ""); static_assert(__builtin_stdc_count_zeros(bi128_pattern) == 96, ""); // _BitInt(9): boundary width near a byte. static_assert(__builtin_stdc_leading_zeros((unsigned _BitInt(9))0) == 9, ""); static_assert(__builtin_stdc_trailing_zeros((unsigned _BitInt(9))0x100) == 8, ""); static_assert(__builtin_stdc_count_ones((unsigned _BitInt(9))0x1FF) == 9, ""); static_assert(__builtin_stdc_count_zeros((unsigned _BitInt(9))0x1FF) == 0, ""); static_assert(__builtin_stdc_has_single_bit((unsigned _BitInt(9))0x100) == 1, ""); static_assert(__builtin_stdc_bit_width((unsigned _BitInt(9))0x100) == 9, ""); static_assert(__builtin_stdc_bit_floor((unsigned _BitInt(9))0x1FF) == 0x100, ""); } // namespace test_bitint namespace test_stdc_ulong { constexpr unsigned long ULongWidth = __SIZEOF_LONG__ * 8; constexpr unsigned long ULongMSB = 1UL << (ULongWidth - 1); constexpr unsigned long ULongAllOnes = ~0UL; constexpr unsigned long ULongTopNibbleOnes = ULongAllOnes << (ULongWidth - 4); static_assert(__builtin_stdc_leading_zeros(0UL) == ULongWidth, ""); static_assert(__builtin_stdc_leading_zeros(1UL) == ULongWidth - 1, ""); static_assert(__builtin_stdc_leading_zeros(ULongMSB) == 0, ""); static_assert(__builtin_stdc_leading_ones(0UL) == 0, ""); static_assert(__builtin_stdc_leading_ones(ULongAllOnes) == ULongWidth, ""); static_assert(__builtin_stdc_leading_ones(ULongTopNibbleOnes) == 4, ""); static_assert(__builtin_stdc_trailing_zeros(0UL) == ULongWidth, ""); static_assert(__builtin_stdc_trailing_zeros(1UL) == 0, ""); static_assert(__builtin_stdc_trailing_zeros(ULongMSB) == ULongWidth - 1, ""); static_assert(__builtin_stdc_trailing_ones(0UL) == 0, ""); static_assert(__builtin_stdc_trailing_ones(ULongAllOnes) == ULongWidth, ""); static_assert(__builtin_stdc_trailing_ones(0xFUL) == 4, ""); static_assert(__builtin_stdc_first_leading_zero(0UL) == 1, ""); static_assert(__builtin_stdc_first_leading_zero(ULongAllOnes) == 0, ""); static_assert(__builtin_stdc_first_leading_zero(ULongTopNibbleOnes) == 5, ""); static_assert(__builtin_stdc_first_leading_one(0UL) == 0, ""); static_assert(__builtin_stdc_first_leading_one(ULongMSB) == 1, ""); static_assert(__builtin_stdc_first_leading_one(1UL) == ULongWidth, ""); static_assert(__builtin_stdc_first_trailing_zero(0UL) == 1, ""); static_assert(__builtin_stdc_first_trailing_zero(ULongAllOnes) == 0, ""); static_assert(__builtin_stdc_first_trailing_zero(0xFUL) == 5, ""); static_assert(__builtin_stdc_first_trailing_one(0UL) == 0, ""); static_assert(__builtin_stdc_first_trailing_one(1UL) == 1, ""); static_assert(__builtin_stdc_first_trailing_one(ULongMSB) == ULongWidth, ""); static_assert(__builtin_stdc_count_zeros(0UL) == ULongWidth, ""); static_assert(__builtin_stdc_count_zeros(ULongAllOnes) == 0, ""); static_assert(__builtin_stdc_count_zeros(ULongMSB) == ULongWidth - 1, ""); static_assert(__builtin_stdc_count_ones(0UL) == 0, ""); static_assert(__builtin_stdc_count_ones(ULongAllOnes) == ULongWidth, ""); static_assert(__builtin_stdc_count_ones(ULongMSB) == 1, ""); static_assert(__builtin_stdc_has_single_bit(0UL) == 0, ""); static_assert(__builtin_stdc_has_single_bit(1UL) == 1, ""); static_assert(__builtin_stdc_has_single_bit(ULongMSB) == 1, ""); static_assert(__builtin_stdc_has_single_bit(ULongAllOnes) == 0, ""); static_assert(__builtin_stdc_bit_width(0UL) == 0, ""); static_assert(__builtin_stdc_bit_width(1UL) == 1, ""); static_assert(__builtin_stdc_bit_width(ULongMSB) == ULongWidth, ""); static_assert(__builtin_stdc_bit_floor(0UL) == 0UL, ""); static_assert(__builtin_stdc_bit_floor(1UL) == 1UL, ""); static_assert(__builtin_stdc_bit_floor(ULongAllOnes) == ULongMSB, ""); static_assert(__builtin_stdc_bit_ceil(0UL) == 1UL, ""); static_assert(__builtin_stdc_bit_ceil(1UL) == 1UL, ""); static_assert(__builtin_stdc_bit_ceil(7UL) == 8UL, ""); static_assert(__builtin_stdc_bit_ceil(ULongMSB) == ULongMSB, ""); } // namespace test_stdc_ulong namespace test_errors { void test_invalid_types(int si, float f) { __builtin_stdc_leading_zeros(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_leading_zeros(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_leading_zeros(-1); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_leading_ones(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_leading_ones(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_trailing_zeros(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_trailing_zeros(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_trailing_ones(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_trailing_ones(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_first_leading_zero(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_first_leading_zero(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_first_leading_one(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_first_leading_one(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_first_trailing_zero(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_first_trailing_zero(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_first_trailing_one(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_first_trailing_one(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_count_ones(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_count_ones(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_count_zeros(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_count_zeros(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_has_single_bit(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_has_single_bit(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_bit_width(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_bit_width(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_bit_floor(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_bit_floor(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} __builtin_stdc_bit_ceil(si); // expected-error {{1st argument must be a scalar unsigned integer type (was 'int')}} __builtin_stdc_bit_ceil(f); // expected-error {{1st argument must be a scalar unsigned integer type (was 'float')}} } } // namespace test_errors