1 // PR c++/27768
2 // Alias grouping was losing some may_aliases, causing us to think
3 // the store to w.p was dead.
4
5 // { dg-do run }
6 // { dg-options "-O2" }
7
8 int N = 1;
9
10 struct VA
11 {
12 int *p, *q, *r;
13
VAVA14 VA() : p(), q() {}
VAVA15 VA(const VA&) : p(), q() {}
~VAVA16 ~VA() { if (p) --N; }
17 };
18
foo(VA,VA,VA)19 inline void foo(VA, VA, VA) {}
20
21 struct VB
22 {
23 VA va;
24
VBVB25 VB() {}
26
VBVB27 VB(const VB&)
28 {
29 va.p = new int(va.q - va.p);
30 va.r = va.p + (va.q - va.p);
31 foo(va, va, va);
32 }
33 };
34
35 struct VC : VB { char c; };
36 struct V : VC {};
37
38 struct WA
39 {
40 struct X {};
41 X **p, **q, **r;
42
WAWA43 WA() : p() {}
~WAWA44 ~WA() { if (p) --N; }
45 };
46
47 struct W : WA {};
48
main()49 int main()
50 {
51 {
52 V v, u(v);
53 W w;
54 }
55 return N;
56 }
57