Sorry, I used the wrong e-mail address for Joseph.

On Thu, Jun 27, 2024 at 05:04:41PM -0400, Marek Polacek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> 
> -- >8 --
> 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                             | 5 ++++-
>  gcc/testsuite/c-c++-common/attr-aligned-2.c | 8 ++++++++
>  2 files changed, 12 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/c-c++-common/attr-aligned-2.c
> 
> diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
> index 0eac266471f..97f1d346835 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 00000000000..991b3904540
> --- /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;
> +}
> 
> base-commit: da7976a015a4388b8ed843412c3c1c840451cf0f
> -- 
> 2.45.2
> 

Marek

Reply via email to