Message ID | ZcCU3ijeURZ4hrFv@tucnak |
---|---|
State | New |
Headers | show |
Series | c: Avoid ICE with _BitInt(N) : 0 bitfield [PR113740] | expand |
On Mon, Feb 05, 2024 at 08:57:18AM +0100, Jakub Jelinek wrote: > 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? OK, thanks. > 2024-02-05 Jakub Jelinek <jakub@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 > Marek
--- 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; };
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 <jakub@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. Jakub