summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro2023-12-11 20:31:44 +0000
committerThomas Munro2023-12-11 20:46:46 +0000
commitbaf7c93ed583949d837bc13f24a15a0efbcb1ae7 (patch)
treed91ee95cb325a3b6194fc681931a1b33bb0e653a /src
parent0a5c46a7a488f2f4260a90843bb9de6c584c7f4e (diff)
Define unconstify() and unvolatize() for C++.
These two macros wouldn't work if used in an inline function definition in a header seen by g++, because __builtin_types_compatible_p is only available in C. Redirect to standard C++ const_cast (which also adds/removes volatile despite its name). Per cpluspluscheck failure in a development branch. Suggested-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://postgr.es/m/CA%2BhUKGK3OXFjkOyZiw-DgL2bUqk9by1uGuCnViJX786W%2BfyDSw%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/include/c.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/include/c.h b/src/include/c.h
index 82f8e9d4c7b..4b0f5138d83 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1245,7 +1245,10 @@ typedef union PGAlignedXLogBlock
* Note that this only works in function scope, not for global variables (it'd
* be nice, but not trivial, to improve that).
*/
-#if defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P)
+#if defined(__cplusplus)
+#define unconstify(underlying_type, expr) const_cast<underlying_type>(expr)
+#define unvolatize(underlying_type, expr) const_cast<underlying_type>(expr)
+#elif defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P)
#define unconstify(underlying_type, expr) \
(StaticAssertExpr(__builtin_types_compatible_p(__typeof(expr), const underlying_type), \
"wrong cast"), \