]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
testcase: Add testcase for tree-optimization/117341
authorAndrew Pinski <quic_apinski@quicinc.com>
Tue, 29 Oct 2024 05:05:08 +0000 (22:05 -0700)
committerAndrew Pinski <quic_apinski@quicinc.com>
Tue, 29 Oct 2024 15:49:41 +0000 (08:49 -0700)
Even though PR 117341 was a duplicate of PR 116768, another
testcase this time C++ does not hurt to have.
The testcase is a self-contained and does not use directly libstdc++
except for operator new (it does not even call delete).

Tested on x86_64-linux-gnu with it working.

PR tree-optimization/117341

gcc/testsuite/ChangeLog:

* g++.dg/torture/pr117341-1.C: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
gcc/testsuite/g++.dg/torture/pr117341-1.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/torture/pr117341-1.C b/gcc/testsuite/g++.dg/torture/pr117341-1.C
new file mode 100644 (file)
index 0000000..b13d250
--- /dev/null
@@ -0,0 +1,54 @@
+void swap(long &a, long &b)
+{
+  long t = a;
+  a = b;
+  b = t;
+}
+
+struct Array {
+    long arr[1];
+    Array() : arr() {}
+    /* Operators */
+    long& operator[](int index) { return arr[index]; }
+    const long& operator[](int index) const { return arr[index]; }
+    /* Operations */
+    void swap(Array& array)  {
+        for (int i = 0; i < 1; ++i)
+            ::swap(arr[i], array[i]);
+    }
+};
+
+class Vector : public Array {};
+
+struct v
+{
+  Vector *e;
+  v() : e (new Vector[4]){}
+  Vector& operator[](int index) { return e[index]; }
+  const Vector& operator[](int index) const { return e[index]; }
+};
+static inline Vector func(const Vector& y)
+{
+        return y;
+}
+
+volatile int a;
+
+int main() {
+    v solution;
+    solution[0][0] = 1;
+    int t = a;
+    for (int i = 0; i < 3; ++i) {
+        const Vector& v = solution[i];
+        Vector sum;
+        const long delta = func(v)[0] & t;
+        sum[0] = v[0] + delta;
+        solution[i + 1].swap(sum);
+    }
+    for(int i = 0; i < 4; i++)
+    {
+      if (solution[i][0] != 1)
+        __builtin_abort();
+    }
+    return 0;
+}