diff options
author | Martin Uecker <uecker@tugraz.at> | 2024-01-20 19:03:57 +0100 |
---|---|---|
committer | Martin Uecker <uecker@tugraz.at> | 2024-01-21 18:58:49 +0100 |
commit | 1ead42f9836a13cbbe6a2be685f76750583ae320 (patch) | |
tree | 94315f26718cef2ede0fc1e66672be1c73c31315 | |
parent | a57439d61937925cec48df6166b2a805ae7054d5 (diff) | |
download | gcc-1ead42f9836a13cbbe6a2be685f76750583ae320.zip gcc-1ead42f9836a13cbbe6a2be685f76750583ae320.tar.gz gcc-1ead42f9836a13cbbe6a2be685f76750583ae320.tar.bz2 |
C23: Fix ICE for composite type for structs with unsigned bitfields [PR113492]
This patch fixes a bug when forming a composite type from structs that
contain an unsigned bitfield declared with int while using -funsigned-bitfields.
In such structs the unsigned integer type was not compatible to the
regular unsigned integer type used elsewhere in the C FE.
PR c/113492
gcc/c:
* c-decl.cc (grokdeclarator): Use c_common_unsigned_type instead of
unsigned_type_for to create the unsigned type for bitfields declared
with int when using -funsigned-bitfields.
gcc/testsuite:
* gcc.dg/pr113492.c: New test.
-rw-r--r-- | gcc/c/c-decl.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr113492.c | 43 |
2 files changed, 44 insertions, 1 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 4029bbc..8d18a3e 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -6947,7 +6947,7 @@ grokdeclarator (const struct c_declarator *declarator, "signed". */ if (bitfield && !flag_signed_bitfields && !declspecs->explicit_signed_p && TREE_CODE (type) == INTEGER_TYPE) - type = unsigned_type_for (type); + type = c_common_unsigned_type (type); /* Figure out the type qualifiers for the declaration. There are two ways a declaration can become qualified. One is something diff --git a/gcc/testsuite/gcc.dg/pr113492.c b/gcc/testsuite/gcc.dg/pr113492.c new file mode 100644 index 0000000..56296c5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr113492.c @@ -0,0 +1,43 @@ +/* PR 113492 + * { dg-do compile } + * { dg-options "-std=c23 -funsigned-bitfields" } */ + +struct foo { + int i : 3; +} i; + +void test() +{ + struct foo { + unsigned i : 3; + } u; + + 1 ? i : u; + 1 ? u : i; +} + +struct bar { + unsigned i : 3; +} u; + +void test2() +{ + struct bar { + int i : 3; + } i; + + 1 ? i : u; + 1 ? u : i; +} + +void test3() +{ + typedef int myint; + struct bar { + myint i : 3; + } i; + + 1 ? i : u; + 1 ? u : i; +} + |