]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: ICE on invalid with attribute optimize [PR115549]
authorMarek Polacek <polacek@redhat.com>
Thu, 27 Jun 2024 20:39:29 +0000 (16:39 -0400)
committerMarek Polacek <polacek@redhat.com>
Wed, 10 Jul 2024 18:37:54 +0000 (14:37 -0400)
I had this PR in my open tabs so why not go ahead and fix it.

decl_attributes gets last_decl, the last already pushed declaration,
to be used in common_handle_aligned_attribute.  In C++, we look up
the decl via find_last_decl, which returns NULL_TREE if it finds
a decl that had not been declared.  In C, we look up the decl via
lookup_last_decl which returns error_mark_node rather than NULL_TREE
in that case.

The error_mark_node causes a crash in common_handle_aligned_attribute.
We can fix this on the C FE side like in the patch below.

PR c/115549

gcc/c/ChangeLog:

* c-decl.cc (c_decl_attributes): If lookup_last_decl returns
error_mark_node, use NULL_TREE as last_decl.

gcc/testsuite/ChangeLog:

* c-c++-common/attr-aligned-2.c: New test.

gcc/c/c-decl.cc
gcc/testsuite/c-c++-common/attr-aligned-2.c [new file with mode: 0644]

index 0eac266471f7305b4bb9d900b313c82e07f9a27c..97f1d346835edf5805d6a65e1edee70e556616d4 100644 (file)
@@ -5496,8 +5496,11 @@ c_decl_attributes (tree *node, tree attributes, int flags)
   /* Look up the current declaration with all the attributes merged
      so far so that attributes on the current declaration that's
      about to be pushed that conflict with the former can be detected,
-     diagnosed, and rejected as appropriate.  */
+     diagnosed, and rejected as appropriate.  To match the C++ FE, do
+     not pass an error_mark_node when we found an undeclared variable.  */
   tree last_decl = lookup_last_decl (*node);
+  if (last_decl == error_mark_node)
+    last_decl = NULL_TREE;
   return decl_attributes (node, attributes, flags, last_decl);
 }
 
diff --git a/gcc/testsuite/c-c++-common/attr-aligned-2.c b/gcc/testsuite/c-c++-common/attr-aligned-2.c
new file mode 100644 (file)
index 0000000..991b390
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR c/115549 */
+/* { dg-do compile } */
+
+__attribute__((aligned,optimize(s))) /* { dg-error "not declared|undeclared" } */
+int s()
+{
+  return 0;
+}