https://gcc.gnu.org/g:35aede5a6bc9b2cf7e7d019148debb6f227c6eb1
commit r13-9506-g35aede5a6bc9b2cf7e7d019148debb6f227c6eb1 Author: Sam James <s...@gentoo.org> Date: Mon Oct 21 12:11:42 2024 +0100 testsuite: add testcase for fixed PR107467 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. (cherry picked from commit 4e09ae37dbe0a10f48490214f50ff733cc92280a) Diff: --- gcc/testsuite/g++.dg/lto/pr107467_0.C | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) 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..a871aca82459 --- /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(); +}