[ this thread was referenced recently, bringing it back top-of-mind ] David Rowley <dgrowle...@gmail.com> writes: > On Thu, 13 Mar 2025 at 21:33, Peter Eisentraut <pe...@eisentraut.org> wrote: >> Is there a way to reshuffle those conditionals to make this actually do >> something useful on MSVC?
> I've just been experimenting with this and it seems the problem isn't > with pg_unreachable(), it's with the compiler not understanding that > the particular pg_unreachable() is always reached. > What's happening is down to the multi-eval protection code for elevel > in ereport_domain(). Because elevel is assigned to the variable > "elevel_" the compiler seems to lose its proof that the > pg_unreachable() is always reached. Adjusting that condition to use > the elevel parameter directly makes the warning disappear. Looking again at the code for ereport_domain(), I wondered if something like this would help MSVC see through it: #define ereport_domain(elevel, domain, ...) \ do { \ const int elevel_ = (elevel); \ + const bool is_error_ = (elevel_ >= ERROR); \ pg_prevent_errno_in_scope(); \ if (errstart(elevel_, domain)) \ __VA_ARGS__, errfinish(__FILE__, __LINE__, __func__); \ - if (elevel_ >= ERROR) \ + if (is_error_) \ pg_unreachable(); \ } while(0) This preserves single evaluation of the elevel parameter, and perhaps it'd move the needle on whether the compiler thinks is_error_ is a compile-time constant. I'm just guessing though, don't have this compiler to test with. regards, tom lane