Sam James <s...@gentoo.org> writes: > PR107467 ended up being fixed by the fix for PR115110, but let's > add the testcase on top. > > gcc/testsuite/ChangeLog: > PR tree-optimization/107467 > PR middle-end/115110 > > * g++.dg/lto/pr107467_0.C: New test. > --- > OK? > > gcc/testsuite/g++.dg/lto/pr107467_0.C | 52 +++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/lto/pr107467_0.C > > diff --git a/gcc/testsuite/g++.dg/lto/pr107467_0.C > b/gcc/testsuite/g++.dg/lto/pr107467_0.C > new file mode 100644 > index 000000000000..3a2c1c2d7ae1 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/lto/pr107467_0.C > @@ -0,0 +1,52 @@ > +/* { dg-lto-do run } */ > +/* { dg-lto-options { -O2 -fno-strict-aliasing -flto } } */
This should be {{ }} around the options themselves, fixed locally. > + > +template <class T> > +struct pair > +{ > + int first; > + T second; > +}; > + > +template <typename C> > +[[gnu::optimize("strict-aliasing")]] > +bool __attribute__((noinline)) > +compare_pairs(const pair<C> &lhs, const pair<C> &rhs) { > + return lhs.first == rhs.first && lhs.second == rhs.second; > +} > + > +template <typename B> struct Combined { > + pair<B *> > +__attribute__((noinline)) get_const() { > + return pair<B *>{123, nullptr}; > + } > +[[gnu::optimize("strict-aliasing")]] > + bool > +__attribute__((noinline)) clashy() { > + return compare_pairs(get_const(), get_const()); > + } > +}; > + > +class SomeClass {}; > +class OtherClass {}; > + > +[[gnu::optimize("strict-aliasing")]] > +[[gnu::used]] > +void some_func() { > + Combined<SomeClass> myvar; > + __builtin_printf("%i\n", myvar.clashy()); > +} > + > +[[gnu::optimize("strict-aliasing")]] > +void other_func() { > + Combined<OtherClass> myvar; > + int t = myvar.clashy(); > + if (!t) > + __builtin_abort(); > +} > + > +[[gnu::optimize("O0")]] > +int main() > +{ > + other_func(); > +}