Commit fba303ed by Martin Sebor Committed by Martin Sebor

PR middle-end/84108 - incorrect -Wattributes warning for packed/aligned conflict on struct members

gcc/ChangeLog:

	PR c/84108
	* attribs.c (diag_attr_exclusions): Consider the exclusion(s)
	that correspond to the kind of a declaration.

gcc/testsuite/ChangeLog:

	PR c/84108
	* gcc.dg/Wattributes-8.c: New test.

From-SVN: r257674
parent ee3bb1b7
2018-02-14 Martin Sebor <msebor@redhat.com>
PR c/84108
* attribs.c (diag_attr_exclusions): Consider the exclusion(s)
that correspond to the kind of a declaration.
2018-02-14 John David Anglin <danglin@gcc.gnu.org>
PR target/83984
......
......@@ -410,6 +410,22 @@ diag_attr_exclusions (tree last_decl, tree node, tree attrname,
if (!lookup_attribute (excl->name, attrs[i]))
continue;
/* An exclusion may apply either to a function declaration,
type declaration, or a field/variable declaration, or
any subset of the three. */
if (TREE_CODE (node) == FUNCTION_DECL
&& !excl->function)
continue;
if (TREE_CODE (node) == TYPE_DECL
&& !excl->type)
continue;
if ((TREE_CODE (node) == FIELD_DECL
|| TREE_CODE (node) == VAR_DECL)
&& !excl->variable)
continue;
found = true;
/* Print a note? */
......
2018-02-14 Martin Sebor <msebor@redhat.com>
PR c/84108
* gcc.dg/Wattributes-8.c: New test.
2018-02-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/84385
......
/* PR middle-end/84108 - incorrect -Wattributes warning for packed/aligned
conflict on struct members
{ dg-do compile }
{ dg-options "-Wall -Wattributes" } */
#define ATTR(list) __attribute__ (list)
#define ASSERT(e) _Static_assert (e, #e)
/* GCC is inconsistent in how it treats attribute aligned between
variable and member declarations. Attribute aligned alone is
sufficient to reduce a variable's alignment requirement but
the attribute must be paired with packed to have the same
effect on a member. Worse, declaring a variable both aligned
and packed emits a warning. */
/* Avoid exercising this since emitting a warning for these given
the requirement for members seems like a misfeature:
int a ATTR ((packed, aligned (2))); // -Wattributes
int b ATTR ((aligned (2), packed)); // -Wattributes
ASSERT (_Alignof (a) == 2);
ASSERT (_Alignof (b) == 2); */
int c ATTR ((aligned (2))); // okay (reduces alignment)
ASSERT (_Alignof (c) == 2);
struct {
int a ATTR ((packed, aligned (2))); /* { dg-bogus "\\\[-Wattributes" } */
int b ATTR ((aligned (2), packed)); /* { dg-bogus "\\\[-Wattributes" } */
/* Avoid exercising this since the attribute has no effect yet
there is no warning.
int c ATTR ((aligned (2))); // missing warning? */
} s;
ASSERT (_Alignof (s.a) == 2);
ASSERT (_Alignof (s.b) == 2);
/* ASSERT (_Alignof (s.c) == 4); */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment