summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/opt/pr25005.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/pr25005.C')
-rw-r--r--gcc/testsuite/g++.dg/opt/pr25005.C34
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/pr25005.C b/gcc/testsuite/g++.dg/opt/pr25005.C
new file mode 100644
index 000000000..f62f8a2bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr25005.C
@@ -0,0 +1,34 @@
+// PR target/25005
+// { dg-options "-O2 -funroll-loops" }
+// { dg-do compile }
+
+inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; }
+
+struct M { ~M() { } };
+
+struct P
+{
+ P () { v[0] = 0; v[1] = 0; v[2] = 0; }
+ P (const P &x) { for (int i = 0; i < 3; ++i) v[i] = x.v[i]; }
+ double v[3];
+};
+
+struct V : public M
+{
+ V (const P *x, const P *y)
+ {
+ P *b = this->a = ::new P[2];
+ for (; x != y; ++x, ++b)
+ ::new (b) P(*x);
+ }
+ P *a;
+};
+
+void bar (const V &);
+
+void
+foo ()
+{
+ const P d[2] = { P(), P() };
+ bar (V (&d[0], &d[2]));
+}