/* { dg-do link } */ /* { dg-options "-O -fstrict-aliasing" } */ class first { public: double d; int f1; }; class middle : public first { }; class second : public middle { public: int f2; short a; }; class third { public: char a; char b; }; class multi: public third, public second { public: short s; /* The following field used to be of type char but that causes class multi to effectively get alias-set zero which we end up not optimizing because of the fix for PR44164. */ int f3; }; extern void link_error (); void foo (first *s1, second *s2) { s1->f1 = 0; s2->f2 = 0; s1->f1++; s2->f2++; s1->f1++; s2->f2++; if (s1->f1 != 2) link_error (); } void bar (first *s1, multi *s3) { s1->f1 = 0; s3->f3 = 0; s1->f1++; s3->f3++; s1->f1++; s3->f3++; if (s1->f1 != 2) link_error (); } int main() { first a; second b; multi c; foo (&a, &b); bar (&a, &c); return 0; }