Define unconstify() and unvolatize() for C++.
authorThomas Munro <[email protected]>
Mon, 11 Dec 2023 20:31:44 +0000 (09:31 +1300)
committerThomas Munro <[email protected]>
Mon, 11 Dec 2023 20:46:46 +0000 (09:46 +1300)
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 <[email protected]>
Discussion: https://postgr.es/m/CA%2BhUKGK3OXFjkOyZiw-DgL2bUqk9by1uGuCnViJX786W%2BfyDSw%40mail.gmail.com

src/include/c.h

index 82f8e9d4c7b88251cef27a42863d15d1ab0c7ee5..4b0f5138d83900d180bfa5820c776a7926ec7ee1 100644 (file)
@@ -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"), \