diff options
author | Bruno Haible <bruno@clisp.org> | 2023-01-28 02:55:06 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2023-01-28 03:23:17 +0100 |
commit | 4cb09c1ada791c12d3f7ac7dbe4b906c00513589 (patch) | |
tree | 307836a6b5173cd9355d1e5ab7e4ad1f72fac49c /m4 | |
parent | 2c78d1eadedebf5e279fe282aee7e51958f806a6 (diff) | |
download | gnulib-4cb09c1ada791c12d3f7ac7dbe4b906c00513589.tar.gz |
alignasof: Ensure a correct _Alignof (regression 2023-01-15).
* m4/stdalign.m4 (gl_ALIGNASOF): Apply the workaround for wrong _Alignof
in GCC < 4.9 and clang < 8.0.0 also when the system has <stdalign.h>.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/stdalign.m4 | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/m4/stdalign.m4 b/m4/stdalign.m4 index 3e83a2ca58..f49cf8ec16 100644 --- a/m4/stdalign.m4 +++ b/m4/stdalign.m4 @@ -71,7 +71,8 @@ AC_DEFUN([gl_ALIGNASOF], [#if !defined HAVE_C_ALIGNASOF && __cplusplus < 201103 && !defined alignof # if HAVE_STDALIGN_H # include <stdalign.h> -# else +# endif + /* ISO C23 alignas and alignof for platforms that lack it. References: @@ -99,30 +100,32 @@ AC_DEFUN([gl_ALIGNASOF], /* GCC releases before GCC 4.9 had a bug in _Alignof. See GCC bug 52023 <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>. clang versions < 8.0.0 have the same bug. */ -# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \ - || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \ - && !defined __clang__) \ - || (defined __clang__ && __clang_major__ < 8)) -# ifdef __cplusplus -# if (201103 <= __cplusplus || defined _MSC_VER) -# define _Alignof(type) alignof (type) -# else - template <class __t> struct __alignof_helper { char __a; __t __b; }; -# define _Alignof(type) offsetof (__alignof_helper<type>, __b) -# define _GL_STDALIGN_NEEDS_STDDEF 1 -# endif +# if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \ + || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \ + && !defined __clang__) \ + || (defined __clang__ && __clang_major__ < 8)) +# undef/**/_Alignof +# ifdef __cplusplus +# if (201103 <= __cplusplus || defined _MSC_VER) +# define _Alignof(type) alignof (type) # else -# if (defined __GNUC__ && 4 <= __GNUC__) || defined __clang__ -# define _Alignof(type) __builtin_offsetof (struct { char __a; type __b; }, __b) -# else -# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) -# define _GL_STDALIGN_NEEDS_STDDEF 1 -# endif + template <class __t> struct __alignof_helper { char __a; __t __b; }; +# define _Alignof(type) offsetof (__alignof_helper<type>, __b) +# define _GL_STDALIGN_NEEDS_STDDEF 1 +# endif +# else +# if (defined __GNUC__ && 4 <= __GNUC__) || defined __clang__ +# define _Alignof(type) __builtin_offsetof (struct { char __a; type __b; }, __b) +# else +# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b) +# define _GL_STDALIGN_NEEDS_STDDEF 1 # endif # endif -# if ! (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)) -# define alignof _Alignof -# endif +# endif +# if ! (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)) +# undef/**/alignof +# define alignof _Alignof +# endif /* alignas (A), also known as _Alignas (A), aligns a variable or type to the alignment A, where A is an integer constant expression. For @@ -148,6 +151,7 @@ AC_DEFUN([gl_ALIGNASOF], - alignas (TYPE) is equivalent to alignas (alignof (TYPE)). */ +# if !HAVE_STDALIGN_H # if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 # if defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER) # define _Alignas(a) alignas (a) @@ -169,9 +173,10 @@ AC_DEFUN([gl_ALIGNASOF], || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) # define alignas _Alignas # endif -# if _GL_STDALIGN_NEEDS_STDDEF -# include <stddef.h> -# endif +# endif + +# if _GL_STDALIGN_NEEDS_STDDEF +# include <stddef.h> # endif #endif]) ]) |