https://gcc.gnu.org/g:afd9558b94eb78ef3e9a8818f2d57f9311e99b4f

commit r15-3331-gafd9558b94eb78ef3e9a8818f2d57f9311e99b4f
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sat Aug 31 16:03:20 2024 +0200

    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  <ja...@redhat.com>
    
            * g++.dg/ext/attr-unsequenced-1.C: New test.

Diff:
---
 gcc/testsuite/g++.dg/ext/attr-unsequenced-1.C | 53 +++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

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 000000000000..8e640a8cec1e
--- /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);
+}

Reply via email to