https://gcc.gnu.org/g:f1ab4c518c72d7981edf910b1bd4ccf7970e08bb

commit r16-3029-gf1ab4c518c72d7981edf910b1bd4ccf7970e08bb
Author: Martin Uecker <uec...@tugraz.at>
Date:   Mon Jul 28 13:12:14 2025 +0200

    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.

Diff:
---
 gcc/c/c-typeck.cc               |  3 +++
 gcc/testsuite/gcc.dg/pr121217.c | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index b192663085c0..e0d0a441302a 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 000000000000..313f1e317a6c
--- /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" } */
+

Reply via email to