From 34facf20abc583e66764733263f8412929f9eaf9 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 5 Apr 2019 15:15:37 +0000 Subject: [PATCH] Guard notes for -Waddress-of-packed-member on warning emission (PR c/89985) 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 | 7 +++++++ gcc/c-family/c-warn.c | 25 ++++++++++++++----------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/pr89985.c | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr89985.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 5cce5de1d28..f94140359aa 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2019-04-05 David Malcolm + + 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 PR c++/89973 - -Waddress-of-packed-member ICE with invalid conversion. diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index 05ea2bf8719..f6acc67af36 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c188628b323..83fccaa6eab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-05 David Malcolm + + PR c/89985 + * c-c++-common/pr89985.c: New test. + 2019-04-05 Christophe Lyon 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 index 00000000000..82a72858255 --- /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; +} -- 2.30.2