On Thu, 25 Jul 2024, Jason Merrill wrote: > Tested x86_64-pc-linux-gnu, applying to trunk. > > Also built highway to check. > > -- 8< -- > > My patch for 109753 applies the current #pragma target/optimize to a > function when we compile it, which was a problem for a template > instantiation deferred until EOF, where different #pragmas are active. So > let's only do this for artificial functions. > > PR c++/115403 > PR c++/109753 > > gcc/cp/ChangeLog: > > * decl.cc (start_preparsed_function): Only call decl_attributes for > artificial functions. > > gcc/testsuite/ChangeLog: > > * g++.dg/ext/pragma-target1.C: New test. > --- > gcc/cp/decl.cc | 7 +++++-- > gcc/testsuite/g++.dg/ext/pragma-target1.C | 6 ++++++ > 2 files changed, 11 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/ext/pragma-target1.C > > diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc > index 6b686d75a49..279af21eed0 100644 > --- a/gcc/cp/decl.cc > +++ b/gcc/cp/decl.cc > @@ -17882,8 +17882,11 @@ start_preparsed_function (tree decl1, tree attrs, > int flags) > doing_friend = true; > } > > - /* Adjust for #pragma target/optimize. */ > - decl_attributes (&decl1, NULL_TREE, 0); > + /* Adjust for #pragma target/optimize if this is an artificial function > that > + (probably) didn't go through grokfndecl. We particularly don't want > this > + for deferred instantiations, which should match their template. */ > + if (DECL_ARTIFICIAL (decl1)) > + decl_attributes (&decl1, NULL_TREE, 0);
Couldn't an artificial function get synthesized at EOF if e.g. it's needed by a deferred instantiation? In that case we'll still call decl_attributes on it which will inherit the last active #pragma, which seems unintended. Maybe we should clear #pragma before processing deferred instantiations? > > if (DECL_DECLARED_INLINE_P (decl1) > && lookup_attribute ("noinline", attrs)) > diff --git a/gcc/testsuite/g++.dg/ext/pragma-target1.C > b/gcc/testsuite/g++.dg/ext/pragma-target1.C > new file mode 100644 > index 00000000000..0ce2438da2f > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ext/pragma-target1.C > @@ -0,0 +1,6 @@ > +// PR c++/115403 > +// { dg-do compile { target x86_64-*-* } } > + > +template <typename> __attribute__((always_inline)) inline void AssertEqual() > {} > +void TestAllF16FromF32() { AssertEqual<float>(); } > +#pragma GCC target "sse4.1" > > base-commit: 29341f21ce1eb7cdb8cd468e4ceb0d07cf2775e0 > -- > 2.45.2 > >