diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-08-31 16:03:20 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-08-31 16:03:20 +0200 |
commit | afd9558b94eb78ef3e9a8818f2d57f9311e99b4f (patch) | |
tree | 58ae33ca95b6a8fbfe088c921b298883c7c5a787 | |
parent | dd346b613886aea9761dbb5e7a8d6c47922750b2 (diff) | |
download | gcc-afd9558b94eb78ef3e9a8818f2d57f9311e99b4f.zip gcc-afd9558b94eb78ef3e9a8818f2d57f9311e99b4f.tar.gz gcc-afd9558b94eb78ef3e9a8818f2d57f9311e99b4f.tar.bz2 |
c++: Add unsequenced C++ testcase
This is the testcase I wrote originally and which on top of the
https://gcc.gnu.org/pipermail/gcc-patches/2024-August/659154.html
patch didn't behave the way I wanted (no warning and no optimizations of
[[unsequenced]] function templates which don't have pointer/reference
arguments.
Posting this separately, because it depends on the above mentioned
patch as well as the PR116175
https://gcc.gnu.org/pipermail/gcc-patches/2024-August/659157.html
patch.
2024-08-31 Jakub Jelinek <jakub@redhat.com>
* g++.dg/ext/attr-unsequenced-1.C: New test.
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attr-unsequenced-1.C | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/ext/attr-unsequenced-1.C b/gcc/testsuite/g++.dg/ext/attr-unsequenced-1.C new file mode 100644 index 0000000..8e640a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-unsequenced-1.C @@ -0,0 +1,53 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-O2 -fdump-tree-optimized" } */ +// { dg-final { scan-tree-dump-times " bar<int> \\\(1, 2, 3\\\);" 1 "optimized" } } +// { dg-final { scan-tree-dump-times " bar<int> \\\(4, 5, 6\\\);" 1 "optimized" } } + +template <typename T, typename U> +[[gnu::noipa]] U +foo (T x, T y, T z) [[gnu::unsequenced]] +{ + *x = 1; + *y = 2; + *z = 3; +} + +template <typename T> +[[gnu::noipa]] T +bar (T x, T y, T z) [[gnu::unsequenced]] +{ + return x + y + z; +} + +int +baz () [[gnu::unsequenced]] +{ + int x, y, z; + foo <int *, void> (&x, &y, &z); + return x; +} + +int +qux () [[gnu::unsequenced]] +{ + int a = bar (1, 2, 3); + int b = bar (1, 2, 3); + int c = bar (1, 2, 3); + int d = bar (4, 5, 6); + int e = bar (4, 5, 6); + int f = bar (4, 5, 6); + return a + b + c + d + e + f; +} + +template <typename T, typename U> +[[gnu::noipa]] U +corge (T x, T y, T z) [[gnu::unsequenced]] // { dg-warning "'unsequenced' attribute on function type without pointer arguments returning 'void'" } +{ + x += y + z; +} + +void +freddy () +{ + corge <int, void> (1, 2, 3); +} |