root/maint/gnulib/tests/test-stdalign.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /* Test of <stdalign.h>.
   2    Copyright 2009-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Paul Eggert, inspired by Bruno Haible's test-alignof.c.  */
  18 
  19 #include <config.h>
  20 
  21 #include <stdalign.h>
  22 
  23 #include <stddef.h>
  24 #include <stdint.h>
  25 
  26 #include "verify.h"
  27 
  28 #include "macros.h"
  29 
  30 typedef long double longdouble;
  31 typedef struct { char a[1]; } struct1;
  32 typedef struct { char a[2]; } struct2;
  33 typedef struct { char a[3]; } struct3;
  34 typedef struct { char a[4]; } struct4;
  35 
  36 verify (__alignof_is_defined == 1);
  37 #ifndef alignof
  38 # error "alignof is not a macro"
  39 #endif
  40 
  41 #if __alignas_is_defined
  42 verify (__alignas_is_defined == 1);
  43 # ifndef alignas
  44 #  error "alignas is not a macro"
  45 # endif
  46 /* mingw can go up only to 8.  8 is all that GNU Emacs needs, so let's
  47    limit the test to 8 for now.  */
  48 # define TEST_ALIGNMENT 8
  49 #else
  50 # define _Alignas(alignment)
  51 # define alignas(alignment)
  52 # define TEST_ALIGNMENT 1
  53 #endif
  54 
  55 #define CHECK_STATIC(type) \
  56   typedef struct { char slot1; type slot2; } type##_helper; \
  57   verify (alignof (type) == offsetof (type##_helper, slot2)); \
  58   verify (_Alignof (type) == alignof (type)); \
  59   const int type##_alignment = alignof (type); \
  60   type alignas (TEST_ALIGNMENT) static_##type##_alignas; \
  61   type _Alignas (TEST_ALIGNMENT) static_##type##_Alignas
  62 
  63 #define CHECK_ALIGNED(var) ASSERT ((uintptr_t) &(var) % TEST_ALIGNMENT == 0)
  64 
  65 CHECK_STATIC (char);
  66 CHECK_STATIC (short);
  67 CHECK_STATIC (int);
  68 CHECK_STATIC (long);
  69 #ifdef INT64_MAX
  70 CHECK_STATIC (int64_t);
  71 #endif
  72 CHECK_STATIC (float);
  73 CHECK_STATIC (double);
  74 /* CHECK_STATIC (longdouble); */
  75 CHECK_STATIC (struct1);
  76 CHECK_STATIC (struct2);
  77 CHECK_STATIC (struct3);
  78 CHECK_STATIC (struct4);
  79 
  80 int
  81 main ()
     /* [previous][next][first][last][top][bottom][index][help] */
  82 {
  83 #if defined __SUNPRO_C && __SUNPRO_C < 0x5150
  84   /* Avoid a test failure due to Sun Studio Developer Bug Report #2125432.  */
  85   fputs ("Skipping test: known Sun C compiler bug\n", stderr);
  86   return 77;
  87 #elif defined __HP_cc && __ia64
  88   /* Avoid a test failure due to HP-UX Itanium cc bug; see:
  89      https://lists.gnu.org/r/bug-gnulib/2017-03/msg00078.html  */
  90   fputs ("Skipping test: known HP-UX Itanium cc compiler bug\n", stderr);
  91   return 77;
  92 #elif defined __clang__ && defined __ibmxl__
  93   /* Avoid a test failure with IBM xlc 16.1.  It ignores alignas (8),
  94      _Alignas (8), and __attribute__ ((__aligned__ (8))).  */
  95   fputs ("Skipping test: known AIX XL C compiler deficiency\n", stderr);
  96   return 77;
  97 #else
  98   CHECK_ALIGNED (static_char_alignas);
  99   CHECK_ALIGNED (static_char_Alignas);
 100   CHECK_ALIGNED (static_short_alignas);
 101   CHECK_ALIGNED (static_short_Alignas);
 102   CHECK_ALIGNED (static_int_alignas);
 103   CHECK_ALIGNED (static_int_Alignas);
 104   CHECK_ALIGNED (static_long_alignas);
 105   CHECK_ALIGNED (static_long_Alignas);
 106 # ifdef INT64_MAX
 107   CHECK_ALIGNED (static_int64_t_alignas);
 108   CHECK_ALIGNED (static_int64_t_Alignas);
 109 # endif
 110   CHECK_ALIGNED (static_float_alignas);
 111   CHECK_ALIGNED (static_float_Alignas);
 112   CHECK_ALIGNED (static_double_alignas);
 113   CHECK_ALIGNED (static_double_Alignas);
 114   /* CHECK_ALIGNED (static_longdouble_alignas); */
 115   /* CHECK_ALIGNED (static_longdouble_Alignas); */
 116   CHECK_ALIGNED (static_struct1_alignas);
 117   CHECK_ALIGNED (static_struct1_Alignas);
 118   CHECK_ALIGNED (static_struct2_alignas);
 119   CHECK_ALIGNED (static_struct2_Alignas);
 120   CHECK_ALIGNED (static_struct3_alignas);
 121   CHECK_ALIGNED (static_struct3_Alignas);
 122   CHECK_ALIGNED (static_struct4_alignas);
 123   CHECK_ALIGNED (static_struct4_Alignas);
 124   return 0;
 125 #endif
 126 }

/* [previous][next][first][last][top][bottom][index][help] */