]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
attribs: Don't crash on NULL TREE_TYPE in diag_attr_exclusions [PR114634]
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 Apr 2024 08:25:22 +0000 (10:25 +0200)
committerJakub Jelinek <jakub@redhat.com>
Sun, 21 Apr 2024 04:08:07 +0000 (06:08 +0200)
The enumerator still doesn't have TREE_TYPE set but diag_attr_exclusions
assumes that all decls must have types.
I think it is better in something as unimportant as diag_attr_exclusions
to be more robust, if there is no type, it can just diagnose exclusions
on the DECL_ATTRIBUTES, like for types it only diagnoses it on
TYPE_ATTRIBUTES.

2024-04-15  Jakub Jelinek  <jakub@redhat.com>

PR c++/114634
* attribs.cc (diag_attr_exclusions): Set attrs[1] to NULL_TREE for
decls with NULL TREE_TYPE.

* g++.dg/ext/attrib68.C: New test.

(cherry picked from commit 7ec54f5fdfec298812a749699874db4d6a7246bb)

gcc/attribs.cc
gcc/testsuite/g++.dg/ext/attrib68.C [new file with mode: 0644]

index 080b95928ebf0a7348d117264d5602bbefda06a7..24818c76f70d40c2a97b14e482953611a951a668 100644 (file)
@@ -480,7 +480,12 @@ diag_attr_exclusions (tree last_decl, tree node, tree attrname,
   if (DECL_P (node))
     {
       attrs[0] = DECL_ATTRIBUTES (node);
-      attrs[1] = TYPE_ATTRIBUTES (TREE_TYPE (node));
+      if (TREE_TYPE (node))
+       attrs[1] = TYPE_ATTRIBUTES (TREE_TYPE (node));
+      else
+       /* TREE_TYPE can be NULL e.g. while processing attributes on
+          enumerators.  */
+       attrs[1] = NULL_TREE;
     }
   else
     {
diff --git a/gcc/testsuite/g++.dg/ext/attrib68.C b/gcc/testsuite/g++.dg/ext/attrib68.C
new file mode 100644 (file)
index 0000000..be3b110
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/114634
+// { dg-do compile }
+
+template <int N>
+struct A
+{
+  enum { e __attribute__ ((aligned (16))) };   // { dg-error "alignment may not be specified for 'e'" }
+};