]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
-Wmissing-attributes: check that we avoid duplicates and false positives
authorAlexandre Oliva <oliva@adacore.com>
Thu, 18 Jul 2019 00:38:45 +0000 (00:38 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 18 Jul 2019 00:38:45 +0000 (00:38 +0000)
The initial patch for PR 81824 fixed various possibilities of
-Wmissing-attributes reporting duplicates and false positives.  The
test that avoided them was a little obscure, though, so this patch
rewrites it into a more self-evident form.

The patch also adds a testcase that already passed, but that
explicitly covers some of the possibilities of reporting duplicates
and false positives that preexisting tests did not cover.

for  gcc/ChangeLog

PR middle-end/81824
* attribs.c (decls_mismatched_attributes): Simplify the logic
that avoids duplicates and false positives.

for  gcc/testsuite/ChangeLog

PR middle-end/81824
* g++.dg/Wmissing-attributes-1.C: New.  Some of its fragments
are from Martin Sebor.

From-SVN: r273563

gcc/ChangeLog
gcc/attribs.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/Wmissing-attributes-1.C [new file with mode: 0644]

index 7f55623f8782ec67236dd6c213eec92f08f00b7f..e2da4ba370ae06aa8fbadbaede851c66c56c9a29 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-17  Alexandre Oliva <oliva@adacore.com>
+
+       PR middle-end/81824
+       * attribs.c (decls_mismatched_attributes): Simplify the logic
+       that avoids duplicates and false positives.
+
 2019-07-17  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (pa_som_asm_init_sections): Don't force all constant
index 8e54016559723fbe79e7bd4edf3cd90720264d50..f4777c6a823364fc37b6f2cdc922f1b6e3e8334b 100644 (file)
@@ -1931,15 +1931,19 @@ decls_mismatched_attributes (tree tmpl, tree decl, tree attrlist,
          if (!has_attribute (tmpls[j], tmpl_attrs[j], blacklist[i]))
            continue;
 
+         bool found = false;
          unsigned kmax = 1 + !!decl_attrs[1];
          for (unsigned k = 0; k != kmax; ++k)
            {
              if (has_attribute (decls[k], decl_attrs[k], blacklist[i]))
-               break;
-
-             if (!k && kmax > 1)
-               continue;
+               {
+                 found = true;
+                 break;
+               }
+           }
 
+         if (!found)
+           {
              if (nattrs)
                pp_string (attrstr, ", ");
              pp_begin_quote (attrstr, pp_show_color (global_dc->printer));
@@ -1947,6 +1951,8 @@ decls_mismatched_attributes (tree tmpl, tree decl, tree attrlist,
              pp_end_quote (attrstr, pp_show_color (global_dc->printer));
              ++nattrs;
            }
+
+         break;
        }
     }
 
index 61baf9c86484c8fa491dee939fe637cfa6d91ae6..69e82b59a9e1cbc061f6089f7c8bcf626c06b46e 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-17  Alexandre Oliva <oliva@adacore.com>
+
+       PR middle-end/81824
+       * g++.dg/Wmissing-attributes-1.C: New.  Some of its fragments
+       are from Martin Sebor.
+
 2019-07-17  Marek Polacek  <polacek@redhat.com>
 
        PR c++/90455
diff --git a/gcc/testsuite/g++.dg/Wmissing-attributes-1.C b/gcc/testsuite/g++.dg/Wmissing-attributes-1.C
new file mode 100644 (file)
index 0000000..972e683
--- /dev/null
@@ -0,0 +1,66 @@
+// { dg-do compile }
+// { dg-options "-Wmissing-attributes" }
+
+#define ATTR(list)   __attribute__ (list)
+
+/* Type attributes are normally absent in template functions, and the
+   mere presence of any such attribute used to cause the
+   -Wmissing-attributes checks, that checked for attributes typically
+   associated with functions rather than types, to report any missing
+   attributes twice: once for the specialization attribute list, once
+   for its type attribute list.
+
+   This test uses both decl and type attributes to exercise the code
+   that avoids reporting duplicates, in ways that failed in the past
+   but that were not covered in other tests.  */
+typedef void* ATTR ((alloc_size (1))) f_type (int);
+
+template <class T>
+f_type
+ATTR ((malloc))
+missing_malloc;            // { dg-message "missing primary template attribute .malloc." }
+
+template <>
+f_type
+missing_malloc<char>;      // { dg-warning "explicit specialization .\[^\n\r\]+. may be missing attributes" }
+
+
+/* Check that even an attribute that appears in both lists (decl and
+   type) in a template declaration is reported as missing only
+   once.  */
+
+template <class T>
+f_type
+ATTR ((alloc_size (1))) // In both attr lists, decl's and type's.
+missing_alloc_size;            // { dg-message "missing primary template attribute .alloc_size." }
+
+template <>
+void *
+missing_alloc_size<char>(int); // { dg-warning "explicit specialization .\[^\n\r\]+. may be missing attributes" }
+
+
+/* Check that even an attribute that appears in both lists (decl and
+   type) is not reported as missing if it's present only in the type
+   list.  */
+
+template <class T>
+f_type
+ATTR ((alloc_size (1))) // In both attr lists, decl's and type's.
+missing_nothing;
+
+template <>
+f_type
+missing_nothing<char>;
+
+
+/* For completeness, check that a type attribute is matched by a decl
+   attribute in the specialization.  */
+
+template <class T>
+f_type
+missing_nothing2;
+
+template <>
+void *
+ATTR ((alloc_size (1)))
+missing_nothing2<char>(int);