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