On Wed, Jan 16, 2019 at 04:11:44AM -0800, H.J. Lu wrote: > > Why? What is so special about C and (implicit?) casts where the rhs isn't > > ADDR_EXPR? Aren't all casts (explicit or implicit) from one pointer type > > to another pointer and satisfy the rules something that should be warned > > -Wincompatible-pointer-types is C only. In C++, incompatible pointer types > aren't allowed at all.
How so? You can certainly: struct B { int i; }; struct C { struct B b; } __attribute__ ((packed)); extern struct C *p; long* g8 (void) { return (long *)p; } and similarly for C. So, why is explicit cast something that shouldn't be warned about in this case and implicit cast should get a warning, especially when it already does get one (and one even enabled by default, -Wincompatible-pointer-types)? Either such casts are problematic and then it should treat explicit and implicit casts the same, or they aren't, and then -Wincompatible-pointer-types is all you need. Jakub