(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wattribute-alias.c
       1  /* PR middle-end/81824 - Warn for missing attributes with function aliases
       2     { dg-do compile }
       3     { dg-require-ifunc "" }
       4     { dg-options "-Wall -Wattribute-alias=2" } */
       5  
       6  #define ATTR(...)   __attribute__ ((__VA_ARGS__))
       7  
       8  
       9  void
      10  target_no_nothrow (void)        /* { dg-message ".alias_nothrow. target declared here" } */
      11  { }
      12  
      13  ATTR (alias ("target_no_nothrow"), nothrow) void
      14  alias_nothrow (void);           /* { dg-warning ".alias_nothrow. specifies more restrictive attribute than its target .target_no_nothrow.: .nothrow." } */
      15  
      16  
      17  #pragma GCC diagnostic push "-Wattribute-alias"
      18  #pragma GCC diagnostic ignored "-Wattribute-alias"
      19  ATTR (alias ("target_no_nothrow"), nothrow) void
      20  alias_nothrow_ignored (void);
      21  #pragma GCC diagnostic pop "-Wattribute-alias"
      22  
      23  
      24  ATTR (pure) int
      25  alias_pure (void);
      26  
      27  int
      28  target_no_pure (void)           /* { dg-message ".alias_pure. target declared here" } */
      29  { return 0; }
      30  
      31  ATTR (alias ("target_no_pure")) int
      32  alias_pure (void);              /* { dg-warning ".alias_pure. specifies more restrictive attribute than its target .target_no_pure.: .pure." } */
      33  
      34  
      35  ATTR (const) int
      36  alias_const (void);
      37  
      38  int
      39  target_pure (void)              /* { dg-message ".alias_const. target declared here" } */
      40  { return 0; }
      41  
      42  ATTR (alias ("target_pure")) int
      43  alias_const (void);             /* { dg-warning ".alias_const. specifies more restrictive attribute than its target .target_pure.: .const." } */
      44  
      45  
      46  /* There is no obvious relationship between the attributes on an ifunc
      47     resolver and those on its aliases.  Verify that mismatches between
      48     aliases and ifunc resolvers do not trigger warnings.  */
      49  
      50  typedef int F (void);
      51  
      52  ATTR (pure, leaf) F* resolve_to_const (void)
      53  { return alias_const; }
      54  
      55  ATTR (ifunc ("resolve_to_const")) F alias_no_const_ifunc;
      56  ATTR (const, ifunc ("resolve_to_const")) F alias_const_ifunc;
      57  ATTR (ifunc ("resolve_to_const")) int alias_no_leaf_ifunc (void);