PR middle-end/84108 - incorrect -Wattributes warning for packed/aligned conflict...
authorMartin Sebor <msebor@redhat.com>
Wed, 14 Feb 2018 22:02:43 +0000 (22:02 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 14 Feb 2018 22:02:43 +0000 (15:02 -0700)
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

gcc/ChangeLog
gcc/attribs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wattributes-8.c [new file with mode: 0644]

index 97067a3ffe2c798b14f4afaef072a61a6a495fef..e16acd45413e62ca271d9bdfd27b752f734c55c7 100644 (file)
@@ -1,3 +1,9 @@
+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
index 2cac9c403b4f74b9e4da172660c6b70385ad5841..140863be1d955e3b8f4d3fa5f9f90ba804ae700c 100644 (file)
@@ -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?  */
index e3d1cec40f162aa8f282381d14000a0decf6ae85..2044efc69978fcc77c4c292ef5da611b1e5b8f13 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/Wattributes-8.c b/gcc/testsuite/gcc.dg/Wattributes-8.c
new file mode 100644 (file)
index 0000000..a4b4c00
--- /dev/null
@@ -0,0 +1,38 @@
+/* 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); */