+2023-01-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ alignasof: new module
+ This splits off support for the C23 keywords alignas and alignof,
+ from the now-deprecated stdalign module. The latter now merely
+ provides C11 support.
+ * MODULES.html.sh, NEWS, doc/gnulib.texi:
+ * doc/posix-headers/stdalign.texi: Document the change.
+ * lib/stdalign.in.h: Remove most of the definitions (which are now
+ supplied by the alignasof module), leaving only
+ __alignas_is_defined and __alignof_is_defined.
+ * modules/alignasof, modules/alignasof-tests: New files.
+ * m4/stdalign.m4 (gl_ALIGNASOF): New macro, with
+ most of the contents of the old gl_STDALIGN_H.
+ Do not define __alignas_is_defined or __alignof_is_defined.
+ (gl_STDALIGN_H): Rely on gl_ALIGNASOF for most of the work.
+ * modules/alignalloc, modules/alignof, modules/argp:
+ * modules/crypto/md4-buffer, modules/crypto/md5-buffer:
+ * modules/crypto/sha1-buffer, modules/crypto/sha256-buffer:
+ * modules/crypto/sha512-buffer, modules/crypto/sm3-buffer:
+ * modules/fts, modules/rawmemchr, modules/relocatable-prog-wrapper:
+ * modules/stddef-tests, modules/sys_socket:
+ Depend on alignasof, not stdalign.
+ * modules/stdalign: Deprecate. Depend on alignasof.
+ * modules/stdalign-tests: Move most contents to the new module
+ alignasof-tests, and depend on that.
+
2023-01-15 Bruno Haible <bruno@clisp.org>
fpending: Fix compilation error with NDK ≥ r14b and Android API < 23.
func_echo "$element"
func_begin_table
+ func_module alignasof
func_module stdckdint
func_end_table
Date Modules Changes
+2023-01-15 stdalign This module is deprecated. Use alignasof instead.
+
2023-01-07 timer_time Link with $(TIMER_TIME_LIB) instead of
$(LIB_TIMER_TIME).
@node alignof
@section @code{alignof} and @code{alignas}
-Gnulib module: stdalign
+Gnulib module: alignasof
-The @code{stdalign} module arranges for @code{alignas}, @code{alignof}, and
-@code{<stdalign.h>} to be more like standard C@. @xref{stdalign.h}.
+The @code{alignasof} module arranges for @code{alignas} and @code{alignof}
+to be more like standard C@.
Portability problems fixed by Gnulib:
@itemize
@item
On pre-C23 platforms, @code{<stdalign.h>} must be included before
using @code{alignas} or @code{alignof}.
+@xref{stdalign.h}.
@end itemize
Portability problems not fixed by Gnulib:
@node stdalign.h
@section @file{stdalign.h}
-POSIX specification:@* Not in POSIX yet, but we expect it will be.
-ISO C11 (latest free draft
-@url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf})
+POSIX specification:@* Not in POSIX yet, but we expect it will be,
+at least temporarily until it becomes obsolete due to its phasing
+out starting in C23.
+ISO C23 (latest free draft
+@url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf})
sections 6.5.3.4, 6.7.5, 7.15.
C++11 (latest free draft
@url{http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf})
section 18.10.
-Gnulib module: stdalign
+Gnulib module: alignasof
Portability problems fixed by Gnulib:
@itemize
On older C platforms @code{<stdalign.h>} must be included before using
@code{alignas} or @code{alignof}. For example, GCC versions before 13 do not
support these keywords, which were standardized by C23.
+On C23 and later platforms, @code{<stdalign.h>} has no effect and need
+not be included. (Gnulib-using code should not include
+@code{<stdalign.h>} without also employing Gnulib's now-deprecated
+@code{stdalign} module.)
@item
This header file is missing on many platforms:
FreeBSD 6.4, NetBSD 7.1, OpenBSD 6.7, Minix 3.3.0, AIX 7.1, HP-UX 11.31, IRIX 6.5, Solaris 11.3, mingw, MSVC 14, Android 9.0.
@code{_Alignas} and @code{_Alignof} keywords or macros.
This portability problem should not matter with code using this module,
as such code should use @code{alignas} and @code{alignof} instead.
+@item
+In C11 and C17, @code{<stdalign.h>} defines the macros
+@code{__alignas_is_defined} and
+@code{__alignof_is_defined} to 1.
+In C23, these macros are not defined.
+This portability problem should not matter with code using Gnulib's
+@code{alignasof} module, as such code should use @code{alignas} and
+@code{alignof} without checking these two macros. (Gnulib's
+now-deprecated @code{stdalign} module defines these two macros.)
@end itemize
Portability problems not fixed by Gnulib:
@code{alignas}. The bug is fixed in Sun C 5.15, also known as Oracle
Developer Studio 12.6 (2017).
@item
-@code{<stdalign.h>} must be #included before @code{_Alignas} and
-@code{_Alignof} can be used.
-@item
-In C11 and C17, @code{<stdalign.h>} defines the macros
-@code{__alignas_is_defined} and
-@code{__alignof_is_defined} to 1.
-In C23, these macros are not defined.
-@item
You cannot assume that @code{alignas} and @code{alignof} are reserved words;
they might be macros.
@end itemize
/* Written by Paul Eggert and Bruno Haible. */
+/* Define two obsolescent C11 macros, assuming alignas and alignof are
+ either keywords or alignasof-defined macros. */
+
#ifndef _GL_STDALIGN_H
#define _GL_STDALIGN_H
-/* ISO C11 <stdalign.h> for platforms that lack it.
-
- References:
- ISO C11 (latest free draft
- <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
- sections 6.5.3.4, 6.7.5, 7.15.
- C++11 (latest free draft
- <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
- section 18.10. */
-
-/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
- requirement of a structure member (i.e., slot or field) that is of
- type TYPE, as an integer constant expression.
-
- This differs from GCC's and clang's __alignof__ operator, which can
- yield a better-performing alignment for an object of that type. For
- example, on x86 with GCC and on Linux/x86 with clang,
- __alignof__ (double) and __alignof__ (long long) are 8, whereas
- alignof (double) and alignof (long long) are 4 unless the option
- '-malign-double' is used.
-
- The result cannot be used as a value for an 'enum' constant, if you
- want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */
-
-/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
- standard headers, defines conflicting implementations of _Alignas
- and _Alignof that are no better than ours; override them. */
-#undef _Alignas
-#undef _Alignof
-
-/* 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
-# 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
-#define __alignof_is_defined 1
-
-/* alignas (A), also known as _Alignas (A), aligns a variable or type
- to the alignment A, where A is an integer constant expression. For
- example:
-
- int alignas (8) foo;
- struct s { int a; int alignas (8) bar; };
-
- aligns the address of FOO and the offset of BAR to be multiples of 8.
-
- A should be a power of two that is at least the type's alignment
- and at most the implementation's alignment limit. This limit is
- 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
- to MSVC through at least version 10.0, A should be an integer
- constant, as MSVC does not support expressions such as 1 << 3.
- To be portable to Sun C 5.11, do not align auto variables to
- anything stricter than their default alignment.
-
- The following C11 requirements are not supported here:
-
- - If A is zero, alignas has no effect.
- - alignas can be used multiple times; the strictest one wins.
- - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
-
- */
-
-#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
-# if defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)
-# define _Alignas(a) alignas (a)
-# elif (!defined __attribute__ \
- && ((defined __APPLE__ && defined __MACH__ \
- ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
- : __GNUC__ && !defined __ibmxl__) \
- || (4 <= __clang_major__) \
- || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
- || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__))
-# define _Alignas(a) __attribute__ ((__aligned__ (a)))
-# elif 1300 <= _MSC_VER
-# define _Alignas(a) __declspec (align (a))
-# endif
-#endif
-#if ((defined _Alignas \
- && !(defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER))) \
- || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
-# define alignas _Alignas
-#endif
#if (defined alignas \
+ || (defined __STDC_VERSION__ && 202311 <= __STDC_VERSION__) \
|| (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)))
# define __alignas_is_defined 1
#endif
-/* Include <stddef.h> if needed for offsetof. */
-#if _GL_STDALIGN_NEEDS_STDDEF
-# include <stddef.h>
-#endif
+#define __alignof_is_defined 1
#endif /* _GL_STDALIGN_H */
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
+dnl Written by Paul Eggert and Bruno Haible.
+
# Prepare for substituting <stdalign.h> if it is not supported.
-AC_DEFUN([gl_STDALIGN_H],
+AC_DEFUN([gl_ALIGNASOF],
[
AC_CACHE_CHECK([for alignas and alignof],
[gl_cv_header_working_stdalign_h],
test "$gl_cv_header_working_stdalign_h" != no && break
done])
- GL_GENERATE_STDALIGN_H=false
AS_CASE([$gl_cv_header_working_stdalign_h],
- [no],
- [GL_GENERATE_STDALIGN_H=true],
[yes*keyword*],
[AC_DEFINE([HAVE_C_ALIGNASOF], [1],
[Define to 1 if the alignas and alignof keywords work.])])
- AC_CHECK_HEADERS_ONCE([stdalign.h])
-
dnl The "zz" puts this toward config.h's end, to avoid potential
dnl collisions with other definitions.
AH_VERBATIM([zzalignas],
# if HAVE_STDALIGN_H
# include <stdalign.h>
# else
- /* Substitute. Keep consistent with gnulib/lib/stdalign.in.h. */
-# ifndef _GL_STDALIGN_H
-# define _GL_STDALIGN_H
-# undef _Alignas
-# undef _Alignof
+/* ISO C23 alignas and alignof for platforms that lack it.
+
+ References:
+ ISO C23 (latest free draft
+ <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf>)
+ sections 6.5.3.4, 6.7.5, 7.15.
+ C++11 (latest free draft
+ <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
+ section 18.10. */
+
+/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
+ requirement of a structure member (i.e., slot or field) that is of
+ type TYPE, as an integer constant expression.
+
+ This differs from GCC's and clang's __alignof__ operator, which can
+ yield a better-performing alignment for an object of that type. For
+ example, on x86 with GCC and on Linux/x86 with clang,
+ __alignof__ (double) and __alignof__ (long long) are 8, whereas
+ alignof (double) and alignof (long long) are 4 unless the option
+ '-malign-double' is used.
+
+ The result cannot be used as a value for an 'enum' constant, if you
+ want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+
+/* 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__) \
# if ! (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER))
# define alignof _Alignof
# endif
-# define __alignof_is_defined 1
-# if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
-# if defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)
-# define _Alignas(a) alignas (a)
-# elif (!defined __attribute__ \
- && ((defined __APPLE__ && defined __MACH__ \
- ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
- : __GNUC__ && !defined __ibmxl__) \
- || (4 <= __clang_major__) \
- || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
- || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__))
-# define _Alignas(a) __attribute__ ((__aligned__ (a)))
-# elif 1300 <= _MSC_VER
-# define _Alignas(a) __declspec (align (a))
-# endif
-# endif
-# if ((defined _Alignas \
- && !(defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER))) \
- || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
-# define alignas _Alignas
-# endif
-# if (defined alignas \
- || (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)))
-# define __alignas_is_defined 1
-# endif
-# if _GL_STDALIGN_NEEDS_STDDEF
-# include <stddef.h>
+
+/* alignas (A), also known as _Alignas (A), aligns a variable or type
+ to the alignment A, where A is an integer constant expression. For
+ example:
+
+ int alignas (8) foo;
+ struct s { int a; int alignas (8) bar; };
+
+ aligns the address of FOO and the offset of BAR to be multiples of 8.
+
+ A should be a power of two that is at least the type's alignment
+ and at most the implementation's alignment limit. This limit is
+ 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
+ to MSVC through at least version 10.0, A should be an integer
+ constant, as MSVC does not support expressions such as 1 << 3.
+ To be portable to Sun C 5.11, do not align auto variables to
+ anything stricter than their default alignment.
+
+ The following C23 requirements are not supported here:
+
+ - If A is zero, alignas has no effect.
+ - alignas can be used multiple times; the strictest one wins.
+ - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
+
+ */
+# if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
+# if defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)
+# define _Alignas(a) alignas (a)
+# elif (!defined __attribute__ \
+ && ((defined __APPLE__ && defined __MACH__ \
+ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ : __GNUC__ && !defined __ibmxl__) \
+ || (4 <= __clang_major__) \
+ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__))
+# define _Alignas(a) __attribute__ ((__aligned__ (a)))
+# elif 1300 <= _MSC_VER
+# define _Alignas(a) __declspec (align (a))
# endif
-# endif /* _GL_STDALIGN_H */
+# endif
+# if ((defined _Alignas \
+ && !(defined __cplusplus \
+ && (201103 <= __cplusplus || defined _MSC_VER))) \
+ || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
+# define alignas _Alignas
+# endif
+# if _GL_STDALIGN_NEEDS_STDDEF
+# include <stddef.h>
+# endif
# endif
#endif])
])
+
+AC_DEFUN([gl_STDALIGN_H],
+[
+ AC_REQUIRE([gl_ALIGNASOF])
+ GL_GENERATE_STDALIGN_H=false
+ AS_IF([test "$gl_cv_header_working_stdalign_h" = no],
+ [GL_GENERATE_STDALIGN_H=true])
+
+ AC_CHECK_HEADERS_ONCE([stdalign.h])
+])
m4/alignalloc.m4
Depends-on:
+alignasof
assert-h
extensions
extern-inline
idx
posix_memalign
-stdalign
stdckdint
stdint
--- /dev/null
+Description:
+alignas and alignof that are like C23 and C++11.
+
+Files:
+m4/stdalign.m4
+
+configure.ac:
+gl_ALIGNASOF
+
+Makefile.am:
+
+Include:
+
+License:
+LGPLv2+
+
+Maintainer:
+all
--- /dev/null
+Files:
+tests/test-stdalign.c
+tests/macros.h
+
+Depends-on:
+assert-h
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-stdalign
+check_PROGRAMS += test-stdalign
lib/alignof.h
Depends-on:
-stdalign
+alignasof
configure.ac:
m4/argp.m4
Depends-on:
+alignasof
alloca
basename-lgpl
extern-inline
extensions
vsnprintf
sleep
-stdalign
stdbool
stdio
strerror
m4/md4.m4
Depends-on:
+alignasof
byteswap
-stdalign
stdint
configure.ac:
m4/md5.m4
Depends-on:
+alignasof
byteswap
c99
extern-inline
-stdalign
stdint
configure.ac:
m4/sha1.m4
Depends-on:
+alignasof
byteswap
c99
extern-inline
-stdalign
stdint
configure.ac:
m4/sha256.m4
Depends-on:
+alignasof
byteswap
c99
extern-inline
-stdalign
stdint
configure.ac:
m4/sha512.m4
Depends-on:
+alignasof
byteswap
c99
extern-inline
-stdalign
stdint
u64
m4/sm3.m4
Depends-on:
+alignasof
byteswap
c99
extern-inline
-stdalign
stdint
configure.ac:
m4/fts.m4
Depends-on:
+alignasof
attribute
c99
closedir
opendir
opendirat
readdir
-stdalign
stdbool
stddef
m4/rawmemchr.m4
Depends-on:
+alignasof
assert-h
extensions
-stdalign
stdint
string
m4/setenv.m4
Depends-on:
+alignasof
assert-h
c99
double-slash-root
libc-config
pathmax
ssize_t
-stdalign
stdbool
stddef
stdckdint
Description:
alignas and alignof that are like C23 and C++11.
+Notice:
+The stdalign module is deprecated.
+New code should use the alignasof module, and not include <stdalign.h>.
+
Files:
lib/stdalign.in.h
m4/stdalign.m4
Depends-on:
+alignasof
gen-header
configure.ac:
LGPLv2+
Maintainer:
-Paul Eggert
+all
Files:
-tests/test-stdalign.c
-tests/macros.h
Depends-on:
-assert-h
-stdint
+alignasof-tests
stdalign-c++-tests
configure.ac:
Makefile.am:
-TESTS += test-stdalign
-check_PROGRAMS += test-stdalign
tests/test-stddef.c
Depends-on:
+alignasof
assert-h
-stdalign
stddef-c++-tests
configure.ac:
m4/sockpfaf.m4
Depends-on:
+alignasf
errno
extern-inline
gen-header
snippet/warn-on-use
socklen
ssize_t
-stdalign
sys_uio
configure.ac: