]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: Fix ICE on invalid code involving bit fields [PR121217]
authorMartin Uecker <uecker@tugraz.at>
Mon, 28 Jul 2025 11:12:14 +0000 (13:12 +0200)
committerMartin Uecker <uecker@gcc.gnu.org>
Wed, 6 Aug 2025 07:09:48 +0000 (09:09 +0200)
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.

gcc/c/c-typeck.cc
gcc/testsuite/gcc.dg/pr121217.c [new file with mode: 0644]

index b192663085c089155958cd0e4bcd95e578448ec9..e0d0a441302a01339c18f1074f01b8ca939ce31f 100644 (file)
@@ -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 (file)
index 0000000..313f1e3
--- /dev/null
@@ -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" } */
+