67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
// { 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);
|