Hi!

finish_struct already made sure not to call build_bitint_type for
signed _BitInt(2) : 1;
or
signed _BitInt(2) : 0;
bitfields (but instead build a zero precision integral type,
we remove it later), this patch makes sure we do it also for
unsigned _BitInt(1) : 0;
because of the build_bitint_type assertion that precision is
>= (unsigned ? 1 : 2).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-02-05  Jakub Jelinek  <ja...@redhat.com>

        PR c/113740
        * c-decl.cc (finish_struct): Only use build_bitint_type if
        bit-field has width larger or equal to minimum _BitInt
        precision.

        * gcc.dg/bitint-85.c: New test.

--- gcc/c/c-decl.cc.jj  2024-02-01 09:14:16.474551596 +0100
+++ gcc/c/c-decl.cc     2024-02-03 13:03:35.272479105 +0100
@@ -9555,7 +9555,7 @@ finish_struct (location_t loc, tree t, t
          if (width != TYPE_PRECISION (type))
            {
              if (TREE_CODE (type) == BITINT_TYPE
-                 && (width > 1 || TYPE_UNSIGNED (type)))
+                 && width >= (TYPE_UNSIGNED (type) ? 1 : 2))
                TREE_TYPE (field)
                  = build_bitint_type (width, TYPE_UNSIGNED (type));
              else
--- gcc/testsuite/gcc.dg/bitint-85.c.jj 2024-02-03 13:05:49.162639344 +0100
+++ gcc/testsuite/gcc.dg/bitint-85.c    2024-02-03 13:05:39.489772259 +0100
@@ -0,0 +1,5 @@
+/* PR c/113740 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=c23" } */
+
+struct S { unsigned _BitInt(32) : 0; };

        Jakub

Reply via email to