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