Thread
Commits
-
Portable StaticAssertExpr
- aa7c86852343 19 (unreleased) landed
-
Portable StaticAssertExpr
Peter Eisentraut <peter@eisentraut.org> — 2026-02-23T07:00:35Z
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
-
Re: Portable StaticAssertExpr
Jelte Fennema-Nio <postgres@jeltef.nl> — 2026-02-27T10:48:08Z
On Mon, 23 Feb 2026 at 08:00, Peter Eisentraut <peter@eisentraut.org> wrote: > In this patch, I'm proposing a different implementation that doesn't > require nonstandard extensions. I tried this out in one of my WIP patches for for better C++ and it works correctly indeed. Small nit, instead of nesting ifdefs. I think this looks a bit nicer: # ifdef __cplusplus ... #elif !defined(_MSC_VER) || _MSC_VER >= 1933 ... #else ... #endif
-
Re: Portable StaticAssertExpr
Peter Eisentraut <peter@eisentraut.org> — 2026-03-06T08:37:50Z
On 27.02.26 11:48, Jelte Fennema-Nio wrote: > On Mon, 23 Feb 2026 at 08:00, Peter Eisentraut <peter@eisentraut.org> wrote: >> In this patch, I'm proposing a different implementation that doesn't >> require nonstandard extensions. > > I tried this out in one of my WIP patches for for better C++ and it > works correctly indeed. Thanks, I have committed this. > Small nit, instead of nesting ifdefs. I think this looks a bit nicer: > > # ifdef __cplusplus > ... > #elif !defined(_MSC_VER) || _MSC_VER >= 1933 > ... > #else > ... > #endif I didn't change this, because I think it is better to keep the C code first and then the C++ as an alternate variant last (which is also existing style, at least in some parts), even if this requires some additional logical negations.