Calling copyObject fails in C++ with an error like in most setups: error: use of undeclared identifier 'typeof'; did you mean 'typeid'
This is due to the C compiler supporting used to compile postgres supporting typeof, but that function actually not being present in the C++ compiler. This fixes that by using decltype instead of typeof when including the header in C++. Realized because of Thomas' not about how much of our headers should work in C++, and remembering I hit this specific problem myself. Another approach would be to force the value of HAVE_TYPEOF to 0 if __cplusplus.
From 7ce44917fe789e394193ff20e3b88b2e82f96c20 Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio <[email protected]> Date: Fri, 5 Dec 2025 15:37:59 +0100 Subject: [PATCH v1] Make copyObject work in C++ Calling copyObject fails in C++ with an error like in most setups: error: use of undeclared identifier 'typeof'; did you mean 'typeid' This is due to the C compiler supporting used to compile postgres supporting typeof, but that function actually not being present in the C++ compiler. This fixes that by using decltype instead of typeof when including the header in C++. --- src/include/nodes/nodes.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index fb3957e75e5..5a4fa8260f2 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -226,7 +226,9 @@ extern int16 *readAttrNumberCols(int numCols); extern void *copyObjectImpl(const void *from); /* cast result back to argument type, if supported by compiler */ -#ifdef HAVE_TYPEOF +#if defined(__cplusplus) +#define copyObject(obj) ((decltype(obj)) copyObjectImpl(obj)) +#elif defined(HAVE_TYPEOF) #define copyObject(obj) ((typeof(obj)) copyObjectImpl(obj)) #else #define copyObject(obj) copyObjectImpl(obj) base-commit: 4d936c3fff1ac8dead2cc240ba3da2ed6337257c -- 2.52.0
