Message ID | 20231122211235.3503229-1-jason@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/2] c-family: -Waddress-of-packed-member and casts | expand |
On Nov 22, 2023, Jason Merrill <jason@redhat.com> wrote:
> Tested x86_64-pc-linux-gnu, OK for trunk?
FYI, Linaro's regression tester let me know that my patch reversal, that
expected this patch to go in instead, caused two "regressions".
https://linaro.atlassian.net/browse/GNU-1067
On Wed, Nov 22, 2023 at 11:45 PM Jason Merrill <jason@redhat.com> wrote: > > Tested x86_64-pc-linux-gnu, OK for trunk? OK > -- 8< -- > > -Waddress-of-packed-member, in addition to the documented warning about > taking the address of a packed member, also warns about casting from > a pointer to a TYPE_PACKED type to a pointer to a type with greater > alignment. > > This wrongly warns if the source is a pointer to enum when -fshort-enums > is on, since that is also represented by TYPE_PACKED. > > And there's already -Wcast-align to catch casting from pointer to less > aligned type (packed or otherwise) to pointer to more aligned type; even > apart from the enum problem, this seems like a somewhat arbitrary subset of > that warning. Though that isn't currently on by default. > > So, this patch removes the undocumented type-based warning from > -Waddress-of-packed-member. Some of the tests where the warning is > desirable I changed to use -Wcast-align=strict instead. The ones that > require -Wno-incompatible-pointer-types, I just removed. > > gcc/c-family/ChangeLog: > > * c-warn.cc (check_address_or_pointer_of_packed_member): > Remove warning based on TYPE_PACKED. > > gcc/testsuite/ChangeLog: > > * c-c++-common/Waddress-of-packed-member-1.c: Don't expect > a warning on the cast cases. > * c-c++-common/pr51628-35.c: Use -Wcast-align=strict. > * g++.dg/warn/Waddress-of-packed-member3.C: Likewise. > * gcc.dg/pr88928.c: Likewise. > * gcc.dg/pr51628-20.c: Removed. > * gcc.dg/pr51628-21.c: Removed. > * gcc.dg/pr51628-25.c: Removed. > --- > gcc/c-family/c-warn.cc | 58 +------------------ > .../Waddress-of-packed-member-1.c | 12 ++-- > gcc/testsuite/c-c++-common/pr51628-35.c | 6 +- > .../g++.dg/warn/Waddress-of-packed-member3.C | 8 +-- > gcc/testsuite/gcc.dg/pr51628-20.c | 11 ---- > gcc/testsuite/gcc.dg/pr51628-21.c | 11 ---- > gcc/testsuite/gcc.dg/pr51628-25.c | 9 --- > gcc/testsuite/gcc.dg/pr88928.c | 6 +- > 8 files changed, 19 insertions(+), 102 deletions(-) > delete mode 100644 gcc/testsuite/gcc.dg/pr51628-20.c > delete mode 100644 gcc/testsuite/gcc.dg/pr51628-21.c > delete mode 100644 gcc/testsuite/gcc.dg/pr51628-25.c > > diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc > index d2938b91043..2a399ba6d14 100644 > --- a/gcc/c-family/c-warn.cc > +++ b/gcc/c-family/c-warn.cc > @@ -2991,10 +2991,9 @@ check_alignment_of_packed_member (tree type, tree field, bool rvalue) > return NULL_TREE; > } > > -/* Return struct or union type if the right hand value, RHS: > - 1. Is a pointer value which isn't aligned to a pointer type TYPE. > - 2. Is an address which takes the unaligned address of packed member > - of struct or union when assigning to TYPE. > +/* Return struct or union type if the right hand value, RHS > + is an address which takes the unaligned address of packed member > + of struct or union when assigning to TYPE. > Otherwise, return NULL_TREE. */ > > static tree > @@ -3021,57 +3020,6 @@ check_address_or_pointer_of_packed_member (tree type, tree rhs) > > type = TREE_TYPE (type); > > - if (TREE_CODE (rhs) == PARM_DECL > - || VAR_P (rhs) > - || TREE_CODE (rhs) == CALL_EXPR) > - { > - tree rhstype = TREE_TYPE (rhs); > - if (TREE_CODE (rhs) == CALL_EXPR) > - { > - rhs = CALL_EXPR_FN (rhs); /* Pointer expression. */ > - if (rhs == NULL_TREE) > - return NULL_TREE; > - rhs = TREE_TYPE (rhs); /* Pointer type. */ > - /* We could be called while processing a template and RHS could be > - a functor. In that case it's a class, not a pointer. */ > - if (!rhs || !POINTER_TYPE_P (rhs)) > - return NULL_TREE; > - rhs = TREE_TYPE (rhs); /* Function type. */ > - rhstype = TREE_TYPE (rhs); > - if (!rhstype || !POINTER_TYPE_P (rhstype)) > - return NULL_TREE; > - rvalue = true; > - } > - if (rvalue && POINTER_TYPE_P (rhstype)) > - rhstype = TREE_TYPE (rhstype); > - while (TREE_CODE (rhstype) == ARRAY_TYPE) > - rhstype = TREE_TYPE (rhstype); > - if (TYPE_PACKED (rhstype)) > - { > - unsigned int type_align = min_align_of_type (type); > - unsigned int rhs_align = min_align_of_type (rhstype); > - if (rhs_align < type_align) > - { > - auto_diagnostic_group d; > - location_t location = EXPR_LOC_OR_LOC (rhs, input_location); > - if (warning_at (location, OPT_Waddress_of_packed_member, > - "converting a packed %qT pointer (alignment %d) " > - "to a %qT pointer (alignment %d) may result in " > - "an unaligned pointer value", > - rhstype, rhs_align, type, type_align)) > - { > - tree decl = TYPE_STUB_DECL (rhstype); > - if (decl) > - inform (DECL_SOURCE_LOCATION (decl), "defined here"); > - decl = TYPE_STUB_DECL (type); > - if (decl) > - inform (DECL_SOURCE_LOCATION (decl), "defined here"); > - } > - } > - } > - return NULL_TREE; > - } > - > tree context = NULL_TREE; > > /* Check alignment of the object. */ > diff --git a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c > index 95a376664da..0f5188df70a 100644 > --- a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c > +++ b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c > @@ -52,12 +52,12 @@ void foo (void) > f0 = *&__real__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ > f0 = *&__imag__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ > i1 = (&t0.c, (int*) 0); /* { dg-bogus "may result in an unaligned pointer value" } */ > - t2 = (struct t**) t10; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > - t2 = (struct t**) t100; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > - t2 = (struct t**) t1; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > - t2 = (struct t**) bar(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > - t2 = (struct t**) baz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > - t2 = (struct t**) bazz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > + t2 = (struct t**) t10; /* { dg-bogus "may result in an unaligned pointer value" } */ > + t2 = (struct t**) t100; /* { dg-bogus "may result in an unaligned pointer value" } */ > + t2 = (struct t**) t1; /* { dg-bogus "may result in an unaligned pointer value" } */ > + t2 = (struct t**) bar(); /* { dg-bogus "may result in an unaligned pointer value" } */ > + t2 = (struct t**) baz(); /* { dg-bogus "may result in an unaligned pointer value" } */ > + t2 = (struct t**) bazz(); /* { dg-bogus "may result in an unaligned pointer value" } */ > i1 = &t0.b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > i1 = &t1->b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > i1 = &t10[0].b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ > diff --git a/gcc/testsuite/c-c++-common/pr51628-35.c b/gcc/testsuite/c-c++-common/pr51628-35.c > index fa37d99beb7..a88c19ea0df 100644 > --- a/gcc/testsuite/c-c++-common/pr51628-35.c > +++ b/gcc/testsuite/c-c++-common/pr51628-35.c > @@ -1,6 +1,6 @@ > /* PR c/51628. */ > /* { dg-do compile } */ > -/* { dg-options "-O" } */ > +/* { dg-options "-O -Wcast-align=strict" } */ > > struct B { int i; }; > struct C { struct B b; } __attribute__ ((packed)); > @@ -12,12 +12,12 @@ long * > foo1 (void) > { > return (long *) p; > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ > } > > long * > foo2 (void) > { > return (long *) bar (); > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ > } > diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C > index aeffb969c01..28dd05d366c 100644 > --- a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C > +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C > @@ -1,5 +1,5 @@ > // { dg-do compile { target { ! default_packed } } } > -// Test that -Waddress-of-packed-member works with member functions. > +// { dg-additional-options -Wcast-align=strict } > > struct S { > char c; > @@ -16,8 +16,8 @@ S** > f () > { > S **s; > - s = reinterpret_cast<S**>(foo ()); // { dg-warning "converting a packed" } > - s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "converting a packed" } > - s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "converting a packed" } > + s = reinterpret_cast<S**>(foo ()); // { dg-warning "increases required alignment" } > + s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "increases required alignment" } > + s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "increases required alignment" } > return s; > } > diff --git a/gcc/testsuite/gcc.dg/pr51628-20.c b/gcc/testsuite/gcc.dg/pr51628-20.c > deleted file mode 100644 > index 2249d85098b..00000000000 > --- a/gcc/testsuite/gcc.dg/pr51628-20.c > +++ /dev/null > @@ -1,11 +0,0 @@ > -/* PR c/51628. */ > -/* { dg-do compile } */ > -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ > - > -struct B { int i; }; > -struct C { struct B b; } __attribute__ ((packed)); > - > -extern struct C *p; > - > -long* g8 (void) { return p; } > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > diff --git a/gcc/testsuite/gcc.dg/pr51628-21.c b/gcc/testsuite/gcc.dg/pr51628-21.c > deleted file mode 100644 > index f1adbe64002..00000000000 > --- a/gcc/testsuite/gcc.dg/pr51628-21.c > +++ /dev/null > @@ -1,11 +0,0 @@ > -/* PR c/51628. */ > -/* { dg-do compile } */ > -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ > - > -struct B { int i; }; > -struct C { struct B b; } __attribute__ ((packed)); > - > -extern struct C p[]; > - > -long* g8 (void) { return p; } > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > diff --git a/gcc/testsuite/gcc.dg/pr51628-25.c b/gcc/testsuite/gcc.dg/pr51628-25.c > deleted file mode 100644 > index f00d9b1bcac..00000000000 > --- a/gcc/testsuite/gcc.dg/pr51628-25.c > +++ /dev/null > @@ -1,9 +0,0 @@ > -/* PR c/51628. */ > -/* { dg-do compile } */ > -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ > - > -struct B { int i; }; > -struct C { struct B b; } __attribute__ ((packed)); > - > -long* g8 (struct C *p) { return p; } > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > diff --git a/gcc/testsuite/gcc.dg/pr88928.c b/gcc/testsuite/gcc.dg/pr88928.c > index 0b6c1d70f05..1d176d6d51d 100644 > --- a/gcc/testsuite/gcc.dg/pr88928.c > +++ b/gcc/testsuite/gcc.dg/pr88928.c > @@ -1,6 +1,6 @@ > -/* { dg-do compile } */ > -/* { dg-options "-Wno-pedantic -Waddress-of-packed-member" } */ > +/* { dg-do compile { target { ! default_packed } } } */ > +/* { dg-options "-Wno-pedantic -Waddress-of-packed-member -Wcast-align=strict" } */ > struct a { } __attribute__((__packed__)); > void c (struct a **); > void d (const struct a *b) { c ((struct a **) b); } > -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ > +/* { dg-warning "increases required alignment" "" { target *-*-* } .-1 } */ > > base-commit: 65bd6de0de57abc86931a5e0b9a8d453ad530004 > -- > 2.39.3 >
Hi, Is it okay to backport b7e4a4c626eeeb32c291d5bbbaa148c5081b6bfd to releases/gcc-13? Without this backport, I see these failures on arm-none-eabi: FAIL: gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early-O2.c (test for excess errors) FAIL: gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early.c (test for excess errors) Kind regards, Torbjörn On 2023-12-11 08:28, Richard Biener wrote: > On Wed, Nov 22, 2023 at 11:45 PM Jason Merrill <jason@redhat.com> wrote: >> >> Tested x86_64-pc-linux-gnu, OK for trunk? > > OK > >> -- 8< -- >> >> -Waddress-of-packed-member, in addition to the documented warning about >> taking the address of a packed member, also warns about casting from >> a pointer to a TYPE_PACKED type to a pointer to a type with greater >> alignment. >> >> This wrongly warns if the source is a pointer to enum when -fshort-enums >> is on, since that is also represented by TYPE_PACKED. >> >> And there's already -Wcast-align to catch casting from pointer to less >> aligned type (packed or otherwise) to pointer to more aligned type; even >> apart from the enum problem, this seems like a somewhat arbitrary subset of >> that warning. Though that isn't currently on by default. >> >> So, this patch removes the undocumented type-based warning from >> -Waddress-of-packed-member. Some of the tests where the warning is >> desirable I changed to use -Wcast-align=strict instead. The ones that >> require -Wno-incompatible-pointer-types, I just removed. >> >> gcc/c-family/ChangeLog: >> >> * c-warn.cc (check_address_or_pointer_of_packed_member): >> Remove warning based on TYPE_PACKED. >> >> gcc/testsuite/ChangeLog: >> >> * c-c++-common/Waddress-of-packed-member-1.c: Don't expect >> a warning on the cast cases. >> * c-c++-common/pr51628-35.c: Use -Wcast-align=strict. >> * g++.dg/warn/Waddress-of-packed-member3.C: Likewise. >> * gcc.dg/pr88928.c: Likewise. >> * gcc.dg/pr51628-20.c: Removed. >> * gcc.dg/pr51628-21.c: Removed. >> * gcc.dg/pr51628-25.c: Removed. >> --- >> gcc/c-family/c-warn.cc | 58 +------------------ >> .../Waddress-of-packed-member-1.c | 12 ++-- >> gcc/testsuite/c-c++-common/pr51628-35.c | 6 +- >> .../g++.dg/warn/Waddress-of-packed-member3.C | 8 +-- >> gcc/testsuite/gcc.dg/pr51628-20.c | 11 ---- >> gcc/testsuite/gcc.dg/pr51628-21.c | 11 ---- >> gcc/testsuite/gcc.dg/pr51628-25.c | 9 --- >> gcc/testsuite/gcc.dg/pr88928.c | 6 +- >> 8 files changed, 19 insertions(+), 102 deletions(-) >> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-20.c >> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-21.c >> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-25.c >> >> diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc >> index d2938b91043..2a399ba6d14 100644 >> --- a/gcc/c-family/c-warn.cc >> +++ b/gcc/c-family/c-warn.cc >> @@ -2991,10 +2991,9 @@ check_alignment_of_packed_member (tree type, tree field, bool rvalue) >> return NULL_TREE; >> } >> >> -/* Return struct or union type if the right hand value, RHS: >> - 1. Is a pointer value which isn't aligned to a pointer type TYPE. >> - 2. Is an address which takes the unaligned address of packed member >> - of struct or union when assigning to TYPE. >> +/* Return struct or union type if the right hand value, RHS >> + is an address which takes the unaligned address of packed member >> + of struct or union when assigning to TYPE. >> Otherwise, return NULL_TREE. */ >> >> static tree >> @@ -3021,57 +3020,6 @@ check_address_or_pointer_of_packed_member (tree type, tree rhs) >> >> type = TREE_TYPE (type); >> >> - if (TREE_CODE (rhs) == PARM_DECL >> - || VAR_P (rhs) >> - || TREE_CODE (rhs) == CALL_EXPR) >> - { >> - tree rhstype = TREE_TYPE (rhs); >> - if (TREE_CODE (rhs) == CALL_EXPR) >> - { >> - rhs = CALL_EXPR_FN (rhs); /* Pointer expression. */ >> - if (rhs == NULL_TREE) >> - return NULL_TREE; >> - rhs = TREE_TYPE (rhs); /* Pointer type. */ >> - /* We could be called while processing a template and RHS could be >> - a functor. In that case it's a class, not a pointer. */ >> - if (!rhs || !POINTER_TYPE_P (rhs)) >> - return NULL_TREE; >> - rhs = TREE_TYPE (rhs); /* Function type. */ >> - rhstype = TREE_TYPE (rhs); >> - if (!rhstype || !POINTER_TYPE_P (rhstype)) >> - return NULL_TREE; >> - rvalue = true; >> - } >> - if (rvalue && POINTER_TYPE_P (rhstype)) >> - rhstype = TREE_TYPE (rhstype); >> - while (TREE_CODE (rhstype) == ARRAY_TYPE) >> - rhstype = TREE_TYPE (rhstype); >> - if (TYPE_PACKED (rhstype)) >> - { >> - unsigned int type_align = min_align_of_type (type); >> - unsigned int rhs_align = min_align_of_type (rhstype); >> - if (rhs_align < type_align) >> - { >> - auto_diagnostic_group d; >> - location_t location = EXPR_LOC_OR_LOC (rhs, input_location); >> - if (warning_at (location, OPT_Waddress_of_packed_member, >> - "converting a packed %qT pointer (alignment %d) " >> - "to a %qT pointer (alignment %d) may result in " >> - "an unaligned pointer value", >> - rhstype, rhs_align, type, type_align)) >> - { >> - tree decl = TYPE_STUB_DECL (rhstype); >> - if (decl) >> - inform (DECL_SOURCE_LOCATION (decl), "defined here"); >> - decl = TYPE_STUB_DECL (type); >> - if (decl) >> - inform (DECL_SOURCE_LOCATION (decl), "defined here"); >> - } >> - } >> - } >> - return NULL_TREE; >> - } >> - >> tree context = NULL_TREE; >> >> /* Check alignment of the object. */ >> diff --git a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >> index 95a376664da..0f5188df70a 100644 >> --- a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >> +++ b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >> @@ -52,12 +52,12 @@ void foo (void) >> f0 = *&__real__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ >> f0 = *&__imag__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ >> i1 = (&t0.c, (int*) 0); /* { dg-bogus "may result in an unaligned pointer value" } */ >> - t2 = (struct t**) t10; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> - t2 = (struct t**) t100; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> - t2 = (struct t**) t1; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> - t2 = (struct t**) bar(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> - t2 = (struct t**) baz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> - t2 = (struct t**) bazz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> + t2 = (struct t**) t10; /* { dg-bogus "may result in an unaligned pointer value" } */ >> + t2 = (struct t**) t100; /* { dg-bogus "may result in an unaligned pointer value" } */ >> + t2 = (struct t**) t1; /* { dg-bogus "may result in an unaligned pointer value" } */ >> + t2 = (struct t**) bar(); /* { dg-bogus "may result in an unaligned pointer value" } */ >> + t2 = (struct t**) baz(); /* { dg-bogus "may result in an unaligned pointer value" } */ >> + t2 = (struct t**) bazz(); /* { dg-bogus "may result in an unaligned pointer value" } */ >> i1 = &t0.b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> i1 = &t1->b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> i1 = &t10[0].b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ >> diff --git a/gcc/testsuite/c-c++-common/pr51628-35.c b/gcc/testsuite/c-c++-common/pr51628-35.c >> index fa37d99beb7..a88c19ea0df 100644 >> --- a/gcc/testsuite/c-c++-common/pr51628-35.c >> +++ b/gcc/testsuite/c-c++-common/pr51628-35.c >> @@ -1,6 +1,6 @@ >> /* PR c/51628. */ >> /* { dg-do compile } */ >> -/* { dg-options "-O" } */ >> +/* { dg-options "-O -Wcast-align=strict" } */ >> >> struct B { int i; }; >> struct C { struct B b; } __attribute__ ((packed)); >> @@ -12,12 +12,12 @@ long * >> foo1 (void) >> { >> return (long *) p; >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ >> } >> >> long * >> foo2 (void) >> { >> return (long *) bar (); >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ >> } >> diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >> index aeffb969c01..28dd05d366c 100644 >> --- a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >> +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >> @@ -1,5 +1,5 @@ >> // { dg-do compile { target { ! default_packed } } } >> -// Test that -Waddress-of-packed-member works with member functions. >> +// { dg-additional-options -Wcast-align=strict } >> >> struct S { >> char c; >> @@ -16,8 +16,8 @@ S** >> f () >> { >> S **s; >> - s = reinterpret_cast<S**>(foo ()); // { dg-warning "converting a packed" } >> - s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "converting a packed" } >> - s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "converting a packed" } >> + s = reinterpret_cast<S**>(foo ()); // { dg-warning "increases required alignment" } >> + s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "increases required alignment" } >> + s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "increases required alignment" } >> return s; >> } >> diff --git a/gcc/testsuite/gcc.dg/pr51628-20.c b/gcc/testsuite/gcc.dg/pr51628-20.c >> deleted file mode 100644 >> index 2249d85098b..00000000000 >> --- a/gcc/testsuite/gcc.dg/pr51628-20.c >> +++ /dev/null >> @@ -1,11 +0,0 @@ >> -/* PR c/51628. */ >> -/* { dg-do compile } */ >> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >> - >> -struct B { int i; }; >> -struct C { struct B b; } __attribute__ ((packed)); >> - >> -extern struct C *p; >> - >> -long* g8 (void) { return p; } >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> diff --git a/gcc/testsuite/gcc.dg/pr51628-21.c b/gcc/testsuite/gcc.dg/pr51628-21.c >> deleted file mode 100644 >> index f1adbe64002..00000000000 >> --- a/gcc/testsuite/gcc.dg/pr51628-21.c >> +++ /dev/null >> @@ -1,11 +0,0 @@ >> -/* PR c/51628. */ >> -/* { dg-do compile } */ >> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >> - >> -struct B { int i; }; >> -struct C { struct B b; } __attribute__ ((packed)); >> - >> -extern struct C p[]; >> - >> -long* g8 (void) { return p; } >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> diff --git a/gcc/testsuite/gcc.dg/pr51628-25.c b/gcc/testsuite/gcc.dg/pr51628-25.c >> deleted file mode 100644 >> index f00d9b1bcac..00000000000 >> --- a/gcc/testsuite/gcc.dg/pr51628-25.c >> +++ /dev/null >> @@ -1,9 +0,0 @@ >> -/* PR c/51628. */ >> -/* { dg-do compile } */ >> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >> - >> -struct B { int i; }; >> -struct C { struct B b; } __attribute__ ((packed)); >> - >> -long* g8 (struct C *p) { return p; } >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> diff --git a/gcc/testsuite/gcc.dg/pr88928.c b/gcc/testsuite/gcc.dg/pr88928.c >> index 0b6c1d70f05..1d176d6d51d 100644 >> --- a/gcc/testsuite/gcc.dg/pr88928.c >> +++ b/gcc/testsuite/gcc.dg/pr88928.c >> @@ -1,6 +1,6 @@ >> -/* { dg-do compile } */ >> -/* { dg-options "-Wno-pedantic -Waddress-of-packed-member" } */ >> +/* { dg-do compile { target { ! default_packed } } } */ >> +/* { dg-options "-Wno-pedantic -Waddress-of-packed-member -Wcast-align=strict" } */ >> struct a { } __attribute__((__packed__)); >> void c (struct a **); >> void d (const struct a *b) { c ((struct a **) b); } >> -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ >> +/* { dg-warning "increases required alignment" "" { target *-*-* } .-1 } */ >> >> base-commit: 65bd6de0de57abc86931a5e0b9a8d453ad530004 >> -- >> 2.39.3 >>
Ping! Kind regards, Torbjörn On 2024-02-07 17:19, Torbjorn SVENSSON wrote: > Hi, > > Is it okay to backport b7e4a4c626eeeb32c291d5bbbaa148c5081b6bfd to > releases/gcc-13? > > Without this backport, I see these failures on arm-none-eabi: > > FAIL: > gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early-O2.c > (test for excess errors) > FAIL: gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early.c > (test for excess errors) > > Kind regards, > Torbjörn > > On 2023-12-11 08:28, Richard Biener wrote: >> On Wed, Nov 22, 2023 at 11:45 PM Jason Merrill <jason@redhat.com> wrote: >>> >>> Tested x86_64-pc-linux-gnu, OK for trunk? >> >> OK >> >>> -- 8< -- >>> >>> -Waddress-of-packed-member, in addition to the documented warning about >>> taking the address of a packed member, also warns about casting from >>> a pointer to a TYPE_PACKED type to a pointer to a type with greater >>> alignment. >>> >>> This wrongly warns if the source is a pointer to enum when -fshort-enums >>> is on, since that is also represented by TYPE_PACKED. >>> >>> And there's already -Wcast-align to catch casting from pointer to less >>> aligned type (packed or otherwise) to pointer to more aligned type; even >>> apart from the enum problem, this seems like a somewhat arbitrary >>> subset of >>> that warning. Though that isn't currently on by default. >>> >>> So, this patch removes the undocumented type-based warning from >>> -Waddress-of-packed-member. Some of the tests where the warning is >>> desirable I changed to use -Wcast-align=strict instead. The ones that >>> require -Wno-incompatible-pointer-types, I just removed. >>> >>> gcc/c-family/ChangeLog: >>> >>> * c-warn.cc (check_address_or_pointer_of_packed_member): >>> Remove warning based on TYPE_PACKED. >>> >>> gcc/testsuite/ChangeLog: >>> >>> * c-c++-common/Waddress-of-packed-member-1.c: Don't expect >>> a warning on the cast cases. >>> * c-c++-common/pr51628-35.c: Use -Wcast-align=strict. >>> * g++.dg/warn/Waddress-of-packed-member3.C: Likewise. >>> * gcc.dg/pr88928.c: Likewise. >>> * gcc.dg/pr51628-20.c: Removed. >>> * gcc.dg/pr51628-21.c: Removed. >>> * gcc.dg/pr51628-25.c: Removed. >>> --- >>> gcc/c-family/c-warn.cc | 58 +------------------ >>> .../Waddress-of-packed-member-1.c | 12 ++-- >>> gcc/testsuite/c-c++-common/pr51628-35.c | 6 +- >>> .../g++.dg/warn/Waddress-of-packed-member3.C | 8 +-- >>> gcc/testsuite/gcc.dg/pr51628-20.c | 11 ---- >>> gcc/testsuite/gcc.dg/pr51628-21.c | 11 ---- >>> gcc/testsuite/gcc.dg/pr51628-25.c | 9 --- >>> gcc/testsuite/gcc.dg/pr88928.c | 6 +- >>> 8 files changed, 19 insertions(+), 102 deletions(-) >>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-20.c >>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-21.c >>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-25.c >>> >>> diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc >>> index d2938b91043..2a399ba6d14 100644 >>> --- a/gcc/c-family/c-warn.cc >>> +++ b/gcc/c-family/c-warn.cc >>> @@ -2991,10 +2991,9 @@ check_alignment_of_packed_member (tree type, >>> tree field, bool rvalue) >>> return NULL_TREE; >>> } >>> >>> -/* Return struct or union type if the right hand value, RHS: >>> - 1. Is a pointer value which isn't aligned to a pointer type TYPE. >>> - 2. Is an address which takes the unaligned address of packed member >>> - of struct or union when assigning to TYPE. >>> +/* Return struct or union type if the right hand value, RHS >>> + is an address which takes the unaligned address of packed member >>> + of struct or union when assigning to TYPE. >>> Otherwise, return NULL_TREE. */ >>> >>> static tree >>> @@ -3021,57 +3020,6 @@ check_address_or_pointer_of_packed_member >>> (tree type, tree rhs) >>> >>> type = TREE_TYPE (type); >>> >>> - if (TREE_CODE (rhs) == PARM_DECL >>> - || VAR_P (rhs) >>> - || TREE_CODE (rhs) == CALL_EXPR) >>> - { >>> - tree rhstype = TREE_TYPE (rhs); >>> - if (TREE_CODE (rhs) == CALL_EXPR) >>> - { >>> - rhs = CALL_EXPR_FN (rhs); /* Pointer expression. */ >>> - if (rhs == NULL_TREE) >>> - return NULL_TREE; >>> - rhs = TREE_TYPE (rhs); /* Pointer type. */ >>> - /* We could be called while processing a template and RHS >>> could be >>> - a functor. In that case it's a class, not a pointer. */ >>> - if (!rhs || !POINTER_TYPE_P (rhs)) >>> - return NULL_TREE; >>> - rhs = TREE_TYPE (rhs); /* Function type. */ >>> - rhstype = TREE_TYPE (rhs); >>> - if (!rhstype || !POINTER_TYPE_P (rhstype)) >>> - return NULL_TREE; >>> - rvalue = true; >>> - } >>> - if (rvalue && POINTER_TYPE_P (rhstype)) >>> - rhstype = TREE_TYPE (rhstype); >>> - while (TREE_CODE (rhstype) == ARRAY_TYPE) >>> - rhstype = TREE_TYPE (rhstype); >>> - if (TYPE_PACKED (rhstype)) >>> - { >>> - unsigned int type_align = min_align_of_type (type); >>> - unsigned int rhs_align = min_align_of_type (rhstype); >>> - if (rhs_align < type_align) >>> - { >>> - auto_diagnostic_group d; >>> - location_t location = EXPR_LOC_OR_LOC (rhs, >>> input_location); >>> - if (warning_at (location, OPT_Waddress_of_packed_member, >>> - "converting a packed %qT pointer >>> (alignment %d) " >>> - "to a %qT pointer (alignment %d) may >>> result in " >>> - "an unaligned pointer value", >>> - rhstype, rhs_align, type, type_align)) >>> - { >>> - tree decl = TYPE_STUB_DECL (rhstype); >>> - if (decl) >>> - inform (DECL_SOURCE_LOCATION (decl), "defined >>> here"); >>> - decl = TYPE_STUB_DECL (type); >>> - if (decl) >>> - inform (DECL_SOURCE_LOCATION (decl), "defined >>> here"); >>> - } >>> - } >>> - } >>> - return NULL_TREE; >>> - } >>> - >>> tree context = NULL_TREE; >>> >>> /* Check alignment of the object. */ >>> diff --git a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>> b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>> index 95a376664da..0f5188df70a 100644 >>> --- a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>> +++ b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>> @@ -52,12 +52,12 @@ void foo (void) >>> f0 = *&__real__ t0.f; /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> f0 = *&__imag__ t0.f; /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> i1 = (&t0.c, (int*) 0); /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> - t2 = (struct t**) t10; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> - t2 = (struct t**) t100; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> - t2 = (struct t**) t1; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> - t2 = (struct t**) bar(); /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> - t2 = (struct t**) baz(); /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> - t2 = (struct t**) bazz(); /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> + t2 = (struct t**) t10; /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> + t2 = (struct t**) t100; /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> + t2 = (struct t**) t1; /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> + t2 = (struct t**) bar(); /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> + t2 = (struct t**) baz(); /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> + t2 = (struct t**) bazz(); /* { dg-bogus "may result in an >>> unaligned pointer value" } */ >>> i1 = &t0.b; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> i1 = &t1->b; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> i1 = &t10[0].b; /* { dg-warning "may result in an >>> unaligned pointer value" "" { target { ! default_packed } } } */ >>> diff --git a/gcc/testsuite/c-c++-common/pr51628-35.c >>> b/gcc/testsuite/c-c++-common/pr51628-35.c >>> index fa37d99beb7..a88c19ea0df 100644 >>> --- a/gcc/testsuite/c-c++-common/pr51628-35.c >>> +++ b/gcc/testsuite/c-c++-common/pr51628-35.c >>> @@ -1,6 +1,6 @@ >>> /* PR c/51628. */ >>> /* { dg-do compile } */ >>> -/* { dg-options "-O" } */ >>> +/* { dg-options "-O -Wcast-align=strict" } */ >>> >>> struct B { int i; }; >>> struct C { struct B b; } __attribute__ ((packed)); >>> @@ -12,12 +12,12 @@ long * >>> foo1 (void) >>> { >>> return (long *) p; >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> +/* { dg-warning "increases required alignment" "" { target { ! >>> default_packed } } .-1 } */ >>> } >>> >>> long * >>> foo2 (void) >>> { >>> return (long *) bar (); >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> +/* { dg-warning "increases required alignment" "" { target { ! >>> default_packed } } .-1 } */ >>> } >>> diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>> b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>> index aeffb969c01..28dd05d366c 100644 >>> --- a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>> +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>> @@ -1,5 +1,5 @@ >>> // { dg-do compile { target { ! default_packed } } } >>> -// Test that -Waddress-of-packed-member works with member functions. >>> +// { dg-additional-options -Wcast-align=strict } >>> >>> struct S { >>> char c; >>> @@ -16,8 +16,8 @@ S** >>> f () >>> { >>> S **s; >>> - s = reinterpret_cast<S**>(foo ()); // { dg-warning "converting a >>> packed" } >>> - s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "converting >>> a packed" } >>> - s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning >>> "converting a packed" } >>> + s = reinterpret_cast<S**>(foo ()); // { dg-warning "increases >>> required alignment" } >>> + s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "increases >>> required alignment" } >>> + s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning >>> "increases required alignment" } >>> return s; >>> } >>> diff --git a/gcc/testsuite/gcc.dg/pr51628-20.c >>> b/gcc/testsuite/gcc.dg/pr51628-20.c >>> deleted file mode 100644 >>> index 2249d85098b..00000000000 >>> --- a/gcc/testsuite/gcc.dg/pr51628-20.c >>> +++ /dev/null >>> @@ -1,11 +0,0 @@ >>> -/* PR c/51628. */ >>> -/* { dg-do compile } */ >>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>> - >>> -struct B { int i; }; >>> -struct C { struct B b; } __attribute__ ((packed)); >>> - >>> -extern struct C *p; >>> - >>> -long* g8 (void) { return p; } >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> diff --git a/gcc/testsuite/gcc.dg/pr51628-21.c >>> b/gcc/testsuite/gcc.dg/pr51628-21.c >>> deleted file mode 100644 >>> index f1adbe64002..00000000000 >>> --- a/gcc/testsuite/gcc.dg/pr51628-21.c >>> +++ /dev/null >>> @@ -1,11 +0,0 @@ >>> -/* PR c/51628. */ >>> -/* { dg-do compile } */ >>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>> - >>> -struct B { int i; }; >>> -struct C { struct B b; } __attribute__ ((packed)); >>> - >>> -extern struct C p[]; >>> - >>> -long* g8 (void) { return p; } >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> diff --git a/gcc/testsuite/gcc.dg/pr51628-25.c >>> b/gcc/testsuite/gcc.dg/pr51628-25.c >>> deleted file mode 100644 >>> index f00d9b1bcac..00000000000 >>> --- a/gcc/testsuite/gcc.dg/pr51628-25.c >>> +++ /dev/null >>> @@ -1,9 +0,0 @@ >>> -/* PR c/51628. */ >>> -/* { dg-do compile } */ >>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>> - >>> -struct B { int i; }; >>> -struct C { struct B b; } __attribute__ ((packed)); >>> - >>> -long* g8 (struct C *p) { return p; } >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> diff --git a/gcc/testsuite/gcc.dg/pr88928.c >>> b/gcc/testsuite/gcc.dg/pr88928.c >>> index 0b6c1d70f05..1d176d6d51d 100644 >>> --- a/gcc/testsuite/gcc.dg/pr88928.c >>> +++ b/gcc/testsuite/gcc.dg/pr88928.c >>> @@ -1,6 +1,6 @@ >>> -/* { dg-do compile } */ >>> -/* { dg-options "-Wno-pedantic -Waddress-of-packed-member" } */ >>> +/* { dg-do compile { target { ! default_packed } } } */ >>> +/* { dg-options "-Wno-pedantic -Waddress-of-packed-member >>> -Wcast-align=strict" } */ >>> struct a { } __attribute__((__packed__)); >>> void c (struct a **); >>> void d (const struct a *b) { c ((struct a **) b); } >>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>> target { ! default_packed } } .-1 } */ >>> +/* { dg-warning "increases required alignment" "" { target *-*-* } >>> .-1 } */ >>> >>> base-commit: 65bd6de0de57abc86931a5e0b9a8d453ad530004 >>> -- >>> 2.39.3 >>>
On 2/22/24 03:51, Torbjorn SVENSSON wrote: > Ping! Hmm, I'm somewhat reluctant to backport a significant behavior change like this just to silence a testsuite failure, even though I think the change is correct. Maybe just xfail the tests for GCC 13? Jason > On 2024-02-07 17:19, Torbjorn SVENSSON wrote: >> Hi, >> >> Is it okay to backport b7e4a4c626eeeb32c291d5bbbaa148c5081b6bfd to >> releases/gcc-13? >> >> Without this backport, I see these failures on arm-none-eabi: >> >> FAIL: >> gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early-O2.c >> (test for excess errors) >> FAIL: gcc.dg/analyzer/null-deref-pr108251-smp_fetch_ssl_fc_has_early.c >> (test for excess errors) >> >> Kind regards, >> Torbjörn >> >> On 2023-12-11 08:28, Richard Biener wrote: >>> On Wed, Nov 22, 2023 at 11:45 PM Jason Merrill <jason@redhat.com> wrote: >>>> >>>> Tested x86_64-pc-linux-gnu, OK for trunk? >>> >>> OK >>> >>>> -- 8< -- >>>> >>>> -Waddress-of-packed-member, in addition to the documented warning about >>>> taking the address of a packed member, also warns about casting from >>>> a pointer to a TYPE_PACKED type to a pointer to a type with greater >>>> alignment. >>>> >>>> This wrongly warns if the source is a pointer to enum when >>>> -fshort-enums >>>> is on, since that is also represented by TYPE_PACKED. >>>> >>>> And there's already -Wcast-align to catch casting from pointer to less >>>> aligned type (packed or otherwise) to pointer to more aligned type; >>>> even >>>> apart from the enum problem, this seems like a somewhat arbitrary >>>> subset of >>>> that warning. Though that isn't currently on by default. >>>> >>>> So, this patch removes the undocumented type-based warning from >>>> -Waddress-of-packed-member. Some of the tests where the warning is >>>> desirable I changed to use -Wcast-align=strict instead. The ones that >>>> require -Wno-incompatible-pointer-types, I just removed. >>>> >>>> gcc/c-family/ChangeLog: >>>> >>>> * c-warn.cc (check_address_or_pointer_of_packed_member): >>>> Remove warning based on TYPE_PACKED. >>>> >>>> gcc/testsuite/ChangeLog: >>>> >>>> * c-c++-common/Waddress-of-packed-member-1.c: Don't expect >>>> a warning on the cast cases. >>>> * c-c++-common/pr51628-35.c: Use -Wcast-align=strict. >>>> * g++.dg/warn/Waddress-of-packed-member3.C: Likewise. >>>> * gcc.dg/pr88928.c: Likewise. >>>> * gcc.dg/pr51628-20.c: Removed. >>>> * gcc.dg/pr51628-21.c: Removed. >>>> * gcc.dg/pr51628-25.c: Removed. >>>> --- >>>> gcc/c-family/c-warn.cc | 58 >>>> +------------------ >>>> .../Waddress-of-packed-member-1.c | 12 ++-- >>>> gcc/testsuite/c-c++-common/pr51628-35.c | 6 +- >>>> .../g++.dg/warn/Waddress-of-packed-member3.C | 8 +-- >>>> gcc/testsuite/gcc.dg/pr51628-20.c | 11 ---- >>>> gcc/testsuite/gcc.dg/pr51628-21.c | 11 ---- >>>> gcc/testsuite/gcc.dg/pr51628-25.c | 9 --- >>>> gcc/testsuite/gcc.dg/pr88928.c | 6 +- >>>> 8 files changed, 19 insertions(+), 102 deletions(-) >>>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-20.c >>>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-21.c >>>> delete mode 100644 gcc/testsuite/gcc.dg/pr51628-25.c >>>> >>>> diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc >>>> index d2938b91043..2a399ba6d14 100644 >>>> --- a/gcc/c-family/c-warn.cc >>>> +++ b/gcc/c-family/c-warn.cc >>>> @@ -2991,10 +2991,9 @@ check_alignment_of_packed_member (tree type, >>>> tree field, bool rvalue) >>>> return NULL_TREE; >>>> } >>>> >>>> -/* Return struct or union type if the right hand value, RHS: >>>> - 1. Is a pointer value which isn't aligned to a pointer type TYPE. >>>> - 2. Is an address which takes the unaligned address of packed member >>>> - of struct or union when assigning to TYPE. >>>> +/* Return struct or union type if the right hand value, RHS >>>> + is an address which takes the unaligned address of packed member >>>> + of struct or union when assigning to TYPE. >>>> Otherwise, return NULL_TREE. */ >>>> >>>> static tree >>>> @@ -3021,57 +3020,6 @@ check_address_or_pointer_of_packed_member >>>> (tree type, tree rhs) >>>> >>>> type = TREE_TYPE (type); >>>> >>>> - if (TREE_CODE (rhs) == PARM_DECL >>>> - || VAR_P (rhs) >>>> - || TREE_CODE (rhs) == CALL_EXPR) >>>> - { >>>> - tree rhstype = TREE_TYPE (rhs); >>>> - if (TREE_CODE (rhs) == CALL_EXPR) >>>> - { >>>> - rhs = CALL_EXPR_FN (rhs); /* Pointer expression. */ >>>> - if (rhs == NULL_TREE) >>>> - return NULL_TREE; >>>> - rhs = TREE_TYPE (rhs); /* Pointer type. */ >>>> - /* We could be called while processing a template and RHS >>>> could be >>>> - a functor. In that case it's a class, not a pointer. */ >>>> - if (!rhs || !POINTER_TYPE_P (rhs)) >>>> - return NULL_TREE; >>>> - rhs = TREE_TYPE (rhs); /* Function type. */ >>>> - rhstype = TREE_TYPE (rhs); >>>> - if (!rhstype || !POINTER_TYPE_P (rhstype)) >>>> - return NULL_TREE; >>>> - rvalue = true; >>>> - } >>>> - if (rvalue && POINTER_TYPE_P (rhstype)) >>>> - rhstype = TREE_TYPE (rhstype); >>>> - while (TREE_CODE (rhstype) == ARRAY_TYPE) >>>> - rhstype = TREE_TYPE (rhstype); >>>> - if (TYPE_PACKED (rhstype)) >>>> - { >>>> - unsigned int type_align = min_align_of_type (type); >>>> - unsigned int rhs_align = min_align_of_type (rhstype); >>>> - if (rhs_align < type_align) >>>> - { >>>> - auto_diagnostic_group d; >>>> - location_t location = EXPR_LOC_OR_LOC (rhs, >>>> input_location); >>>> - if (warning_at (location, OPT_Waddress_of_packed_member, >>>> - "converting a packed %qT pointer >>>> (alignment %d) " >>>> - "to a %qT pointer (alignment %d) may >>>> result in " >>>> - "an unaligned pointer value", >>>> - rhstype, rhs_align, type, type_align)) >>>> - { >>>> - tree decl = TYPE_STUB_DECL (rhstype); >>>> - if (decl) >>>> - inform (DECL_SOURCE_LOCATION (decl), "defined >>>> here"); >>>> - decl = TYPE_STUB_DECL (type); >>>> - if (decl) >>>> - inform (DECL_SOURCE_LOCATION (decl), "defined >>>> here"); >>>> - } >>>> - } >>>> - } >>>> - return NULL_TREE; >>>> - } >>>> - >>>> tree context = NULL_TREE; >>>> >>>> /* Check alignment of the object. */ >>>> diff --git >>>> a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>>> b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>>> index 95a376664da..0f5188df70a 100644 >>>> --- a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>>> +++ b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c >>>> @@ -52,12 +52,12 @@ void foo (void) >>>> f0 = *&__real__ t0.f; /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> f0 = *&__imag__ t0.f; /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> i1 = (&t0.c, (int*) 0); /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> - t2 = (struct t**) t10; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> - t2 = (struct t**) t100; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> - t2 = (struct t**) t1; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> - t2 = (struct t**) bar(); /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> - t2 = (struct t**) baz(); /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> - t2 = (struct t**) bazz(); /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> + t2 = (struct t**) t10; /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> + t2 = (struct t**) t100; /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> + t2 = (struct t**) t1; /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> + t2 = (struct t**) bar(); /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> + t2 = (struct t**) baz(); /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> + t2 = (struct t**) bazz(); /* { dg-bogus "may result in an >>>> unaligned pointer value" } */ >>>> i1 = &t0.b; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> i1 = &t1->b; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> i1 = &t10[0].b; /* { dg-warning "may result in an >>>> unaligned pointer value" "" { target { ! default_packed } } } */ >>>> diff --git a/gcc/testsuite/c-c++-common/pr51628-35.c >>>> b/gcc/testsuite/c-c++-common/pr51628-35.c >>>> index fa37d99beb7..a88c19ea0df 100644 >>>> --- a/gcc/testsuite/c-c++-common/pr51628-35.c >>>> +++ b/gcc/testsuite/c-c++-common/pr51628-35.c >>>> @@ -1,6 +1,6 @@ >>>> /* PR c/51628. */ >>>> /* { dg-do compile } */ >>>> -/* { dg-options "-O" } */ >>>> +/* { dg-options "-O -Wcast-align=strict" } */ >>>> >>>> struct B { int i; }; >>>> struct C { struct B b; } __attribute__ ((packed)); >>>> @@ -12,12 +12,12 @@ long * >>>> foo1 (void) >>>> { >>>> return (long *) p; >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> +/* { dg-warning "increases required alignment" "" { target { ! >>>> default_packed } } .-1 } */ >>>> } >>>> >>>> long * >>>> foo2 (void) >>>> { >>>> return (long *) bar (); >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> +/* { dg-warning "increases required alignment" "" { target { ! >>>> default_packed } } .-1 } */ >>>> } >>>> diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>>> b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>>> index aeffb969c01..28dd05d366c 100644 >>>> --- a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>>> +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C >>>> @@ -1,5 +1,5 @@ >>>> // { dg-do compile { target { ! default_packed } } } >>>> -// Test that -Waddress-of-packed-member works with member functions. >>>> +// { dg-additional-options -Wcast-align=strict } >>>> >>>> struct S { >>>> char c; >>>> @@ -16,8 +16,8 @@ S** >>>> f () >>>> { >>>> S **s; >>>> - s = reinterpret_cast<S**>(foo ()); // { dg-warning "converting a >>>> packed" } >>>> - s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning >>>> "converting a packed" } >>>> - s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning >>>> "converting a packed" } >>>> + s = reinterpret_cast<S**>(foo ()); // { dg-warning "increases >>>> required alignment" } >>>> + s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "increases >>>> required alignment" } >>>> + s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning >>>> "increases required alignment" } >>>> return s; >>>> } >>>> diff --git a/gcc/testsuite/gcc.dg/pr51628-20.c >>>> b/gcc/testsuite/gcc.dg/pr51628-20.c >>>> deleted file mode 100644 >>>> index 2249d85098b..00000000000 >>>> --- a/gcc/testsuite/gcc.dg/pr51628-20.c >>>> +++ /dev/null >>>> @@ -1,11 +0,0 @@ >>>> -/* PR c/51628. */ >>>> -/* { dg-do compile } */ >>>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>>> - >>>> -struct B { int i; }; >>>> -struct C { struct B b; } __attribute__ ((packed)); >>>> - >>>> -extern struct C *p; >>>> - >>>> -long* g8 (void) { return p; } >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> diff --git a/gcc/testsuite/gcc.dg/pr51628-21.c >>>> b/gcc/testsuite/gcc.dg/pr51628-21.c >>>> deleted file mode 100644 >>>> index f1adbe64002..00000000000 >>>> --- a/gcc/testsuite/gcc.dg/pr51628-21.c >>>> +++ /dev/null >>>> @@ -1,11 +0,0 @@ >>>> -/* PR c/51628. */ >>>> -/* { dg-do compile } */ >>>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>>> - >>>> -struct B { int i; }; >>>> -struct C { struct B b; } __attribute__ ((packed)); >>>> - >>>> -extern struct C p[]; >>>> - >>>> -long* g8 (void) { return p; } >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> diff --git a/gcc/testsuite/gcc.dg/pr51628-25.c >>>> b/gcc/testsuite/gcc.dg/pr51628-25.c >>>> deleted file mode 100644 >>>> index f00d9b1bcac..00000000000 >>>> --- a/gcc/testsuite/gcc.dg/pr51628-25.c >>>> +++ /dev/null >>>> @@ -1,9 +0,0 @@ >>>> -/* PR c/51628. */ >>>> -/* { dg-do compile } */ >>>> -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ >>>> - >>>> -struct B { int i; }; >>>> -struct C { struct B b; } __attribute__ ((packed)); >>>> - >>>> -long* g8 (struct C *p) { return p; } >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> diff --git a/gcc/testsuite/gcc.dg/pr88928.c >>>> b/gcc/testsuite/gcc.dg/pr88928.c >>>> index 0b6c1d70f05..1d176d6d51d 100644 >>>> --- a/gcc/testsuite/gcc.dg/pr88928.c >>>> +++ b/gcc/testsuite/gcc.dg/pr88928.c >>>> @@ -1,6 +1,6 @@ >>>> -/* { dg-do compile } */ >>>> -/* { dg-options "-Wno-pedantic -Waddress-of-packed-member" } */ >>>> +/* { dg-do compile { target { ! default_packed } } } */ >>>> +/* { dg-options "-Wno-pedantic -Waddress-of-packed-member >>>> -Wcast-align=strict" } */ >>>> struct a { } __attribute__((__packed__)); >>>> void c (struct a **); >>>> void d (const struct a *b) { c ((struct a **) b); } >>>> -/* { dg-warning "may result in an unaligned pointer value" "" { >>>> target { ! default_packed } } .-1 } */ >>>> +/* { dg-warning "increases required alignment" "" { target *-*-* } >>>> .-1 } */ >>>> >>>> base-commit: 65bd6de0de57abc86931a5e0b9a8d453ad530004 >>>> -- >>>> 2.39.3 >>>>
diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc index d2938b91043..2a399ba6d14 100644 --- a/gcc/c-family/c-warn.cc +++ b/gcc/c-family/c-warn.cc @@ -2991,10 +2991,9 @@ check_alignment_of_packed_member (tree type, tree field, bool rvalue) return NULL_TREE; } -/* Return struct or union type if the right hand value, RHS: - 1. Is a pointer value which isn't aligned to a pointer type TYPE. - 2. Is an address which takes the unaligned address of packed member - of struct or union when assigning to TYPE. +/* Return struct or union type if the right hand value, RHS + is an address which takes the unaligned address of packed member + of struct or union when assigning to TYPE. Otherwise, return NULL_TREE. */ static tree @@ -3021,57 +3020,6 @@ check_address_or_pointer_of_packed_member (tree type, tree rhs) type = TREE_TYPE (type); - if (TREE_CODE (rhs) == PARM_DECL - || VAR_P (rhs) - || TREE_CODE (rhs) == CALL_EXPR) - { - tree rhstype = TREE_TYPE (rhs); - if (TREE_CODE (rhs) == CALL_EXPR) - { - rhs = CALL_EXPR_FN (rhs); /* Pointer expression. */ - if (rhs == NULL_TREE) - return NULL_TREE; - rhs = TREE_TYPE (rhs); /* Pointer type. */ - /* We could be called while processing a template and RHS could be - a functor. In that case it's a class, not a pointer. */ - if (!rhs || !POINTER_TYPE_P (rhs)) - return NULL_TREE; - rhs = TREE_TYPE (rhs); /* Function type. */ - rhstype = TREE_TYPE (rhs); - if (!rhstype || !POINTER_TYPE_P (rhstype)) - return NULL_TREE; - rvalue = true; - } - if (rvalue && POINTER_TYPE_P (rhstype)) - rhstype = TREE_TYPE (rhstype); - while (TREE_CODE (rhstype) == ARRAY_TYPE) - rhstype = TREE_TYPE (rhstype); - if (TYPE_PACKED (rhstype)) - { - unsigned int type_align = min_align_of_type (type); - unsigned int rhs_align = min_align_of_type (rhstype); - if (rhs_align < type_align) - { - auto_diagnostic_group d; - location_t location = EXPR_LOC_OR_LOC (rhs, input_location); - if (warning_at (location, OPT_Waddress_of_packed_member, - "converting a packed %qT pointer (alignment %d) " - "to a %qT pointer (alignment %d) may result in " - "an unaligned pointer value", - rhstype, rhs_align, type, type_align)) - { - tree decl = TYPE_STUB_DECL (rhstype); - if (decl) - inform (DECL_SOURCE_LOCATION (decl), "defined here"); - decl = TYPE_STUB_DECL (type); - if (decl) - inform (DECL_SOURCE_LOCATION (decl), "defined here"); - } - } - } - return NULL_TREE; - } - tree context = NULL_TREE; /* Check alignment of the object. */ diff --git a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c index 95a376664da..0f5188df70a 100644 --- a/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c +++ b/gcc/testsuite/c-c++-common/Waddress-of-packed-member-1.c @@ -52,12 +52,12 @@ void foo (void) f0 = *&__real__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ f0 = *&__imag__ t0.f; /* { dg-bogus "may result in an unaligned pointer value" } */ i1 = (&t0.c, (int*) 0); /* { dg-bogus "may result in an unaligned pointer value" } */ - t2 = (struct t**) t10; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ - t2 = (struct t**) t100; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ - t2 = (struct t**) t1; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ - t2 = (struct t**) bar(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ - t2 = (struct t**) baz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ - t2 = (struct t**) bazz(); /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ + t2 = (struct t**) t10; /* { dg-bogus "may result in an unaligned pointer value" } */ + t2 = (struct t**) t100; /* { dg-bogus "may result in an unaligned pointer value" } */ + t2 = (struct t**) t1; /* { dg-bogus "may result in an unaligned pointer value" } */ + t2 = (struct t**) bar(); /* { dg-bogus "may result in an unaligned pointer value" } */ + t2 = (struct t**) baz(); /* { dg-bogus "may result in an unaligned pointer value" } */ + t2 = (struct t**) bazz(); /* { dg-bogus "may result in an unaligned pointer value" } */ i1 = &t0.b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ i1 = &t1->b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ i1 = &t10[0].b; /* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } } */ diff --git a/gcc/testsuite/c-c++-common/pr51628-35.c b/gcc/testsuite/c-c++-common/pr51628-35.c index fa37d99beb7..a88c19ea0df 100644 --- a/gcc/testsuite/c-c++-common/pr51628-35.c +++ b/gcc/testsuite/c-c++-common/pr51628-35.c @@ -1,6 +1,6 @@ /* PR c/51628. */ /* { dg-do compile } */ -/* { dg-options "-O" } */ +/* { dg-options "-O -Wcast-align=strict" } */ struct B { int i; }; struct C { struct B b; } __attribute__ ((packed)); @@ -12,12 +12,12 @@ long * foo1 (void) { return (long *) p; -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ } long * foo2 (void) { return (long *) bar (); -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ +/* { dg-warning "increases required alignment" "" { target { ! default_packed } } .-1 } */ } diff --git a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C index aeffb969c01..28dd05d366c 100644 --- a/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C +++ b/gcc/testsuite/g++.dg/warn/Waddress-of-packed-member3.C @@ -1,5 +1,5 @@ // { dg-do compile { target { ! default_packed } } } -// Test that -Waddress-of-packed-member works with member functions. +// { dg-additional-options -Wcast-align=strict } struct S { char c; @@ -16,8 +16,8 @@ S** f () { S **s; - s = reinterpret_cast<S**>(foo ()); // { dg-warning "converting a packed" } - s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "converting a packed" } - s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "converting a packed" } + s = reinterpret_cast<S**>(foo ()); // { dg-warning "increases required alignment" } + s = reinterpret_cast<S**>(x.memfn ()); // { dg-warning "increases required alignment" } + s = reinterpret_cast<S**>(X::smemfn ()); // { dg-warning "increases required alignment" } return s; } diff --git a/gcc/testsuite/gcc.dg/pr51628-20.c b/gcc/testsuite/gcc.dg/pr51628-20.c deleted file mode 100644 index 2249d85098b..00000000000 --- a/gcc/testsuite/gcc.dg/pr51628-20.c +++ /dev/null @@ -1,11 +0,0 @@ -/* PR c/51628. */ -/* { dg-do compile } */ -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ - -struct B { int i; }; -struct C { struct B b; } __attribute__ ((packed)); - -extern struct C *p; - -long* g8 (void) { return p; } -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/pr51628-21.c b/gcc/testsuite/gcc.dg/pr51628-21.c deleted file mode 100644 index f1adbe64002..00000000000 --- a/gcc/testsuite/gcc.dg/pr51628-21.c +++ /dev/null @@ -1,11 +0,0 @@ -/* PR c/51628. */ -/* { dg-do compile } */ -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ - -struct B { int i; }; -struct C { struct B b; } __attribute__ ((packed)); - -extern struct C p[]; - -long* g8 (void) { return p; } -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/pr51628-25.c b/gcc/testsuite/gcc.dg/pr51628-25.c deleted file mode 100644 index f00d9b1bcac..00000000000 --- a/gcc/testsuite/gcc.dg/pr51628-25.c +++ /dev/null @@ -1,9 +0,0 @@ -/* PR c/51628. */ -/* { dg-do compile } */ -/* { dg-options "-O -Wno-incompatible-pointer-types" } */ - -struct B { int i; }; -struct C { struct B b; } __attribute__ ((packed)); - -long* g8 (struct C *p) { return p; } -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ diff --git a/gcc/testsuite/gcc.dg/pr88928.c b/gcc/testsuite/gcc.dg/pr88928.c index 0b6c1d70f05..1d176d6d51d 100644 --- a/gcc/testsuite/gcc.dg/pr88928.c +++ b/gcc/testsuite/gcc.dg/pr88928.c @@ -1,6 +1,6 @@ -/* { dg-do compile } */ -/* { dg-options "-Wno-pedantic -Waddress-of-packed-member" } */ +/* { dg-do compile { target { ! default_packed } } } */ +/* { dg-options "-Wno-pedantic -Waddress-of-packed-member -Wcast-align=strict" } */ struct a { } __attribute__((__packed__)); void c (struct a **); void d (const struct a *b) { c ((struct a **) b); } -/* { dg-warning "may result in an unaligned pointer value" "" { target { ! default_packed } } .-1 } */ +/* { dg-warning "increases required alignment" "" { target *-*-* } .-1 } */