From: | Peter Eisentraut <peter(at)eisentraut(dot)org> |
---|---|
To: | David Rowley <dgrowleyml(at)gmail(dot)com> |
Cc: | PostgreSQL Developers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Fixing MSVC's inability to detect elog(ERROR) does not return |
Date: | 2025-09-03 11:31:37 |
Message-ID: | a92097fa-a7e3-406b-a160-4988e690c6ca@eisentraut.org |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 02.09.25 04:57, David Rowley wrote:
> On Thu, 24 Jul 2025 at 23:03, Peter Eisentraut <peter(at)eisentraut(dot)org> wrote:
>> Please review my patch at
>>
>> https://www.postgresql.org/message-id/ccb273c9-7544-4748-8638-30feba212e6e@eisentraut.org
>> https://commitfest.postgresql.org/patch/5934/
>
> Now that we're building with C11, here's a rebased patch with the new
> pg_builtin_constant() macro.
+#if defined(HAVE__BUILTIN_CONSTANT_P)
+#define pg_builtin_constant(x) __builtin_constant_p(x)
+#define HAVE_PG_BUILTIN_CONSTANT
+#elif defined(_MSC_VER) && defined(__STDC_VERSION__) &&
__STDC_VERSION__ >= 201112L
+#define pg_builtin_constant(x) \
+ _Generic((1 ? ((void *) ((x) * (uintptr_t) 0)) : &(int) {1}), int *:
1, void *: 0)
+#define HAVE_PG_BUILTIN_CONSTANT
+#endif
The variant using _Generic is not a full replacement for
__builtin_constant_p(), because it only detects integer constant
expressions. So for example, it wouldn't work in the use in
src/include/utils/memutils.h, which checks for constant strings. So I
think we need to be careful here to maintain the difference.
I think what we could do is make a separate macro for detecting integer
constant expressions (like ICE_P() in the reddit thread) and define that
to __builtin_constant_p if available, else using _Generic. (We can't
use _Generic on all platforms yet, that's a separate undertaking, but I
think all platforms support either __builtin_constant_p or _Generic.)
And then use that one for ereport.
It would also be nice to provide a comment with some explanation and/or
a link and credit for the _Generic expression.
Btw., I think we should stick to the *_p() naming (for "predicate", I
think) for compiler-intrinsic-affiliated functions/macros that report
boolean results.
The __STDC_VERSION__ comparison can be dropped, since that is the
minimum now required. (But you need to keep defined(__STDC_VERSION__),
since this won't work in C++.)
From | Date | Subject | |
---|---|---|---|
Next Message | Andrew Dunstan | 2025-09-03 11:33:36 | Re: Solaris compiler status |
Previous Message | Chiranmoy.Bhattacharya@fujitsu.com | 2025-09-03 11:11:24 | Re: [PATCH] Hex-coding optimizations using SVE on ARM. |