]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: fix ICE related to tagged types with attributes in diagnostics [PR120380]
authorMartin Uecker <uecker@tugraz.at>
Thu, 29 May 2025 15:17:12 +0000 (17:17 +0200)
committerMartin Uecker <uecker@gcc.gnu.org>
Sun, 1 Jun 2025 07:49:15 +0000 (09:49 +0200)
get_aka_type will create a new type for diagnostics, but for tagged types
attributes will then be ignored with a warning.  This can lead to reentering
warning code which leads to an ICE.  Fix this by ignoring the attributes
for tagged types.

PR c/120380

gcc/c/ChangeLog:
* c-objc-common.cc (get_aka_type): Ignore attributes for tagged types.

gcc/testsuite/ChangeLog:
* gcc.dg/pr120380.c: New test.

gcc/c/c-objc-common.cc
gcc/testsuite/gcc.dg/pr120380.c [new file with mode: 0644]

index 2016eaebf17c7886c1e99725fd3d67760d03726c..d574bc77128912204ea485c9199372a40ff9809a 100644 (file)
@@ -216,6 +216,11 @@ get_aka_type (tree type)
          return canonical ? canonical : type;
        }
     }
+  /* For tagged types ignore attributes because they will otherwise
+     be ignored later causing a warning inside diagnostics which leads
+     to an ICE.  */
+  if (RECORD_OR_UNION_TYPE_P (type) || TREE_CODE (type) == ENUMERAL_TYPE)
+    return build_qualified_type (result, TYPE_QUALS (type));
   return build_type_attribute_qual_variant (result, TYPE_ATTRIBUTES (type),
                                            TYPE_QUALS (type));
 }
diff --git a/gcc/testsuite/gcc.dg/pr120380.c b/gcc/testsuite/gcc.dg/pr120380.c
new file mode 100644 (file)
index 0000000..10577a1
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR c/120380 */
+/* { dg-do compile } */
+
+struct pair_t {
+  char c;
+  int i;
+};
+typedef struct foo_ {                  /* { dg-error "no member" } */
+  struct foo_ {                                /* { dg-error "nested redefinition" } */
+                                       /* { dg-error "no member" "" { target *-*-* } .-1 } */
+    struct foo_ {                      /* { dg-error "nested redefinition" } */
+      int value;
+    }
+  }                                    /* { dg-error "does not declare anything" } */
+                                       /* { dg-error "no semicolon" "" { target *-*-* } .-1 } */
+} __attribute__((packed)) foo;         /* { dg-error "does not declare anything" } */
+                                       /* { dg-error "no semicolon" "" { target *-*-* } .-1 } */
+struct pair_t p = {0, 1};
+foo *addr = (foo *)&p.i;
+int main() {
+  addr->value = 0;                     /* { dg-error "has no member" } */
+  return 0;
+}
+