From 17f6add3aba96681673b78862116a85d619cd806 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 28 Oct 2024 22:05:08 -0700 Subject: [PATCH] testcase: Add testcase for tree-optimization/117341 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 --- gcc/testsuite/g++.dg/torture/pr117341-1.C | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 gcc/testsuite/g++.dg/torture/pr117341-1.C diff --git a/gcc/testsuite/g++.dg/torture/pr117341-1.C b/gcc/testsuite/g++.dg/torture/pr117341-1.C new file mode 100644 index 00000000000..b13d2502e35 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr117341-1.C @@ -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; +}