https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93589
Jason Merrill <jason at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org
--- Comment #7 from Jason Merrill <jason at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #6)
> Oops, I meant to say the warning was just suppressed for the += case, see PR
> 40752.
Rather, it was suppressed for the simple case where the RHS has a suitable
type. As Jonathan says, (CHAR_BIT * static_cast<short>(i)) has type int (it
would be unsigned without the cast). And then the << expression has type int.
And then the | expression has type int.
Before the patch for 40752, we would warn based just on the type of the |
expression. Now we also look at the type of the << expression, see that it is
also int, and warn. You can avoid the warning by breaking up the expression
more:
#define CHAR_BIT 8
void print_byte_order( short )
{
short val = 0;
unsigned i = 1;
short pat1 = (CHAR_BIT * static_cast<short>(i));
short pat2 = pat1 << (CHAR_BIT * static_cast<short>(i));
val |= pat2;
}
or adding another cast as in comment #1.
Perhaps I should adjust the 40752 patch to work recursively.