diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-02-05 18:53:59 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2024-02-05 18:53:59 +0100 |
commit | 194ab79b580b69554124cf8257b19c957690a8a8 (patch) | |
tree | d15717fc3151a140c35c598931f256f0b0adf602 | |
parent | 8ca585e56c1d6837f96ddd88c13ed1e815c74f93 (diff) | |
download | gcc-194ab79b580b69554124cf8257b19c957690a8a8.zip gcc-194ab79b580b69554124cf8257b19c957690a8a8.tar.gz gcc-194ab79b580b69554124cf8257b19c957690a8a8.tar.bz2 |
c: Avoid ICE with _BitInt(N) : 0 bitfield [PR113740]
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).
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.
-rw-r--r-- | gcc/c/c-decl.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/bitint-85.c | 5 |
2 files changed, 6 insertions, 1 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 934e557..fe20bc2 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -9555,7 +9555,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, 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 diff --git a/gcc/testsuite/gcc.dg/bitint-85.c b/gcc/testsuite/gcc.dg/bitint-85.c new file mode 100644 index 0000000..f2301cc --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-85.c @@ -0,0 +1,5 @@ +/* PR c/113740 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=c23" } */ + +struct S { unsigned _BitInt(32) : 0; }; |