https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80745
Eric Gallager <egallager at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2017-08-01 CC| |egallager at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #0) > In four declarations below, the initializer expression is truncated when > assigned to unsigned char. Yet only the first two initializers are > diagnosed (the warning message could be more helpful but that's the subject > of bug 80731). The same problem affects other unsigned integers besides > unsigned char. > > All four initializers should be diagnosed. > > $ cat t.c && gcc -S -Wall -Wextra -Wpedantic -Woverflow t.c > #include <limits.h> > > unsigned char uc1 = UCHAR_MAX + 1U; > unsigned char uc2 = USHRT_MAX + 1U; > unsigned char uc3 = UINT_MAX + 1U; > unsigned char uc4 = ULONG_MAX + 1LU; > > t.c:3:21: warning: large integer implicitly truncated to unsigned type > [-Woverflow] > unsigned char uc1 = UCHAR_MAX + 1U; > ^~~~~~~~~ > t.c:4:21: warning: large integer implicitly truncated to unsigned type > [-Woverflow] > unsigned char uc2 = USHRT_MAX + 1U; > ^~~~~~~~~ Confirmed, although since you've already improved -Woverflow a little since then, the warning now reads: $ /usr/local/bin/gcc -c -S -Wall -Wextra -Wpedantic -Woverflow 80745.c 80745.c:3:21: warning: conversion from ‘unsigned int’ to ‘unsigned char’ changes value from ‘256’ to ‘0’ [-Woverflow] unsigned char uc1 = UCHAR_MAX + 1U; ^~~~~~~~~ 80745.c:4:21: warning: conversion from ‘unsigned int’ to ‘unsigned char’ changes value from ‘65536’ to ‘0’ [-Woverflow] unsigned char uc2 = USHRT_MAX + 1U; ^~~~~~~~~ $ (In reply to Martin Sebor from comment #1) > The reason for the missing warning is that in the latter two cases the > initializer expression itself wraps around to zero, which isn't diagnosed or > detected, and the initialization then isn't diagnosed. > > It seems that unsigned integer wrapping should be diagnosed independently of > signed integer overflow (e.g., under -Wtruncation or something like that), > and consistently for any kind of unsigned truncation or wrapping. > I dunno, the fact that unsigned integers wrap is pretty commonly (ab)used on purpose in lots of code I've seen. I'd be wary about a warning about unsigned integer wrapping triggering lots of false positives. Still, at least in this specific testcase in this bug, warning in the additional cases you recommend seems reasonable.