Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> writes: > Hi, > The attached patch emits a more verbose diagnostic for target attribute that > is an architecture extension needing a leading '+'. > > For the following test, > void calculate(void) __attribute__ ((__target__ ("sve"))); > > With patch, the compiler now emits: > 102376.c:1:1: error: arch extension ‘sve’ should be prepended with ‘+’ > 1 | void calculate(void) __attribute__ ((__target__ ("sve"))); > | ^~~~ > > instead of: > 102376.c:1:1: error: pragma or attribute ‘target("sve")’ is not valid > 1 | void calculate(void) __attribute__ ((__target__ ("sve"))); > | ^~~~
Nice :-) > (This isn't specific to sve though). > OK to commit after bootstrap+test ? > > Thanks, > Prathamesh > > diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c > index a9a1800af53..975f7faf968 100644 > --- a/gcc/config/aarch64/aarch64.c > +++ b/gcc/config/aarch64/aarch64.c > @@ -17821,7 +17821,16 @@ aarch64_process_target_attr (tree args) > num_attrs++; > if (!aarch64_process_one_target_attr (token)) > { > - error ("pragma or attribute %<target(\"%s\")%> is not valid", token); > + /* Check if token is possibly an arch extension without > + leading '+'. */ > + char *str = (char *) xmalloc (strlen (token) + 2); > + str[0] = '+'; > + strcpy(str + 1, token); I think std::string would be better here, e.g.: auto with_plus = std::string ("+") + token; > + if (aarch64_handle_attr_isa_flags (str)) > + error("arch extension %<%s%> should be prepended with %<+%>", > token); Nit: should be a space before the “(”. In principle, a fixit hint would have been nice here, but I don't think we have enough information to provide one. (Just saying for the record.) Thanks, Richard > + else > + error ("pragma or attribute %<target(\"%s\")%> is not valid", > token); > + free (str); > return false; > } >