On 7/14/21 7:36 AM, Eli Zaretskii wrote: > You are saying that there's some fundamental difference between > > INT_MAX + 1 > > and > > (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX) Yes there's a fundamental difference. INT_MAX + 1 has a signed integer overflow that violates the C standard. Obviously GCC should diagnose it. The other expression conforms to the C standard and there is no error or overflow there. There's no reason -Woverflow should provoke a diagnostic for it. > Or between an expression 'x = FOO' and 'mask = BAR'? I don't know what x, mask, FOO, and BAR refer to. > the warning was valid, as the > assignment loses significant bits. I originally wrote it as "uintptr_t mask = VALMASK;" because I would rather avoid C casts when possible (they're too powerful and allow too many bugs to go undetected). I dislike the workaround that I installed because of (a) its unnecessary cast and (b) the lack of clarity that it's intended that we want to discard any bits outside UINTPTR_MAX ((b) was a problem with my original code too). To try to fix both (a) and (b) I installed the attached further patch. It is a bit more verbose than what C requires, but the verbosity should help explain that masking with UINTPTR_MAX is intended, and the verbosity shouldn't hurt efficiency.