]> git.draconx.ca Git - dxcommon.git/blobdiff - m4/align.m4
Avoid _Alignas/_Alignof redefinition on FreeBSD.
[dxcommon.git] / m4 / align.m4
index 03e18a81028a52451cbce2e69577e22f68513690..945beffe1d9b3c54ceff0a93677cde2662dd4ff2 100644 (file)
@@ -8,10 +8,14 @@
 #
 # Probe whether the C compiler understands _Alignof(T).
 #
+# Some implementations (e.g., FreeBSD 9) define a usable _Alignof macro
+# in <stddef.h> (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 <stddef.h> before using _Alignof.
+# T x; is a valid declaration of x as an object of type T.
+#
+# For these reasons, callers should #include <stddef.h> 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 <stddef.h>
+], [_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 <stddef.h> (and other headers), so we can use that if available.  For
+# this reason, callers should #include <stddef.h> 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 <stddef.h>
+#define ALIGNAS_TEST(X) $_dx_alignas
 ],[_dx_tmp=0])
 AS_CASE([$_dx_tmp/$_dx_alignas],
   [1/_Alignas*], [dx_cv_have_alignas=yes; break],