https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119011
--- Comment #13 from Alejandro Colomar <alx at kernel dot org> ---
(In reply to Paul Eggert from comment #12)
> Plus, i + 1 == 0 does not necessarily work if time_t is 'unsigned short'
> (yes that'd be really weird for time_t, but ISO C and POSIX allow it and
> I try to write to the standards, and the problem has come up with other
> system types).
==-1 wouldn't work either for unsigned short. That's why we mentioned the
requirement that the variable should be of a type with rank no less than int.
With unsigned short, you first promote it to an int, since int can hold any
value of unsigned short, and it holds a USHRT_MAX, which is a small-ish
positive number, while -1 keeps being negative.
alx@debian:~/tmp$ cat ushrt.c
int
main(void)
{
unsigned short uh = -1;
if (uh == -1)
return 0;
return 1;
}
alx@debian:~/tmp$ gcc -Wall -Wextra ushrt.c
ushrt.c: In function ‘main’:
ushrt.c:6:16: warning: comparison is always false due to limited range of data
type [-Wtype-limits]
6 | if (uh == -1)
| ^~
alx@debian:~/tmp$ ./a.out
alx@debian:~/tmp$ echo $?
1
Still, both working on the same cases, ==-1 is going to cause less mental
surprises.