| /* 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; } |