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

Reply via email to