(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
attr-copy.c
       1  /* PR c++/94346 - ICE due to handle_copy_attribute
       2     { dg-do compile }
       3     { dg-options "-Wall" } */
       4  
       5  #define ATTR(...) __attribute__ ((__VA_ARGS__))
       6  
       7  #if __cplusplus > 199711L
       8  #  define SA(expr) static_assert (expr, #expr)
       9  #elif __cplusplus
      10  #  define SA(expr)							\
      11    typedef __attribute__ ((unused)) char Assert[!(expr) ? -1 : 1]
      12  #else
      13  #  define SA(expr) _Static_assert (expr, #expr)
      14  #endif
      15  
      16  typedef struct ATTR (packed) A { ATTR (packed) unsigned bf: 1; } A;
      17  
      18  int bar (void);
      19  
      20  struct C
      21  {
      22    char c;
      23    ATTR (copy ((bar (), ((struct A *)(0))[0]))) int i;
      24    /* { dg-warning "attribute ignored" "" { target default_packed } .-1 } */
      25  };
      26  
      27  /* Verify the attribute has been copied.  */
      28  SA (__builtin_offsetof (struct C, i) == 1);
      29  
      30  
      31  
      32  /* Verify attribute copy can copy from the type a comma expression.  */
      33  ATTR (alloc_size (1)) void* alloc1 (int);
      34  
      35  ATTR (copy ((bar (), alloc1))) void* alloc2 (int, int);
      36  
      37  ATTR (copy ((bar (), alloc1))) void alloc3 (int);  /* { dg-warning "'alloc_size' attribute ignored on a function returning 'void'" } */
      38  
      39  
      40  typedef ATTR (alloc_size (1)) void* F (int);
      41  
      42  ATTR (copy ((bar (), (F*)0))) void* alloc4 (int, int);
      43  
      44  ATTR (copy ((bar (), (F*)0))) void alloc5 (int, int);  /* { dg-warning "'alloc_size' attribute ignored on a function returning 'void'" } */