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 >