Portable StaticAssertExpr

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2026-02-23T07:00:35Z
Lists: pgsql-hackers

Attachments

The current implementation of StaticAssertExpr() uses the GCC extension 
statement expressions.

In this patch, I'm proposing a different implementation that doesn't 
require nonstandard extensions.  The trick is to put the static_assert() 
into a struct definition.  This appears to be a common way to do this. 
(See [0] for references.)

Unfortunately, MSVC before version 19.33 fails to compile this, but 
since it was fixed later, I think this was just a bug that was later 
fixed.  I'm keeping the old workaround code as a fallback for this case, 
but eventually we can remove that.

For C++, the struct trick doesn't work, but I found a different 
implementation that works on all supported compilers, using lambda 
expressions.  I found this at [1].


[0]: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3715.pdf
[1]: https://stackoverflow.com/questions/31311748

Commits

  1. Portable StaticAssertExpr