On 12/01/2015 05:01 PM, Richard Earnshaw wrote: > On 01/12/15 16:07, Andrew Haley wrote: >> Do we support left shift of a negative value? Technically it's >> undefined and ubsan warns about it. However, a ton of software would >> surely break if we didn't do the obvious right thing. I can't find >> anything in the GCC manual. > > I don't believe we do, or can as of today. Firstly, there are two > possible 'obvious' behaviours: 1) The value is treated as signed and a > negative shift turns into a positive shift in the other direction; 2) > The value is treated as unsigned and the value is treated by a massive > shift in the same direction that exceeds the normally supported range of > the type. Which one is the default will probably depend on your hardware. > > Consider the case where the value is in a variable. To support negative > shifts as reversed shifts on machines where they don't automatically > convert negative values to reversed shifts you'd have to do an explicit > range check before every shift using that value. Something I know we > don't do today since I've never seen such checks come out on ARM, nor > are there any hooks in the compiler to deal with it. No, a shift *of* a negative value, not a shift *by* a negative value! i.e. an arithmetic right shift. Andrew.