// 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; }