From e4ced93b2c35db91cb28f564103a7238efd72b43 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Thu, 17 Jul 2025 15:49:03 +1200 Subject: [PATCH v1] Detect elog(ERROR) can't return in MSVC when using C11 --- src/backend/backup/basebackup_target.c | 2 +- src/include/utils/elog.h | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/backend/backup/basebackup_target.c b/src/backend/backup/basebackup_target.c index 84b1309d3bd..0b48521f104 100644 --- a/src/backend/backup/basebackup_target.c +++ b/src/backend/backup/basebackup_target.c @@ -146,7 +146,7 @@ BaseBackupGetTargetHandle(char *target, char *target_detail) errmsg("unrecognized target: \"%s\"", target))); /* keep compiler quiet */ - return NULL; + //return NULL; } /* diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 675f4f5f469..c93ba82ecf8 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -137,7 +137,21 @@ struct Node; * prevents gcc from making the unreachability deduction at optlevel -O0. *---------- */ -#ifdef HAVE__BUILTIN_CONSTANT_P + +#if defined(_MSC_VER) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 +#define pg_builtin_constant(x) \ + _Generic((1 ? ((void*)((x)*(uintptr_t)0)) : &(int){1}), int*: 1, void*: 0) +#define ereport_domain(elevel, domain, ...) \ + do { \ + pg_prevent_errno_in_scope(); \ + if (pg_builtin_constant(elevel) && (elevel) >= ERROR ? \ + errstart_cold(elevel, domain) : \ + errstart(elevel, domain)) \ + __VA_ARGS__, errfinish(__FILE__, __LINE__, __func__); \ + if (pg_builtin_constant(elevel) && (elevel) >= ERROR) \ + pg_unreachable(); \ + } while(0) +#elif defined(HAVE__BUILTIN_CONSTANT_P) #define ereport_domain(elevel, domain, ...) \ do { \ pg_prevent_errno_in_scope(); \ -- 2.40.1.windows.1