diff options
author | Martin Uecker <uecker@tugraz.at> | 2025-07-28 13:12:14 +0200 |
---|---|---|
committer | Martin Uecker <uecker@gcc.gnu.org> | 2025-08-06 09:09:48 +0200 |
commit | f1ab4c518c72d7981edf910b1bd4ccf7970e08bb (patch) | |
tree | 276787e0249daf95af5a4fcf9069d2dcc9c60291 | |
parent | 0c517ddf9b136c9077b21142ec4118451d394bdb (diff) | |
download | gcc-f1ab4c518c72d7981edf910b1bd4ccf7970e08bb.zip gcc-f1ab4c518c72d7981edf910b1bd4ccf7970e08bb.tar.gz gcc-f1ab4c518c72d7981edf910b1bd4ccf7970e08bb.tar.bz2 |
c: Fix ICE on invalid code involving bit fields [PR121217]
Under some error condition we can end up with NULL_TREEs for
the type of bitfields, which can cause an ICE when testing for
type compatibility. Add the missing check.
PR c/121217
gcc/c/ChangeLog:
* c-typeck.cc (tagged_types_tu_compatible_p): Add check.
gcc/testsuite/ChangeLog:
* gcc.dg/pr121217.c: New test.
-rw-r--r-- | gcc/c/c-typeck.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr121217.c | 19 |
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index b192663..e0d0a44 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -1970,6 +1970,9 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2, ft2 = DECL_BIT_FIELD_TYPE (s2); } + if (!ft1 || !ft2) + return false; + if (TREE_CODE (ft1) == ERROR_MARK || TREE_CODE (ft2) == ERROR_MARK) return false; diff --git a/gcc/testsuite/gcc.dg/pr121217.c b/gcc/testsuite/gcc.dg/pr121217.c new file mode 100644 index 0000000..313f1e3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr121217.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-std=gnu17" } */ + +typedef union{ + char *nordic_ref; + unsigned long long int bit_number; + enum PinMode mode : 2; /* { dg-warning "narrower" } */ + /* { dg-error "field 'mode'" "" { target *-*-* } .-1 } */ + unsigned char value; + } s; typedef struct{ + union{ + char *nordic_ref; + unsigned long long int bit_number; + enum PinMode mode : 2; /* { dg-warning "narrower" } */ + /* { dg-error "field 'mode'" "" { target *-*-* } .-1 } */ + unsigned char value; + } s; +} /* { dg-error "expected identifier" } */ + |