Disable extended alignment uses on older g++ master github/master
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 26 Jan 2026 09:23:14 +0000 (10:23 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Mon, 26 Jan 2026 09:23:14 +0000 (10:23 +0100)
Fix for commit a9bdb63bba8.  The previous plan of redefining alignas
didn't work, because it interfered with other C++ header files (e.g.,
LLVM).  So now the new workaround is to just disable the affected
typedefs under the affected compilers.  These are not typically used
in extensions anyway.

Discussion: https://www.postgresql.org/message-id/3119480.1769189606%40sss.pgh.pa.us

src/include/c.h

index 17afaef9a6a1b9943a21ece685e53c13cb74cbc3..48e4087c09cfcfbe254d30ecd9713a21ab80df8d 100644 (file)
  */
 #endif
 
  */
 #endif
 
-/*
- * alignas is buggy in g++ < 9, but the more or less equivalent attribute
- * works.
- *
- * <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89357>
- */
-#if defined(__cplusplus) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 9
-#define alignas(a) __attribute__((aligned(a)))
-#endif
-
 /*
  * Use "pg_attribute_always_inline" in place of "inline" for functions that
  * we wish to force inlining of, even when the compiler's heuristics would
 /*
  * Use "pg_attribute_always_inline" in place of "inline" for functions that
  * we wish to force inlining of, even when the compiler's heuristics would
@@ -1123,6 +1113,14 @@ typedef struct PGAlignedBlock
    alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
 } PGAlignedBlock;
 
    alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
 } PGAlignedBlock;
 
+/*
+ * alignas with extended alignments is buggy in g++ < 9.  As a simple
+ * workaround, we disable these definitions in that case.
+ *
+ * <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89357>
+ */
+#if !(defined(__cplusplus) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 9)
+
 /*
  * Use this to declare a field or local variable holding a page buffer, if that
  * page might be accessed as a page or passed to an SMgr I/O function.  If
 /*
  * Use this to declare a field or local variable holding a page buffer, if that
  * page might be accessed as a page or passed to an SMgr I/O function.  If
@@ -1142,6 +1140,8 @@ typedef struct PGAlignedXLogBlock
    alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ];
 } PGAlignedXLogBlock;
 
    alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ];
 } PGAlignedXLogBlock;
 
+#endif                         /* !(g++ < 9) */
+
 /* msb for char */
 #define HIGHBIT                    (0x80)
 #define IS_HIGHBIT_SET(ch)     ((unsigned char)(ch) & HIGHBIT)
 /* msb for char */
 #define HIGHBIT                    (0x80)
 #define IS_HIGHBIT_SET(ch)     ((unsigned char)(ch) & HIGHBIT)