From 39055cb4ccd5b521ceb802b6a8194de912a422cc Mon Sep 17 00:00:00 2001 From: John Naylor Date: Mon, 31 Jul 2023 13:34:29 +0700 Subject: [PATCH] Bring some MSVC asserts in line with other platforms MSVC's _BitScan* functions return a boolean indicating whether any bits were set in the input, and we were previously asserting that they returned true, per our API. This is correct. However, other platforms simply assert that the input is non-zero, so do that to be more consistent. Noted while investigating a hypothesis from Ranier Vilela about undefined behavior, but this is not his proposed patch. Discussion: https://www.postgresql.org/message-id/CAEudQAoDhUZyKGJ1vbMGcgVUOcsixe-%3DjcVaDWarqkUg163D2w%40mail.gmail.com --- src/include/port/pg_bitutils.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/include/port/pg_bitutils.h b/src/include/port/pg_bitutils.h index 21a4fa03410..4f1a13dba93 100644 --- a/src/include/port/pg_bitutils.h +++ b/src/include/port/pg_bitutils.h @@ -48,8 +48,9 @@ pg_leftmost_one_pos32(uint32 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanReverse(&result, word); - Assert(non_zero); return (int) result; #else int shift = 32 - 8; @@ -85,8 +86,9 @@ pg_leftmost_one_pos64(uint64 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanReverse64(&result, word); - Assert(non_zero); return (int) result; #else int shift = 64 - 8; @@ -116,8 +118,9 @@ pg_rightmost_one_pos32(uint32 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanForward(&result, word); - Assert(non_zero); return (int) result; #else int result = 0; @@ -156,8 +159,9 @@ pg_rightmost_one_pos64(uint64 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanForward64(&result, word); - Assert(non_zero); return (int) result; #else int result = 0;