aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-04 09:52:18 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-04 09:52:18 +0100
commitc8df72c446639286815357b723f257264e6b6162 (patch)
tree663aeb29e6f09be16da617cde0ecf1df6beed0da
parent4a7df256445299c55162638c37c33bb8e6a19103 (diff)
downloadgcc-c8df72c446639286815357b723f257264e6b6162.zip
gcc-c8df72c446639286815357b723f257264e6b6162.tar.gz
gcc-c8df72c446639286815357b723f257264e6b6162.tar.bz2
* g++.dg/torture/alias-1.C: New test.
From-SVN: r268510
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/alias-1.C57
2 files changed, 61 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c186df7..e2b0243 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-02-04 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/torture/alias-1.C: New test.
+
2019-02-03 Martin Sebor <msebor@redhat.com>
PR c/69661
diff --git a/gcc/testsuite/g++.dg/torture/alias-1.C b/gcc/testsuite/g++.dg/torture/alias-1.C
new file mode 100644
index 0000000..2abe543
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/alias-1.C
@@ -0,0 +1,57 @@
+// Verify we don't try to allocate the same stack slot for
+// buf1 and buf2 in qux. While there is a CLOBBER stmt for buf1
+// from inlined destructor, the buf1 variable doesn't go out of scope
+// until after the baz call.
+// { dg-do run }
+
+#include <new>
+#include <cstring>
+#include <cstdlib>
+
+char *p;
+struct S { char buf[128]; S () { memset (buf, ' ', 128); }; ~S () {}; };
+
+__attribute__((noipa)) void
+foo (char *x)
+{
+ p = x;
+}
+
+__attribute__((noipa)) int
+bar (S *x)
+{
+ return x->buf[12];
+}
+
+__attribute__((noipa)) void
+baz (char *x)
+{
+ S *a = new (p) (S);
+ S *b = new (x) (S);
+ memset (a->buf, '0', 128);
+ memset (b->buf, '1', 128);
+ if (bar (a) != '0' || bar (b) != '1')
+ abort ();
+ b->~S ();
+ a->~S ();
+}
+
+__attribute__((noipa)) void
+qux ()
+{
+ char buf1[128];
+ foo (buf1);
+ S *p = new (buf1) (S);
+ bar (p);
+ p->~S ();
+ {
+ char buf2[128];
+ baz (buf2);
+ }
+}
+
+int
+main ()
+{
+ qux ();
+}