From dea78431676f0104f5467788e8e78fc05c3ab981 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 18 Jul 2019 00:38:45 +0000 Subject: [PATCH] -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 --- gcc/ChangeLog | 6 ++ gcc/attribs.c | 14 +++-- gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/g++.dg/Wmissing-attributes-1.C | 66 ++++++++++++++++++++ 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/Wmissing-attributes-1.C 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 + + PR middle-end/81824 + * attribs.c (decls_mismatched_attributes): Simplify the logic + that avoids duplicates and false positives. + 2019-07-17 John David Anglin * 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 + + PR middle-end/81824 + * g++.dg/Wmissing-attributes-1.C: New. Some of its fragments + are from Martin Sebor. + 2019-07-17 Marek Polacek 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 +f_type +ATTR ((malloc)) +missing_malloc; // { dg-message "missing primary template attribute .malloc." } + +template <> +f_type +missing_malloc; // { 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 +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(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 +f_type +ATTR ((alloc_size (1))) // In both attr lists, decl's and type's. +missing_nothing; + +template <> +f_type +missing_nothing; + + +/* For completeness, check that a type attribute is matched by a decl + attribute in the specialization. */ + +template +f_type +missing_nothing2; + +template <> +void * +ATTR ((alloc_size (1))) +missing_nothing2(int); -- 2.30.2