https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90578
--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> --- On Thu, 23 May 2019, dominiq at lps dot ens.fr wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90578 > > Dominique d'Humieres <dominiq at lps dot ens.fr> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > Status|RESOLVED |NEW > Resolution|INVALID |--- > > --- Comment #2 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- > LSHIFT is a GNU extension defined as > > LSHIFT returns a value corresponding to I with all of the bits shifted left by > SHIFT places. If the absolute value of SHIFT is greater than BIT_SIZE(I), the > value is undefined. Bits shifted out from the left end are lost; zeros are > shifted in from the opposite end. > > I don't see any mention of "left-shift by negative value is undefined". But it doesn't define what happens either ;) Thus it is "undefined" :P So, if the GNU extension would document it as "A LSHIFT by a negative value is treated as a RSHIFT" then the frontend has to emit y < 0 ? x >> y : x << y since what I am saying is that the middle-end follows the C standard here and treats negative shift amounts as undefined.