On Wed, Dec 28, 2022 at 9:17 AM Martin Liška <[email protected]> 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
>