From 21b162fb6bfb124758930442db8f47e1c666a59a Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Mon, 11 Dec 2023 22:54:31 +1300
Subject: [PATCH] Define unconstify() and unvolatize() for C++.

These two macros wouldn't work if used in a header seen by g++/clang++,
because __builtin_types_compatible_p is only available in C.  Redirect
to standard C++ const_cast in C++ code.

Suggested-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/CA%2BhUKGK3OXFjkOyZiw-DgL2bUqk9by1uGuCnViJX786W%2BfyDSw%40mail.gmail.com

diff --git a/src/include/c.h b/src/include/c.h
index 82f8e9d4c7..4b0f5138d8 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"), \
-- 
2.43.0

