https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78135
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to John Hunter from comment #4)
> The annotation of Constants with `ul' is a fudge. In the specimen program,
> a constant (1) is assigned to an unsigned long variable (wk) which forces it
If you are talking about wk = 1 << j;, then it really doesn't matter what type
the wk variable has, this is assigning the value of 1 << j into the wk
variable,
so 1 << j is first evaluated and then converted into unsigned long and stored.
(In reply to Jakub Jelinek from comment #6)
> And, again on 32-bit int targets, (1 << 24) << 7 is well defined, but 0.
Sorry, thought about (1 << 24) << 8; and it is well defined in C++, still
undefined behavior in C99. For (1 << 24) << 7, it is again INT_MIN in C++, UB
in C99. You really want (1U << 24) << 8 (if you want to get 0), or (1ULL <<
24) << 7 (if you want to get 0x100000000ULL.