c: Avoid ICE with _BitInt(N) : 0 bitfield [PR113740]

Message ID ZcCU3ijeURZ4hrFv@tucnak
State Unresolved
Headers
Series c: Avoid ICE with _BitInt(N) : 0 bitfield [PR113740] |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Jakub Jelinek Feb. 5, 2024, 7:57 a.m. UTC
  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
  

Comments

Marek Polacek Feb. 5, 2024, 1:12 p.m. UTC | #1
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
  

Patch

--- 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; };