1  /* Copyright (C) 2000 Free Software Foundation, Inc.
       2     Contributed by Nathan Sidwell 23 Feb 2000 <nathan@codesourcery.com> */
       3  
       4  /* __alignof__ should never return a non-power of 2
       5     eg, sizeof(long double) might be 12, but that means it must be alignable
       6     on a 4 byte boundary. */
       7  
       8  void check (char const *type, int align)
       9  {
      10    if ((align & -align) != align)
      11      {
      12        abort ();
      13      }
      14  }
      15  
      16  #define QUOTE_(s) #s
      17  #define QUOTE(s) QUOTE_(s)
      18  
      19  #define check(t) check(QUOTE(t), __alignof__(t))
      20  
      21  // This struct should have an alignment of the lcm of all the types. If one of
      22  // the base alignments is not a power of two, then A cannot be power of two
      23  // aligned.
      24  struct A
      25  {
      26    char c;
      27    signed short ss;
      28    unsigned short us;
      29    signed int si;
      30    unsigned int ui;
      31    signed long sl;
      32    unsigned long ul;
      33    signed long long sll;
      34    unsigned long long ull;
      35    float f;
      36    double d;
      37    long double ld;
      38    void *dp;
      39    void (*fp)();
      40  };
      41  
      42  int main ()
      43  {
      44    check (void);
      45    check (char);
      46    check (signed short);
      47    check (unsigned short);
      48    check (signed int);
      49    check (unsigned int);
      50    check (signed long);
      51    check (unsigned long);
      52    check (signed long long);
      53    check (unsigned long long);
      54    check (float);
      55    check (double);
      56    check (long double);
      57    check (void *);
      58    check (void (*)());
      59    check (struct A);
      60    return 0;
      61  }