The switch from long to int64 in commit
13b935cd521 was incomplete.
It was shifting the constant 1L, which is not always 64 bit. Fix by
using an explicit int64 constant.
MSVC warning:
../src/backend/utils/hash/dynahash.c(1767): warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
Also add the corresponding warning to the standard warning set on
MSVC, to help catch similar issues in the future.
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://www.postgresql.org/message-id/flat/
1142ad86-e475-41b3-aeee-
c6ad913064fa%40eisentraut.org
'/w24062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled [like -Wswitch]
'/w24102', # unreferenced label [like -Wunused-label]
+ # This one doesn't match a gcc warning, but it can help catch
+ # issues related to 4-byte long on Windows.
+ '/w24334', # 'operator': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
+
# Turn this into an error, to match other compilers (as of C99)
'/we4013', # 'function' undefined; assuming extern returning int' [like -Wimplicit-function-declaration]
]
next_pow2_int64(int64 num)
{
/* my_log2's internal range check is sufficient */
- return 1L << my_log2(num);
+ return INT64CONST(1) << my_log2(num);
}
/* calculate first power of 2 >= num, bounded to what will fit in an int */