| /* PR middle-end/81824 - Warn for missing attributes with function aliases |
| { dg-do compile } |
| { dg-require-alias "" } |
| { dg-options "-Wall" } */ |
| |
| #define ATTR(list) __attribute__ (list) |
| |
| |
| int alias_no_const (void); |
| |
| ATTR ((const)) int |
| target_const (void) /* { dg-message ".alias_no_const. target declared here" } */ |
| { return 0; } |
| |
| ATTR ((alias ("target_const"))) int |
| alias_no_const (void); /* { dg-warning ".alias_no_const. specifies less restrictive attribute than its target .target_const.: .const." } */ |
| |
| |
| ATTR ((alloc_size (1), malloc)) void* |
| target_malloc (int n) /* { dg-message ".alias_no_malloc. target declared here" } */ |
| { return __builtin_malloc (n); } |
| |
| ATTR ((alias ("target_malloc"))) void* |
| alias_no_malloc (int); /* { dg-warning ".alias_no_malloc. specifies less restrictive attributes than its target .target_malloc.: .alloc_size., .malloc." } */ |
| |
| |
| ATTR ((leaf)) int |
| target_leaf (void) /* { dg-message ".alias_no_leaf. target declared here" } */ |
| { return 0; } |
| |
| ATTR ((alias ("target_leaf"))) int |
| alias_no_leaf (void); /* { dg-warning ".alias_no_leaf. specifies less restrictive attribute than its target .target_leaf.: .leaf." } */ |
| |
| |
| /* Verify that attributes noclone, noinline, and noipa on the target |
| don't cause a warning for aliases without the attribute. */ |
| |
| ATTR ((noclone)) int |
| target_noclone (void) |
| { return 0; } |
| |
| ATTR ((alias ("target_noclone"))) int |
| alias_no_noclone (void); |
| |
| |
| ATTR ((noipa)) int |
| target_noipa (void) |
| { return 0; } |
| |
| ATTR ((alias ("target_noipa"))) int |
| alias_no_noipa (void); |
| |
| |
| ATTR ((noinline)) int |
| target_noinline (void) |
| { return 0; } |
| |
| ATTR ((alias ("target_noinline"))) int |
| alias_no_noinline (void); |
| |
| |
| ATTR ((nothrow)) int |
| target_nothrow (void) /* { dg-message ".alias_no_nothrow. target declared here" } */ |
| { return 0; } |
| |
| ATTR ((alias ("target_nothrow"))) int |
| alias_no_nothrow (void); /* { dg-warning ".alias_no_nothrow. specifies less restrictive attribute than its target .target_nothrow.: .nothrow." } */ |
| |
| |
| /* Verify that attribute weak on the target doesn't cause and isn't |
| mentioned in a warning for aliases without the attribute. */ |
| |
| ATTR ((weak)) int |
| target_weak (void) |
| { return 0; } |
| |
| ATTR ((alias ("target_weak"))) int |
| alias_no_weak (void); |
| |
| |
| ATTR ((nothrow, weak)) int |
| target_nothrow_weak (void) /* { dg-message ".alias_nothrow_no_weak. target declared here" } */ |
| { return 0; } |
| |
| ATTR ((alias ("target_nothrow_weak"))) int |
| alias_nothrow_no_weak (void); /* { dg-warning ".alias_nothrow_no_weak. specifies less restrictive attribute than its target .target_nothrow_weak.: .nothrow." } */ |
| |
| |
| /* Verify that __typeof__ doesn't include attributes. */ |
| |
| ATTR ((cold)) int |
| target_cold (void) |
| { return 0; } |
| |
| __typeof__ (target_cold) ATTR ((alias ("target_cold"))) |
| alias_cold; /* { dg-warning ".alias_cold. specifies less restrictive attribute than its target .target_cold.: .cold." } */ |