| /* Test of <stdalign.h>. |
| Copyright 2009-2020 Free Software Foundation, Inc. |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
| |
| /* Written by Paul Eggert, inspired by Bruno Haible's test-alignof.c. */ |
| |
| #include <config.h> |
| |
| #include <stdalign.h> |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "verify.h" |
| |
| #include "macros.h" |
| |
| typedef long double longdouble; |
| typedef struct { char a[1]; } struct1; |
| typedef struct { char a[2]; } struct2; |
| typedef struct { char a[3]; } struct3; |
| typedef struct { char a[4]; } struct4; |
| |
| verify (__alignof_is_defined == 1); |
| #ifndef alignof |
| # error "alignof is not a macro" |
| #endif |
| |
| #if __alignas_is_defined |
| verify (__alignas_is_defined == 1); |
| # ifndef alignas |
| # error "alignas is not a macro" |
| # endif |
| /* mingw can go up only to 8. 8 is all that GNU Emacs needs, so let's |
| limit the test to 8 for now. */ |
| # define TEST_ALIGNMENT 8 |
| #else |
| # define _Alignas(alignment) |
| # define alignas(alignment) |
| # define TEST_ALIGNMENT 1 |
| #endif |
| |
| #define CHECK_STATIC(type) \ |
| typedef struct { char slot1; type slot2; } type##_helper; \ |
| verify (alignof (type) == offsetof (type##_helper, slot2)); \ |
| verify (_Alignof (type) == alignof (type)); \ |
| const int type##_alignment = alignof (type); \ |
| type alignas (TEST_ALIGNMENT) static_##type##_alignas; \ |
| type _Alignas (TEST_ALIGNMENT) static_##type##_Alignas |
| |
| #define CHECK_ALIGNED(var) ASSERT ((uintptr_t) &(var) % TEST_ALIGNMENT == 0) |
| |
| CHECK_STATIC (char); |
| CHECK_STATIC (short); |
| CHECK_STATIC (int); |
| CHECK_STATIC (long); |
| #ifdef INT64_MAX |
| CHECK_STATIC (int64_t); |
| #endif |
| CHECK_STATIC (float); |
| CHECK_STATIC (double); |
| /* CHECK_STATIC (longdouble); */ |
| CHECK_STATIC (struct1); |
| CHECK_STATIC (struct2); |
| CHECK_STATIC (struct3); |
| CHECK_STATIC (struct4); |
| |
| int |
| main () |
| { |
| #if defined __SUNPRO_C |
| /* Avoid a test failure due to Sun Studio Developer Bug Report #2125432. */ |
| fputs ("Skipping test: known Sun C compiler bug\n", stderr); |
| return 77; |
| #elif defined __HP_cc && __ia64 |
| /* Avoid a test failure due to HP-UX Itanium cc bug; see: |
| https://lists.gnu.org/r/bug-gnulib/2017-03/msg00078.html */ |
| fputs ("Skipping test: known HP-UX Itanium cc compiler bug\n", stderr); |
| return 77; |
| #else |
| CHECK_ALIGNED (static_char_alignas); |
| CHECK_ALIGNED (static_char_Alignas); |
| CHECK_ALIGNED (static_short_alignas); |
| CHECK_ALIGNED (static_short_Alignas); |
| CHECK_ALIGNED (static_int_alignas); |
| CHECK_ALIGNED (static_int_Alignas); |
| CHECK_ALIGNED (static_long_alignas); |
| CHECK_ALIGNED (static_long_Alignas); |
| # ifdef INT64_MAX |
| CHECK_ALIGNED (static_int64_t_alignas); |
| CHECK_ALIGNED (static_int64_t_Alignas); |
| # endif |
| CHECK_ALIGNED (static_float_alignas); |
| CHECK_ALIGNED (static_float_Alignas); |
| CHECK_ALIGNED (static_double_alignas); |
| CHECK_ALIGNED (static_double_Alignas); |
| /* CHECK_ALIGNED (static_longdouble_alignas); */ |
| /* CHECK_ALIGNED (static_longdouble_Alignas); */ |
| CHECK_ALIGNED (static_struct1_alignas); |
| CHECK_ALIGNED (static_struct1_Alignas); |
| CHECK_ALIGNED (static_struct2_alignas); |
| CHECK_ALIGNED (static_struct2_Alignas); |
| CHECK_ALIGNED (static_struct3_alignas); |
| CHECK_ALIGNED (static_struct3_Alignas); |
| CHECK_ALIGNED (static_struct4_alignas); |
| CHECK_ALIGNED (static_struct4_Alignas); |
| return 0; |
| #endif |
| } |