]> Savannah Git Hosting - gnulib.git/commitdiff
stddef: Fix compilation error in C++ mode on MSVC.
authorBruno Haible <bruno@clisp.org>
Wed, 11 Dec 2019 08:48:53 +0000 (09:48 +0100)
committerBruno Haible <bruno@clisp.org>
Wed, 11 Dec 2019 11:28:23 +0000 (12:28 +0100)
* lib/stddef.in.h (max_align_t): With MSVC in C++ mode, don't define it;
instead, include <cstddef>.

ChangeLog
lib/stddef.in.h

index efa548ae8e38a6320864b300a75d51ed244f37e4..a8bcfe57dac11ddcc5f5a360703ea7f1ac44a428 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2019-12-11  Bruno Haible  <bruno@clisp.org>
+
+       stddef: Fix compilation error in C++ mode on MSVC.
+       * lib/stddef.in.h (max_align_t): With MSVC in C++ mode, don't define it;
+       instead, include <cstddef>.
+
 2019-12-11  Bruno Haible  <bruno@clisp.org>
 
        unistd: Fix compilation error in C++ mode on MSVC.
index e01f41b43a5da9028abe6ac9203ec537488afc65..e6c601ad2453acd4d6e2ae2a9ab7ea21302a6ebe 100644 (file)
 
 /* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
    a hack in case the configure-time test was done with g++ even though
-   we are currently compiling with gcc.  */
-#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
-# if !GNULIB_defined_max_align_t
+   we are currently compiling with gcc.
+   On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
+   included.  Its definition is good since it has an alignment of 8 (on x86
+   and x86_64).  */
+#if defined _MSC_VER && defined __cplusplus
+# include <cstddef>
+#else
+# if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
+#  if !GNULIB_defined_max_align_t
 /* On the x86, the maximum storage alignment of double, long, etc. is 4,
    but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
    and the C11 standard allows this.  Work around this problem by
    using __alignof__ (which returns 8 for double) rather than _Alignof
    (which returns 4), and align each union member accordingly.  */
-#  ifdef __GNUC__
-#   define _GL_STDDEF_ALIGNAS(type) \
-      __attribute__ ((__aligned__ (__alignof__ (type))))
-#  else
-#   define _GL_STDDEF_ALIGNAS(type) /* */
-#  endif
+#   ifdef __GNUC__
+#    define _GL_STDDEF_ALIGNAS(type) \
+       __attribute__ ((__aligned__ (__alignof__ (type))))
+#   else
+#    define _GL_STDDEF_ALIGNAS(type) /* */
+#   endif
 typedef union
 {
   char *__p _GL_STDDEF_ALIGNAS (char *);
@@ -104,8 +110,9 @@ typedef union
   long double __ld _GL_STDDEF_ALIGNAS (long double);
   long int __i _GL_STDDEF_ALIGNAS (long int);
 } rpl_max_align_t;
-#  define max_align_t rpl_max_align_t
-#  define GNULIB_defined_max_align_t 1
+#   define max_align_t rpl_max_align_t
+#   define GNULIB_defined_max_align_t 1
+#  endif
 # endif
 #endif