On Thu, Nov 23, 2023 at 12:09:05AM +0000, Joseph Myers wrote:
> OK with tests added for unsigned _BitInt(1). Specifically, unsigned
> _BitInt(1) is a bit of a degenerate case for stdc_bit_ceil (always
> returning 1 after evaluating the argument's side effects); I think the
> code that builds of constant 2 of that type (a constant only used in dead
> code) should still work (and produce a constant 0), and that the
> documentation is also still correct in the case where converting 2 to the
> type produces 0, but given those degeneracies I think it's worth testing
> unsigned _BitInt(1) with these functions to make sure they do behave as
> expected.
Thanks, here is incremental diff between what was posted and what was
committed:
--- gcc/testsuite/gcc.dg/builtin-stdc-bit-1.c 2023-11-20 16:25:22.548758830
+0100
+++ gcc/testsuite/gcc.dg/builtin-stdc-bit-1.c 2023-11-23 10:08:50.133761681
+0100
@@ -668,6 +668,87 @@
__builtin_abort ();
if (__builtin_stdc_has_single_bit (b++) || b != 14)
__builtin_abort ();
+#if __BITINT_MAXWIDTH__ >= 64
+ if (__builtin_stdc_leading_zeros (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_leading_zeros (0uwb), unsigned int)
+ || __builtin_stdc_leading_zeros (1uwb) != 0
+ || !expr_has_type (__builtin_stdc_leading_zeros (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_leading_ones (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_leading_ones (0uwb), unsigned int)
+ || __builtin_stdc_leading_ones (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_leading_ones (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_trailing_zeros (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_trailing_zeros (0uwb), unsigned int)
+ || __builtin_stdc_trailing_zeros (1uwb) != 0
+ || !expr_has_type (__builtin_stdc_trailing_zeros (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_trailing_ones (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_trailing_ones (0uwb), unsigned int)
+ || __builtin_stdc_trailing_ones (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_trailing_ones (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_first_leading_zero (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_first_leading_zero (0uwb), unsigned
int)
+ || __builtin_stdc_first_leading_zero (1uwb) != 0
+ || !expr_has_type (__builtin_stdc_first_leading_zero (1uwb), unsigned
int))
+ __builtin_abort ();
+ if (__builtin_stdc_first_leading_one (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_first_leading_one (0uwb), unsigned int)
+ || __builtin_stdc_first_leading_one (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_first_leading_one (1uwb), unsigned
int))
+ __builtin_abort ();
+ if (__builtin_stdc_first_trailing_zero (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_first_trailing_zero (0uwb), unsigned
int)
+ || __builtin_stdc_first_trailing_zero (1uwb) != 0
+ || !expr_has_type (__builtin_stdc_first_trailing_zero (1uwb), unsigned
int))
+ __builtin_abort ();
+ if (__builtin_stdc_first_trailing_one (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_first_trailing_one (0uwb), unsigned
int)
+ || __builtin_stdc_first_trailing_one (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_first_trailing_one (1uwb), unsigned
int))
+ __builtin_abort ();
+ if (__builtin_stdc_count_zeros (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_count_zeros (0uwb), unsigned int)
+ || __builtin_stdc_count_zeros (1uwb) != 0
+ || !expr_has_type (__builtin_stdc_count_zeros (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_count_ones (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_count_ones (0uwb), unsigned int)
+ || __builtin_stdc_count_ones (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_count_ones (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_has_single_bit (0uwb)
+ || !expr_has_type (__builtin_stdc_has_single_bit (0uwb), _Bool)
+ || !__builtin_stdc_has_single_bit (1uwb)
+ || !expr_has_type (__builtin_stdc_has_single_bit (1uwb), _Bool))
+ __builtin_abort ();
+ if (__builtin_stdc_bit_width (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_bit_width (0uwb), unsigned int)
+ || __builtin_stdc_bit_width (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_bit_width (1uwb), unsigned int))
+ __builtin_abort ();
+ if (__builtin_stdc_bit_floor (0uwb) != 0
+ || !expr_has_type (__builtin_stdc_bit_floor (0uwb), unsigned _BitInt(1))
+ || __builtin_stdc_bit_floor (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_bit_floor (1uwb), unsigned _BitInt(1)))
+ __builtin_abort ();
+ if (__builtin_stdc_bit_ceil (0uwb) != 1
+ || !expr_has_type (__builtin_stdc_bit_ceil (0uwb), unsigned _BitInt(1))
+ || __builtin_stdc_bit_ceil (1uwb) != 1
+ || !expr_has_type (__builtin_stdc_bit_ceil (1uwb), unsigned _BitInt(1)))
+ __builtin_abort ();
+ unsigned _BitInt(1) c = 0;
+ if (__builtin_stdc_bit_floor (c++) != 0 || c != 1)
+ __builtin_abort ();
+ if (__builtin_stdc_bit_floor (c++) != 1 || c != 0)
+ __builtin_abort ();
+ if (__builtin_stdc_bit_ceil (c++) != 1 || c != 1)
+ __builtin_abort ();
+ if (__builtin_stdc_bit_ceil (c++) != 1 || c != 0)
+ __builtin_abort ();
+#endif
#if __BITINT_MAXWIDTH__ >= 512
if (__builtin_stdc_leading_zeros ((unsigned _BitInt(512)) 0) != 512
|| !expr_has_type (__builtin_stdc_leading_zeros ((unsigned _BitInt(512))
0), unsigned int)
Jakub