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