This patch fixes stray notes emitted by -Waddress-of-packed-member when disabled via -w.
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Committed to trunk as r270169. gcc/c-family/ChangeLog: PR c/89985 * c-warn.c (check_address_or_pointer_of_packed_member): Add auto_diagnostic_group. Guard inform calls by result of warning_at call. gcc/testsuite/ChangeLog: PR c/89985 * c-c++-common/pr89985.c: New test. --- gcc/c-family/c-warn.c | 25 ++++++++++++++----------- gcc/testsuite/c-c++-common/pr89985.c | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr89985.c diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index e2f3449..e0a09e6 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -2772,18 +2772,21 @@ check_address_or_pointer_of_packed_member (tree type, tree rhs) 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); - 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"); + 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; diff --git a/gcc/testsuite/c-c++-common/pr89985.c b/gcc/testsuite/c-c++-common/pr89985.c new file mode 100644 index 0000000..82a7285 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr89985.c @@ -0,0 +1,19 @@ +/* Ensure that -Waddress-of-packed-member doesn't emit notes when + suppressed via -w, rather than -Wno-address-of-packed-member. */ + +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +struct a { /* { dg-bogus "defined here" } */ + void *ptr; +} __attribute__((packed)); + +struct b { /* { dg-bogus "defined here" } */ + void *ptr; +}; + +void +test (struct a *p) +{ + struct b *q = (struct b *)p; +} -- 1.8.5.3