On Fri, Oct 09, 2020 at 11:28:25AM +0200, Christoph Berg wrote: > pg-cron on powerpc/ppc64/ppc64el is raising this warning inside the > ppc atomics: > > gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement > -Werror=vla -Wendif-labels -Wmissing-format-attribute > -Wimplicit-fallthrough=3 -Wformat-security -fno-strict-aliasing -fwrapv > -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation > -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -g -O2 > -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat > -Werror=format-security -fPIC -std=c99 -Wall -Wextra -Werror > -Wno-unknown-warning-option -Wno-unused-parameter -Wno-maybe-uninitialized > -Wno-implicit-fallthrough -Iinclude -I/usr/include/postgresql -I. -I./ > -I/usr/include/postgresql/13/server -I/usr/include/postgresql/internal > -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2 -c -o > src/job_metadata.o src/job_metadata.c > In file included from /usr/include/postgresql/13/server/port/atomics.h:74, > from /usr/include/postgresql/13/server/utils/dsa.h:17, > from /usr/include/postgresql/13/server/nodes/tidbitmap.h:26, > from /usr/include/postgresql/13/server/access/genam.h:19, > from src/job_metadata.c:21: > /usr/include/postgresql/13/server/port/atomics/arch-ppc.h: In function > ‘pg_atomic_compare_exchange_u32_impl’: > /usr/include/postgresql/13/server/port/atomics/arch-ppc.h:97:42: error: > comparison of integer expressions of different signedness: ‘uint32’ {aka > ‘unsigned int’} and ‘int’ [-Werror=sign-compare] > 97 | *expected <= PG_INT16_MAX && *expected >= PG_INT16_MIN) > | ^~ > src/job_metadata.c: At top level: > cc1: note: unrecognized command-line option ‘-Wno-unknown-warning-option’ may > have been intended to silence earlier diagnostics > cc1: all warnings being treated as errors > > Looking at the pg_atomic_compare_exchange_u32_impl, this looks like a > genuine problem: > > static inline bool > pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, > uint32 *expected, uint32 newval) > ... > if (__builtin_constant_p(*expected) && > *expected <= PG_INT16_MAX && *expected >= PG_INT16_MIN) > > If *expected is an unsigned integer, comparing it to PG_INT16_MIN > which is a negative number doesn't make sense. > > src/include/c.h:#define PG_INT16_MIN (-0x7FFF-1)
Agreed. I'll probably fix it like this: --- a/src/include/port/atomics/arch-ppc.h +++ b/src/include/port/atomics/arch-ppc.h @@ -96,3 +96,4 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, if (__builtin_constant_p(*expected) && - *expected <= PG_INT16_MAX && *expected >= PG_INT16_MIN) + (int32) *expected <= PG_INT16_MAX && + (int32) *expected >= PG_INT16_MIN) __asm__ __volatile__( @@ -185,3 +186,4 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, if (__builtin_constant_p(*expected) && - *expected <= PG_INT16_MAX && *expected >= PG_INT16_MIN) + (int64) *expected <= PG_INT16_MAX && + (int64) *expected >= PG_INT16_MIN) __asm__ __volatile__(