mirror of git://gcc.gnu.org/git/gcc.git
97 lines
2.9 KiB
C
97 lines
2.9 KiB
C
/* 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." } */
|