Line data Source code
1 : /* Test of <stdalign.h>. 2 : Copyright 2009-2020 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 1 : main () 82 : { 83 : #if defined __SUNPRO_C 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 : #else 93 : CHECK_ALIGNED (static_char_alignas); 94 : CHECK_ALIGNED (static_char_Alignas); 95 : CHECK_ALIGNED (static_short_alignas); 96 : CHECK_ALIGNED (static_short_Alignas); 97 : CHECK_ALIGNED (static_int_alignas); 98 : CHECK_ALIGNED (static_int_Alignas); 99 : CHECK_ALIGNED (static_long_alignas); 100 : CHECK_ALIGNED (static_long_Alignas); 101 : # ifdef INT64_MAX 102 : CHECK_ALIGNED (static_int64_t_alignas); 103 : CHECK_ALIGNED (static_int64_t_Alignas); 104 : # endif 105 : CHECK_ALIGNED (static_float_alignas); 106 : CHECK_ALIGNED (static_float_Alignas); 107 : CHECK_ALIGNED (static_double_alignas); 108 : CHECK_ALIGNED (static_double_Alignas); 109 : /* CHECK_ALIGNED (static_longdouble_alignas); */ 110 : /* CHECK_ALIGNED (static_longdouble_Alignas); */ 111 : CHECK_ALIGNED (static_struct1_alignas); 112 : CHECK_ALIGNED (static_struct1_Alignas); 113 : CHECK_ALIGNED (static_struct2_alignas); 114 : CHECK_ALIGNED (static_struct2_Alignas); 115 : CHECK_ALIGNED (static_struct3_alignas); 116 : CHECK_ALIGNED (static_struct3_Alignas); 117 : CHECK_ALIGNED (static_struct4_alignas); 118 : CHECK_ALIGNED (static_struct4_Alignas); 119 1 : return 0; 120 : #endif 121 : }