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

Reply via email to