(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
attr-copy-4.c
       1  /* PR middle-end/81824 - Warn for missing attributes with function aliases
       2     Exercise attribute copy for types.
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
       5  
       6  #define Assert(expr)   typedef char AssertExpr[2 * !!(expr) - 1]
       7  
       8  #define ATTR(list)   __attribute__ (list)
       9  
      10  /* Use attribute packed to verify that type attributes are copied
      11     from one type to another.  */
      12  
      13  struct ATTR ((packed)) PackedA { int i; char c; };
      14  
      15  Assert (__alignof (struct PackedA) == 1);
      16  
      17  struct ATTR ((copy ((struct PackedA*)0))) PackedB { long i; char c; };
      18  
      19  Assert (__alignof (struct PackedA) == __alignof (struct PackedB));
      20  
      21  struct PackedMember
      22  {
      23    char c;
      24    ATTR ((copy ((struct PackedB*)0))) double packed_mem; 
      25    /* { dg-warning "attribute ignored" "" { target default_packed } .-1 } */
      26  };
      27  
      28  Assert (__alignof (struct PackedMember) == 1);
      29  
      30  
      31  extern const struct PackedA packed;
      32  
      33  struct Unpacked { int i; char c; };
      34  Assert (__alignof (struct Unpacked) > 1);
      35  /* { dg-error "size of array .* is negative" "" { target default_packed } .-1 } */
      36  
      37  /* Verify that copying the packed attribute to the declaration
      38     of an object is ignored with a warning.  (There should be
      39     a way to copy just the subset of attributes from a type that
      40     aren't ignored and won't cause a warning, maybe via attribute
      41     copy_except or something like that.)  */
      42  extern ATTR ((copy ((struct PackedA*)0))) const struct Unpacked
      43    unpacked;                   /* { dg-warning ".packed. attribute ignored" } */
      44  
      45  Assert (__alignof (packed) == 1);
      46  Assert (__alignof (unpacked) == __alignof (struct Unpacked));
      47  
      48  
      49  
      50  /* Verify that attribute deprecated isn't copied (but referencing
      51     the deprecated type in the copy attribute still triggers a warning).  */
      52  
      53  struct ATTR ((aligned (8), deprecated))
      54  AlignedDeprecated { char c; };
      55  
      56  struct ATTR ((copy ((struct AlignedDeprecated *)0)))        /* { dg-warning "\\\[-Wdeprecated-declarations]" } */
      57  AlignedCopy { short s; };
      58  
      59  Assert (__alignof (struct AlignedCopy) == 8);
      60  
      61  struct AlignedCopy aligned_copy;
      62  
      63  Assert (__alignof (aligned_copy) == 8);