-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
This commit is contained in:
Alexandre Oliva 2019-07-18 00:38:45 +00:00 committed by Alexandre Oliva
parent 8ea3c020a2
commit dea7843167
4 changed files with 88 additions and 4 deletions

View 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

View 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;
}
}

View 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

View File

@ -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);