diff options
author | Sam James <sam@gentoo.org> | 2024-10-21 12:11:42 +0100 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-10-28 17:05:24 +0000 |
commit | 4e09ae37dbe0a10f48490214f50ff733cc92280a (patch) | |
tree | 40b76ec92834628200f8ca426b47429e000fccda /gcc | |
parent | 1c0ecf06c0c9f3268ba52d4027e9b78aae4acb51 (diff) | |
download | gcc-4e09ae37dbe0a10f48490214f50ff733cc92280a.zip gcc-4e09ae37dbe0a10f48490214f50ff733cc92280a.tar.gz gcc-4e09ae37dbe0a10f48490214f50ff733cc92280a.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr107467_0.C | 52 |
1 files changed, 52 insertions, 0 deletions
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 0000000..a871aca --- /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(); +} |