On Wed, Jan 16, 2019 at 3:30 AM Jakub Jelinek <ja...@redhat.com> wrote: > > On Mon, Jan 14, 2019 at 10:00:11AM -0800, H.J. Lu wrote: > > On Mon, Jan 14, 2019 at 6:22 AM Jakub Jelinek <ja...@redhat.com> wrote: > > > > > > On Sun, Jan 13, 2019 at 06:54:05AM -0800, H.J. Lu wrote: > > > > > What always matters is whether we take address of a packed structure > > > > > field/non-static data member or whether we just read that field. > > > > > The former should be warned about, the latter not. > > > > > > > > > > > > > How about this patch? It checks if address is taken with NOP. > > > > > > I'd like to first understand the convert_p argument to > > > warn_for_address_or_pointer_of_packed_member. > > > > > > To me it seems you want to emit two different warnings, perhaps one > > > surpressed if the other one is emitted, but you actually from the start > > > decide which of the two you are going to check for. That is just weird. > > > > convert_p is only for C. > > 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. > about if the conditions are met? > convert_p is set to TRUE to handle this case for incompatible pointer types: [hjl@gnu-cfl-1 pr51628-3]$ cat x.i struct B { int i; }; struct C { struct B b; } __attribute__ ((packed)); extern struct C *p; long* g8 (void) { return p; } [hjl@gnu-cfl-1 pr51628-3]$ make x.s /export/build/gnu/tools-build/gcc-debug/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/tools-build/gcc-debug/build-x86_64-linux/gcc/ -O2 -S x.i x.i: In function \u2018g8\u2019: x.i:6:26: warning: returning \u2018struct C *\u2019 from a function with incompatible return type \u2018long int *\u2019 [-Wincompatible-pointer-types] 6 | long* g8 (void) { return p; } | ^ x.i:6:1: warning: converting a packed \u2018struct C *\u2019 pointer (alignment 1) to \u2018long int *\u2019 (alignment 8) may result in an unaligned pointer value [-Waddress-of-packed-member] 6 | long* g8 (void) { return p; } | ^~~~ x.i:2:8: note: defined here 2 | struct C { struct B b; } __attribute__ ((packed)); | ^ [hjl@gnu-cfl-1 pr51628-3]$ I am using the same function to warn both addresses and pointers. I need a way to tell that we are converting pointers, not assigning address to pointer. This info is readily available in the front-end. -- H.J.