blob: 88e5e5ed21595da1b0eef78051c53549f10225c6 [file] [log] [blame]
/* PR middle-end/81824 - Warn for missing attributes with function aliases
Exercise attribute copy for variables.
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
#define ATTR(list) __attribute__ (list)
/* Verify that referencing a symbol with no attributes is accepted
with no diagnostics. */
int ref0;
ATTR ((copy (ref0))) long
var0;
/* Verify that referencing a symbol using the address-of and dereferencing
operators is also accepted with no diagnostics. */
ATTR ((copy (&ref0))) void* ptr0;
ATTR ((copy (*&ref0))) int arr[1];
/* Verify that referencing a symbol of a different kind than that
of the one the attribute is applied to is diagnosed. */
int ref1; /* { dg-message "previous declaration here" } */
ATTR ((copy (ref1))) int
ref1; /* { dg-warning ".copy. attribute ignored on a redeclaration of the referenced symbol " } */
/* Verify that circular references of the copy variable attribute
are handled gracefully (i.e., not by getting into an infinite
recursion) by issuing a diagnostic. */
char xref1;
ATTR ((copy (xref1))) char
xref1; /* { dg-warning ".copy. attribute ignored on a redeclaration of the referenced symbol" } */
ATTR ((copy (xref1))) char
xref1; /* { dg-warning ".copy. attribute ignored on a redeclaration of the referenced symbol" } */
ATTR ((copy (xref1), copy (xref1))) char
xref1; /* { dg-warning ".copy. attribute ignored on a redeclaration of the referenced symbol" } */
/* Use attribute unused to verify that circular references propagate
atttibutes as expected (expect no warnings the circular reference
or for any of the unused symbols). Also use the address-of operator
to make sure it doesn't change anything. */
static ATTR ((unused)) int xref2;
static ATTR ((copy (xref2))) int xref3;
static ATTR ((copy (&xref3))) int xref4;
static ATTR ((copy (xref4))) int xref5;
static ATTR ((copy (&xref5))) int xref6;
static ATTR ((copy (xref6))) int xref7;
static ATTR ((copy (&xref7))) int xref8;
static ATTR ((copy (xref8))) int xref9;
static ATTR ((copy (&xref9))) int xref2;
/* Verify that attribute exclusions apply. */
ATTR ((common)) int common_var;
ATTR ((nocommon)) double nocommon_var;
ATTR ((copy (common_var), copy (nocommon_var))) long
common_copy; /* { dg-warning "ignoring attribute .nocommon. because it conflicts with attribute .common." } */
/* Verify that attribute deprecated isn't copied. */
ATTR ((deprecated)) char deprecated_var;
ATTR ((copy (deprecated_var))) int current_var; /* { dg-warning "\\\[-Wdeprecated-declarations]" } */
ATTR ((copy (current_var))) int current_var_2;
int return_current_vars (void) { return current_var + current_var_2; }