X-Git-Url: https://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/e2f2206552cd2153641c17908d938930fb15d3d4..f5df895ced92ac539cafd825efee98835d8bf0d3:/m4/align.m4 diff --git a/m4/align.m4 b/m4/align.m4 index 03e18a8..945beff 100644 --- a/m4/align.m4 +++ b/m4/align.m4 @@ -8,10 +8,14 @@ # # Probe whether the C compiler understands _Alignof(T). # +# Some implementations (e.g., FreeBSD 9) define a usable _Alignof macro +# in (and other headers), so we can use that if available. +# # If not supported, _Alignof(T) is defined as a function-like macro which # uses offsetof to guess the alignment of T, which must be a type such that -# T x; is a valid declaration of x as an object of type T. It is therefore -# necessary that the caller includes before using _Alignof. +# T x; is a valid declaration of x as an object of type T. +# +# For these reasons, callers should #include before using _Alignof. # # We skip the test if Autoconf has previously determined that the C compiler # supports C11 or a newer standard, since the C11 test program checks this. @@ -22,7 +26,8 @@ AC_DEFUN([DX_C_ALIGNOF], [AS_CASE([${ac_cv_prog_cc_c11-no}/${ac_prog_cc_stdc-no}], [no/no|*/c89|*/c99], [AC_CACHE_CHECK([if $CC supports _Alignof], [dx_cv_have_alignof], - [AC_COMPUTE_INT([_dx_tmp], [_Alignof(char)], [@&t@], [_dx_tmp=0]) + [AC_COMPUTE_INT([_dx_tmp], [_Alignof(char)], [#include +], [_dx_tmp=0]) AS_CASE([$_dx_tmp], [1], [dx_cv_have_alignof=yes], [dx_cv_have_alignof=no])])], [dx_cv_have_alignof=yes]) AS_CASE([$dx_cv_have_alignof], [no], [AC_DEFINE([_Alignof(T)], @@ -33,6 +38,10 @@ AS_CASE([$dx_cv_have_alignof], [no], [AC_DEFINE([_Alignof(T)], # # Probe whether the C compiler understands _Alignas(X). # +# Some implementations (e.g., FreeBSD 9) define a usable _Alignas macro +# in (and other headers), so we can use that if available. For +# this reason, callers should #include before using _Alignas. +# # If not supported, but the compiler supports the GNU __attribute__ or # Microsoft __declspec methods to set alignment, _Alignas(X) is defined # as a function-like macro which expands to such syntax. These only @@ -55,7 +64,8 @@ in '_Alignas(X)' '__attribute__((__aligned__(X)))' '__declspec(align(X))' do AC_COMPUTE_INT([_dx_tmp], [sizeof (struct { char a; char ALIGNAS_TEST(4) b; }) >= 8], - [#define ALIGNAS_TEST(X) $_dx_alignas + [#include +#define ALIGNAS_TEST(X) $_dx_alignas ],[_dx_tmp=0]) AS_CASE([$_dx_tmp/$_dx_alignas], [1/_Alignas*], [dx_cv_have_alignas=yes; break],