https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70143
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to rguent...@suse.de from comment #5) > Though that will FAIL the gcc.dg/Wstrict-aliasing-struct-member.c > I added. > > Note that we then also don't warn for > > struct a { > int i; > int k; > }; > struct b { > struct a a; > int j; > }; > int main(void) { > static struct b b; > struct a *ap=(struct a *)&b; > return ((struct b *)&ap->k)->j; > } > > then either. Doing this kind of warnings strictly based on alias > sets only is going to be "broken" - though I consider our strict-aliasing > warnings broken anyway (and I don't think we can ever implement something > sensible :/). The point of -Wstrict-aliasing=3 is to give very few false positives and still catch lots of likely bugs. So, if there is INDIRECT_REF or *MEM_REF involved and you can't analyze what it points to, we should err on the side that it might be valid, people can still use -Wstrict-aliasing=2 that will warn even about these.