summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/opt/alias4.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/alias4.C')
-rw-r--r--gcc/testsuite/g++.dg/opt/alias4.C56
1 files changed, 56 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/alias4.C b/gcc/testsuite/g++.dg/opt/alias4.C
new file mode 100644
index 000000000..6965b8c73
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/alias4.C
@@ -0,0 +1,56 @@
+// PR c++/27768
+// Alias grouping was losing some may_aliases, causing us to think
+// the store to w.p was dead.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+int N = 1;
+
+struct VA
+{
+ int *p, *q, *r;
+
+ VA() : p(), q() {}
+ VA(const VA&) : p(), q() {}
+ ~VA() { if (p) --N; }
+};
+
+inline void foo(VA, VA, VA) {}
+
+struct VB
+{
+ VA va;
+
+ VB() {}
+
+ VB(const VB&)
+ {
+ va.p = new int(va.q - va.p);
+ va.r = va.p + (va.q - va.p);
+ foo(va, va, va);
+ }
+};
+
+struct VC : VB { char c; };
+struct V : VC {};
+
+struct WA
+{
+ struct X {};
+ X **p, **q, **r;
+
+ WA() : p() {}
+ ~WA() { if (p) --N; }
+};
+
+struct W : WA {};
+
+int main()
+{
+ {
+ V v, u(v);
+ W w;
+ }
+ return N;
+}