summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2019-07-18 00:38:45 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2019-07-18 00:38:45 +0000
commitdea78431676f0104f5467788e8e78fc05c3ab981 (patch)
treeb343f18a6534f518028fdf53783d6d934389ab2d
parent8ea3c020a234e25d4a976e69902208f744c0819c (diff)
-Wmissing-attributes: check that we avoid duplicates and false positives
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/attribs.c14
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/Wmissing-attributes-1.C66
4 files changed, 88 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7f55623f878..e2da4ba370a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 8e540165597..f4777c6a823 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -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;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 61baf9c8648..69e82b59a9e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..972e68305bb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/Wmissing-attributes-1.C
@@ -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);