On Wed, Dec 28, 2022 at 9:17 AM Martin Liška <mli...@suse.cz> wrote:
>
> Hi.
>
> The patch checks all attribute arguments if they are string. If not,
> an error message is emitted.
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?

OK.

Richard.

> Thanks,
> Martin
>
>         PR c/107993
>
> gcc/c-family/ChangeLog:
>
>         * c-attribs.cc (handle_target_clones_attribute): Check for
>         string constant for all target_clone attribute values.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/i386/pr107993.c: New test.
> ---
>  gcc/c-family/c-attribs.cc                | 14 ++++++++++----
>  gcc/testsuite/gcc.target/i386/pr107993.c |  9 +++++++++
>  2 files changed, 19 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr107993.c
>
> diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
> index b36dd97802b..33d84cb6e07 100644
> --- a/gcc/c-family/c-attribs.cc
> +++ b/gcc/c-family/c-attribs.cc
> @@ -5574,12 +5574,18 @@ handle_target_clones_attribute (tree *node, tree 
> name, tree ARG_UNUSED (args),
>    /* Ensure we have a function type.  */
>    if (TREE_CODE (*node) == FUNCTION_DECL)
>      {
> -      if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
> +      for (tree t = args; t != NULL_TREE; t = TREE_CHAIN (t))
>         {
> -         error ("%qE attribute argument not a string constant", name);
> -         *no_add_attrs = true;
> +         tree value = TREE_VALUE (t);
> +         if (TREE_CODE (value) != STRING_CST)
> +           {
> +             error ("%qE attribute argument not a string constant", name);
> +             *no_add_attrs = true;
> +             return NULL_TREE;
> +           }
>         }
> -      else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
> +
> +      if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
>         {
>           warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
>                    "with %qs attribute", name, "always_inline");
> diff --git a/gcc/testsuite/gcc.target/i386/pr107993.c 
> b/gcc/testsuite/gcc.target/i386/pr107993.c
> new file mode 100644
> index 00000000000..b0b84a677d8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr107993.c
> @@ -0,0 +1,9 @@
> +/* PR c/107993 */
> +/* { dg-do compile } */
> +
> +typedef union { int x; } u;
> +__attribute__((target_clones("arch=alderlake",!"default")))
> +int f (u *x)
> +{ /* { dg-error ".target_clones. attribute argument not a string constant" } 
> */
> +  return 0;
> +}
> --
> 2.39.0
>

Reply via email to