Guard notes for -Waddress-of-packed-member on warning emission (PR c/89985)
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 5 Apr 2019 15:15:37 +0000 (15:15 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Fri, 5 Apr 2019 15:15:37 +0000 (15:15 +0000)
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.

From-SVN: r270169

gcc/c-family/ChangeLog
gcc/c-family/c-warn.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr89985.c [new file with mode: 0644]

index 5cce5de1d2818270662b5e1f2c52059d65107d02..f94140359aac7e8e7601c0970f97968ba41dd7c5 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-05  David Malcolm  <dmalcolm@redhat.com>
+
+       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.
+
 2019-04-05  Marek Polacek  <polacek@redhat.com>
 
        PR c++/89973 - -Waddress-of-packed-member ICE with invalid conversion. 
index 05ea2bf87199f8f0308fee8ce3af381874728ec1..f6acc67af366683544b10be497c7858489ac9c81 100644 (file)
@@ -2783,18 +2783,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;
index c188628b32312705b1da266bddc25fdd4900febd..83fccaa6eabc416e7511dec45ff2dc092429fafa 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-05  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c/89985
+       * c-c++-common/pr89985.c: New test.
+
 2019-04-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
        PR c/71598
diff --git a/gcc/testsuite/c-c++-common/pr89985.c b/gcc/testsuite/c-c++-common/pr89985.c
new file mode 100644 (file)
index 0000000..82a7285
--- /dev/null
@@ -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;
+}