On Wed, Jan 21, 2026 at 2:43 AM Peter Eisentraut <[email protected]> wrote:
>
> tests: Add a test C++ extension module
>
> While we already test that our headers are valid C++ using
> headerscheck, it turns out that the macros we define might still
> expand to invalid C++ code. This adds a minimal test extension that
> is compiled using C++ to test that it's actually possible to build and
> run extensions written in C++. Future commits will improve C++
> compatibility of some of our macros and add usage of them to this
> extension make sure that they don't regress in the future.
>
> The test module is for the moment disabled when using MSVC. In
> particular, the use of designated initializers in PG_MODULE_MAGIC
> would require C++20, for which we are currently not set up. (GCC and
> Clang support it as extensions.) It is planned to fix this.
>
> Author: Jelte Fennema-Nio <[email protected]>
> Discussion:
> https://www.postgresql.org/message-id/flat/cageczqr21onnkizo_1rlwo0-16kg1jbxnvq-wymyw0-_1cu...@mail.gmail.com
>
> Branch
> ------
> master
>
> Details
> -------
> https://git.postgresql.org/pg/commitdiff/476b35d4e311a3d77a550280d93393e518908b27
>
> Modified Files
> --------------
> configure | 8 +++++
> configure.ac | 7 ++++
> src/Makefile.global.in | 2 ++
> src/makefiles/meson.build | 2 ++
> src/test/modules/Makefile | 6 ++++
> src/test/modules/meson.build | 1 +
> src/test/modules/test_cplusplusext/.gitignore | 3 ++
> src/test/modules/test_cplusplusext/Makefile | 26 ++++++++++++++
> src/test/modules/test_cplusplusext/README | 10 ++++++
> .../expected/test_cplusplusext.out | 7 ++++
> src/test/modules/test_cplusplusext/meson.build | 42 ++++++++++++++++++++++
> .../test_cplusplusext/sql/test_cplusplusext.sql | 3 ++
> .../test_cplusplusext/test_cplusplusext--1.0.sql | 8 +++++
> .../test_cplusplusext/test_cplusplusext.control | 4 +++
> .../test_cplusplusext/test_cplusplusext.cpp | 37 +++++++++++++++++++
> 15 files changed, 166 insertions(+)
>
Hi.
'make check-world' is suddenly failing for me, apparently caused by
this new test.
FYI - I am building in a 'Linux CentOS7-x64 ' environment, which I
know has reached end-of-life, but even so, everything was fine before
this test appeared.
======
Kind Regards,
Peter Smith.
Fujitsu Australia
~~~
install.log output is below:
make[4]: Entering directory
`/home/postgres/oss_postgres_misc/src/test/modules/test_cplusplusext'
for extra in src/test/modules/test_cplusplusext; do make -C
'../../../..'/$extra
DESTDIR='/home/postgres/oss_postgres_misc'/tmp_install install ||
exit; done
make[5]: Entering directory
`/home/postgres/oss_postgres_misc/src/test/modules/test_cplusplusext'
g++ -Wall -Wpointer-arith -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv -g -O2 -fPIC
-fvisibility=hidden -fvisibility-inlines-hidden -I. -I.
-I../../../../src/include -D_GNU_SOURCE -c -o test_cplusplusext.o
test_cplusplusext.cpp
In file included from test_cplusplusext.cpp:19:0:
../../../../src/include/fmgr.h:510:1: warning: identifier
‘static_assert’ is a keyword in C++11 [-Wc++0x-compat]
StaticAssertDecl(sizeof(FMGR_ABI_EXTRA) <= sizeof(((Pg_abi_values *)
0)->abi_extra),
^
In file included from ../../../../src/include/c.h:57:0,
from ../../../../src/include/postgres.h:48,
from test_cplusplusext.cpp:18:
../../../../src/include/pg_config.h:552:25: error: expected identifier
before numeric constant
#define MAXIMUM_ALIGNOF 8
^
../../../../src/include/c.h:1113:10: note: in expansion of macro
‘MAXIMUM_ALIGNOF’
alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
^
../../../../src/include/pg_config.h:552:25: error: expected ‘,’ or
‘...’ before numeric constant
#define MAXIMUM_ALIGNOF 8
^
../../../../src/include/c.h:1113:10: note: in expansion of macro
‘MAXIMUM_ALIGNOF’
alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
^
In file included from ../../../../src/include/postgres.h:48:0,
from test_cplusplusext.cpp:18:
../../../../src/include/c.h:1113:25: error: ISO C++ forbids
declaration of ‘alignas’ with no type [-fpermissive]
alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
^
../../../../src/include/c.h:1113:25: error: expected ‘;’ at end of
member declaration
In file included from ../../../../src/include/c.h:58:0,
from ../../../../src/include/postgres.h:48,
from test_cplusplusext.cpp:18:
../../../../src/include/pg_config_manual.h:223:27: error: expected
identifier before numeric constant
#define PG_IO_ALIGN_SIZE 4096
^
../../../../src/include/c.h:1113:25: error: expected ‘;’ at end of
member declaration
In file included from ../../../../src/include/c.h:58:0,
from ../../../../src/include/postgres.h:48,
from test_cplusplusext.cpp:18:
../../../../src/include/pg_config_manual.h:223:27: error: expected
identifier before numeric constant
#define PG_IO_ALIGN_SIZE 4096
^
../../../../src/include/c.h:1126:10: note: in expansion of macro
‘PG_IO_ALIGN_SIZE’
alignas(PG_IO_ALIGN_SIZE) char data[BLCKSZ];
^
In file included from ../../../../src/include/postgres.h:48:0,
from test_cplusplusext.cpp:18:
../../../../src/include/c.h:1126:26: error: ISO C++ forbids
declaration of ‘alignas’ with no type [-fpermissive]
alignas(PG_IO_ALIGN_SIZE) char data[BLCKSZ];
^
../../../../src/include/c.h:1126:26: error: expected ‘;’ at end of
member declaration
In file included from ../../../../src/include/c.h:58:0,
from ../../../../src/include/postgres.h:48,
from test_cplusplusext.cpp:18:
../../../../src/include/pg_config_manual.h:223:27: error: expected
identifier before numeric constant
#define PG_IO_ALIGN_SIZE 4096
^
../../../../src/include/c.h:1132:10: note: in expansion of macro
‘PG_IO_ALIGN_SIZE’
alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ];
^
../../../../src/include/pg_config_manual.h:223:27: error: expected ‘,’
or ‘...’ before numeric constant
#define PG_IO_ALIGN_SIZE 4096
^
../../../../src/include/c.h:1132:10: note: in expansion of macro
‘PG_IO_ALIGN_SIZE’
alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ];
^
In file included from ../../../../src/include/postgres.h:48:0,
from test_cplusplusext.cpp:18:
../../../../src/include/c.h:1132:26: error: ISO C++ forbids
declaration of ‘alignas’ with no type [-fpermissive]
alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ];
^
../../../../src/include/c.h:1132:26: error: expected ‘;’ at end of
member declaration
../../../../src/include/c.h:943:15: error: expected constructor,
destructor, or type conversion before ‘(’ token
static_assert(condition, errmessage)
^
../../../../src/include/fmgr.h:510:1: note: in expansion of macro
‘StaticAssertDecl’
StaticAssertDecl(sizeof(FMGR_ABI_EXTRA) <= sizeof(((Pg_abi_values *)
0)->abi_extra),
^
make[5]: *** [test_cplusplusext.o] Error 1
make[5]: Leaving directory
`/home/postgres/oss_postgres_misc/src/test/modules/test_cplusplusext'
make[4]: *** [checkprep] Error 2
make[4]: Leaving directory
`/home/postgres/oss_postgres_misc/src/test/modules/test_cplusplusext'
make[3]: *** [checkprep-test_cplusplusext-recurse] Error 2