https://gcc.gnu.org/g:4c7009735f73f59c9a635d79c048c8981310e331

commit r15-1951-g4c7009735f73f59c9a635d79c048c8981310e331
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Jun 27 16:39:29 2024 -0400

    c: ICE on invalid with attribute optimize [PR115549]
    
    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.

Diff:
---
 gcc/c/c-decl.cc                             | 5 ++++-
 gcc/testsuite/c-c++-common/attr-aligned-2.c | 8 ++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 0eac266471f7..97f1d346835e 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -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
index 000000000000..991b3904540b
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/attr-aligned-2.c
@@ -0,0 +1,8 @@
+/* PR c/115549 */
+/* { dg-do compile } */
+
+__attribute__((aligned,optimize(s))) /* { dg-error "not declared|undeclared" } 
*/
+int s()
+{
+  return 0;
+}

Reply via email to