// { 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);