(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wmissing-attributes.c
       1  /* PR middle-end/81824 - Warn for missing attributes with function aliases
       2     { dg-do compile }
       3     { dg-require-alias "" }
       4     { dg-options "-Wall" } */
       5  
       6  #define ATTR(list)   __attribute__ (list)
       7  
       8  
       9  int alias_no_const (void);
      10  
      11  ATTR ((const)) int
      12  target_const (void)             /* { dg-message ".alias_no_const. target declared here" } */
      13  { return 0; }
      14  
      15  ATTR ((alias ("target_const"))) int
      16  alias_no_const (void);          /* { dg-warning ".alias_no_const. specifies less restrictive attribute than its target .target_const.: .const." } */
      17  
      18  
      19  ATTR ((alloc_size (1), malloc)) void*
      20  target_malloc (int n)           /* { dg-message ".alias_no_malloc. target declared here" } */
      21  { return __builtin_malloc (n); }
      22  
      23  ATTR ((alias ("target_malloc"))) void*
      24  alias_no_malloc (int);          /* { dg-warning ".alias_no_malloc. specifies less restrictive attributes than its target .target_malloc.: .alloc_size., .malloc." } */
      25  
      26  
      27  ATTR ((leaf)) int
      28  target_leaf (void)              /* { dg-message ".alias_no_leaf. target declared here" } */
      29  { return 0; }
      30  
      31  ATTR ((alias ("target_leaf"))) int
      32  alias_no_leaf (void);           /* { dg-warning ".alias_no_leaf. specifies less restrictive attribute than its target .target_leaf.: .leaf." } */
      33  
      34  
      35  /* Verify that attributes noclone, noinline, and noipa on the target
      36     don't cause a warning for aliases without the attribute.  */
      37  
      38  ATTR ((noclone)) int
      39  target_noclone (void)
      40  { return 0; }
      41  
      42  ATTR ((alias ("target_noclone"))) int
      43  alias_no_noclone (void);
      44  
      45  
      46  ATTR ((noipa)) int
      47  target_noipa (void)
      48  { return 0; }
      49  
      50  ATTR ((alias ("target_noipa"))) int
      51  alias_no_noipa (void);
      52  
      53  
      54  ATTR ((noinline)) int
      55  target_noinline (void)
      56  { return 0; }
      57  
      58  ATTR ((alias ("target_noinline"))) int
      59  alias_no_noinline (void);
      60  
      61  
      62  ATTR ((nothrow)) int
      63  target_nothrow (void)           /* { dg-message ".alias_no_nothrow. target declared here" } */
      64  { return 0; }
      65  
      66  ATTR ((alias ("target_nothrow"))) int
      67  alias_no_nothrow (void);        /* { dg-warning ".alias_no_nothrow. specifies less restrictive attribute than its target .target_nothrow.: .nothrow." } */
      68  
      69  
      70  /* Verify that attribute weak on the target doesn't cause and isn't
      71     mentioned in a warning for aliases without the attribute.  */
      72  
      73  ATTR ((weak)) int
      74  target_weak (void)
      75  { return 0; }
      76  
      77  ATTR ((alias ("target_weak"))) int
      78  alias_no_weak (void);
      79  
      80  
      81  ATTR ((nothrow, weak)) int
      82  target_nothrow_weak (void)      /* { dg-message ".alias_nothrow_no_weak. target declared here" } */
      83  { return 0; }
      84  
      85  ATTR ((alias ("target_nothrow_weak"))) int
      86  alias_nothrow_no_weak (void);        /* { dg-warning ".alias_nothrow_no_weak. specifies less restrictive attribute than its target .target_nothrow_weak.: .nothrow." } */
      87  
      88  
      89  /* Verify that __typeof__ doesn't include attributes.  */
      90  
      91  ATTR ((cold)) int
      92  target_cold (void)
      93  { return 0; }
      94  
      95  __typeof__ (target_cold) ATTR ((alias ("target_cold")))
      96  alias_cold;                   /* { dg-warning ".alias_cold. specifies less restrictive attribute than its target .target_cold.: .cold." } */