-Wmissing-attributes: avoid duplicates and false positives
Alexandre Oliva
oliva@adacore.com
Thu Jul 18 03:32:00 GMT 2019
On Jul 17, 2019, Martin Sebor <msebor@gmail.com> wrote:
> Sure, if it's worthwhile to you I think it's an improvement even
> if it doesn't fix a bug. (In full disclosure I'm not empowered
> to formally approve bigger patches but I think cleanups like this
> can safely be committed as obvious.)
Thanks, I'm installing the patch below.
>> Does it make sense to put the testcase in anyway?
> If it isn't already covered by one of the existing tests I'd say
> definitely. I also tried the following while playing with it so
> if this variation isn't being exercised either it might be worth
> adding to the new test as well:
Thanks, I added it to the new test
-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.
---
gcc/attribs.c | 14 ++++--
gcc/testsuite/g++.dg/Wmissing-attributes-1.C | 66 ++++++++++++++++++++++++++
2 files changed, 76 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/Wmissing-attributes-1.C
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 8e54016559723..f4777c6a82336 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/g++.dg/Wmissing-attributes-1.C b/gcc/testsuite/g++.dg/Wmissing-attributes-1.C
new file mode 100644
index 0000000000000..972e68305bb90
--- /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);
--
Alexandre Oliva, freedom fighter he/him https://FSFLA.org/blogs/lxo
Be the change, be Free! FSF Latin America board member
GNU Toolchain Engineer Free Software Evangelist
Hay que enGNUrecerse, pero sin perder la terGNUra jamás - Che GNUevara
More information about the Gcc-patches
mailing list