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 } } */ + +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(); +} -- 2.47.0