https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101645
--- Comment #4 from Matthew Wilcox <matthew at wil dot cx> --- On second thoughts -Wsign-conversion is useless. Consider that it warns on this: unsigned long f(unsigned long x, int y) { return x + y; } Both gcc and clang emit a warning, which makes it useless. That code obviously does what the programmer intended. What would be useful is a warning which diagnoses code which behaves differently in infinite-precision arithmetic vs the C promotion rules. For example, unsigned long g(unsigned char v, int s) { return v << s; } By the C standard, v is promoted to int, shifted by s and then promoted to unsigned long. This is a fertile source of bugs as it's easy to overlook that v will not be promoted to unsigned long first. (by the way, this is another example where clang diagnoses with -Wsign-compare and gcc doesn't.) Another example plucked from real life: long long h(unsigned int x) { return x * 4096; } (slightly changed to demonstrate the problem on LP64; the original was from unsigned long to long long, and it is only a bug on ILP32)