Building a testdir on AIX 7.2 with xlc, I get this compilation error:

xlc -qthreaded -qtls -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. 
-I../../gltests -I..  -DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I. 
-I../../gltests -I.. -I../../gltests/.. -I../gllib -I../../gltests/../gllib 
-I/home/haible/prefix32/include -D_THREAD_SAFE  -g -c -o test-alignasof.o 
../../gltests/test-alignasof.c
"../../gltests/test-alignasof.c", line 51.1: 1506-275 (S) Unexpected text 
integer constant encountered.
"../../gltests/test-alignasof.c", line 51.1: 1506-276 (S) Syntax error: 
possible missing '{'?
"../../gltests/test-alignasof.c", line 52.1: 1506-273 (E) Missing type in 
declaration of short_helper.
"../../gltests/test-alignasof.c", line 52.1: 1506-046 (S) Syntax error.
"../../gltests/test-alignasof.c", line 52.1: 1506-122 (S) Expecting pointer to 
struct or union.
"../../gltests/test-alignasof.c", line 52.1: 1506-275 (S) Unexpected text 
integer constant encountered.
"../../gltests/test-alignasof.c", line 52.1: 1506-343 (S) Redeclaration of 
_Alignas differs from previous declaration on line 51 of 
"../../gltests/test-alignasof.c".
"../../gltests/test-alignasof.c", line 52.1: 1506-050 (I) Return type "short" 
in redeclaration is not compatible with the previous return type "char".
"../../gltests/test-alignasof.c", line 52.1: 1506-276 (S) Syntax error: 
possible missing '{'?
"../../gltests/test-alignasof.c", line 53.1: 1506-273 (E) Missing type in 
declaration of int_helper.
"../../gltests/test-alignasof.c", line 53.1: 1506-046 (S) Syntax error.
"../../gltests/test-alignasof.c", line 53.1: 1506-122 (S) Expecting pointer to 
struct or union.
"../../gltests/test-alignasof.c", line 53.1: 1506-275 (S) Unexpected text 
integer constant encountered.
"../../gltests/test-alignasof.c", line 53.1: 1506-276 (S) Syntax error: 
possible missing '{'?
"../../gltests/test-alignasof.c", line 54.1: 1506-273 (E) Missing type in 
declaration of long_helper.
"../../gltests/test-alignasof.c", line 54.1: 1506-046 (S) Syntax error.
"../../gltests/test-alignasof.c", line 54.1: 1506-122 (S) Expecting pointer to 
struct or union.
"../../gltests/test-alignasof.c", line 54.1: 1506-275 (S) Unexpected text 
integer constant encountered.
"../../gltests/test-alignasof.c", line 54.1: 1506-276 (S) Syntax error: 
possible missing '{'?
"../../gltests/test-alignasof.c", line 56.1: 1506-273 (E) Missing type in 
declaration of int64_t_helper.
"../../gltests/test-alignasof.c", line 56.1: 1506-046 (S) Syntax error.
"../../gltests/test-alignasof.c", line 56.1: 1506-122 (S) Expecting pointer to 
struct or union.
"../../gltests/test-alignasof.c", line 56.1: 1506-275 (S) Unexpected text 
integer constant encountered.
"../../gltests/test-alignasof.c", line 56.1: 1506-276 (S) Syntax error: 
possible missing '{'?
"../../gltests/test-alignasof.c", line 58.1: 1506-273 (E) Missing type in 
declaration of float_helper.
"../../gltests/test-alignasof.c", line 58.1: 1506-046 (S) Syntax error.
"../../gltests/test-alignasof.c", line 58.1: 1506-122 (S) Expecting pointer to 
struct or union.
Makefile:24036: recipe for target 'test-alignasof.o' failed

The cause is that the compiler does not have an _Alignas built-in, nor is
there an _Alignas macro. config.h includes <stdalign.h> (which happens to
be /usr/include/stdalign.h), but this header file basically only defines

  #define alignas _Alignas
  #define alignof _Alignof

Since _Alignas is a normal identifier at this point, the syntax errors are
normal.

It is wrong to assume that <stdalign.h> will define _Alignas:
  - ISO C 11 specifies that <stdalign.h> defines alignas, alignof,
    __alignas_is_defined, __alignof_is_defined, and nothing else.
  - GCC's and clang's private <stdalign.h> do the same: They don't define
    _Alignas either.

So, the fix is to define _Alignas also when HAVE_STDALIGN_H is 1.
The definition with __attribute__((aligned(n))) is fine for xlc, per the
documentation at
https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=data-using-alignment-modifiers


2023-04-10  Bruno Haible  <br...@clisp.org>

        alignasof: Ensure a correct _Alignas (regression 2023-01-15).
        * m4/stdalign.m4 (gl_ALIGNASOF): Define _Alignas also when <stdalign.h>
        exists.

diff --git a/m4/stdalign.m4 b/m4/stdalign.m4
index f49cf8ec16..1a236d66d2 100644
--- a/m4/stdalign.m4
+++ b/m4/stdalign.m4
@@ -151,22 +151,22 @@ 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)
-#   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
+# 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 !HAVE_STDALIGN_H
 #  if ((defined _Alignas \
         && !(defined __cplusplus \
              && (201103 <= __cplusplus || defined _MSC_VER))) \




Reply via email to