blob: 12774e8283484dc58436e650d1b35d5459c3ec52 [file] [log] [blame]
/* PR middle-end/81824 - Warn for missing attributes with function aliases
{ dg-do compile }
{ dg-require-ifunc "" }
{ dg-options "-Wall -Wattribute-alias=2" } */
#define ATTR(...) __attribute__ ((__VA_ARGS__))
void
target_no_nothrow (void) /* { dg-message ".alias_nothrow. target declared here" } */
{ }
ATTR (alias ("target_no_nothrow"), nothrow) void
alias_nothrow (void); /* { dg-warning ".alias_nothrow. specifies more restrictive attribute than its target .target_no_nothrow.: .nothrow." } */
#pragma GCC diagnostic push "-Wattribute-alias"
#pragma GCC diagnostic ignored "-Wattribute-alias"
ATTR (alias ("target_no_nothrow"), nothrow) void
alias_nothrow_ignored (void);
#pragma GCC diagnostic pop "-Wattribute-alias"
ATTR (pure) int
alias_pure (void);
int
target_no_pure (void) /* { dg-message ".alias_pure. target declared here" } */
{ return 0; }
ATTR (alias ("target_no_pure")) int
alias_pure (void); /* { dg-warning ".alias_pure. specifies more restrictive attribute than its target .target_no_pure.: .pure." } */
ATTR (const) int
alias_const (void);
int
target_pure (void) /* { dg-message ".alias_const. target declared here" } */
{ return 0; }
ATTR (alias ("target_pure")) int
alias_const (void); /* { dg-warning ".alias_const. specifies more restrictive attribute than its target .target_pure.: .const." } */
/* There is no obvious relationship between the attributes on an ifunc
resolver and those on its aliases. Verify that mismatches between
aliases and ifunc resolvers do not trigger warnings. */
typedef int F (void);
ATTR (pure, leaf) F* resolve_to_const (void)
{ return alias_const; }
ATTR (ifunc ("resolve_to_const")) F alias_no_const_ifunc;
ATTR (const, ifunc ("resolve_to_const")) F alias_const_ifunc;
ATTR (ifunc ("resolve_to_const")) int alias_no_leaf_ifunc (void);