https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93589
John Downing <jrdowning at yahoo dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jrdowning at yahoo dot com --- Comment #5 from John Downing <jrdowning at yahoo dot com> --- I'm not sure if this will be seen but here goes. Try compiling the following with -Wconversion: #include <iostream> #include <iomanip> #define CHAR_BIT 8 using std::cout; void print_byte_order_short( short ) { unsigned short i; short val = 0; for(i = 1; i < sizeof(short); ++i) { val |= (CHAR_BIT * static_cast<short>(i)) << (CHAR_BIT * static_cast<short>(i)); } cout << val; } void print_byte_order_char( char ) { unsigned char i; char val = 0; for(i = 1; i < sizeof(char); ++i) { val |= (CHAR_BIT * static_cast<char>(i)) << (CHAR_BIT * static_cast<char>(i)); } cout << val; } void print_byte_order_long( long ) { unsigned long i; long val = 0; for(i = 1; i < sizeof(long); ++i) { val |= (CHAR_BIT * static_cast<long>(i)) << (CHAR_BIT * static_cast<long>(i)); } cout << val; } void print_byte_order_int( int ) { unsigned int i; int val = 0; for(i = 1; i < sizeof(int); ++i) { val |= (CHAR_BIT * static_cast<int>(i)) << (CHAR_BIT * static_cast<int>(i)); } cout << val; } int main() { char c; short s; int i; long l; print_byte_order_char(c); print_byte_order_short(s); print_byte_order_int(i); print_byte_order_long(l); } This will generate a warning, for the char and short cases, when the "|=" happens. This is despite "val" being explicitly declared as a char or an short. I can see this being correct if "val" has been declared as "unsigned", which i shorthand for "unsigned int". But if "val" is explicitly declared as something, there should be a potential for the conversion to change the value.