svn commit: r187693 - head/sys/kern

Jeff Roberson jroberson at jroberson.net
Sun Jan 25 11:16:40 PST 2009


On Sun, 25 Jan 2009, Christoph Mallon wrote:

> Jeff Roberson schrieb:
>> On Sun, 25 Jan 2009, Jeff Roberson wrote:
>> 
>>> Author: jeff
>>> Date: Sun Jan 25 18:38:42 2009
>>> New Revision: 187693
>>> URL: http://svn.freebsd.org/changeset/base/187693
>>> 
>>> Log:
>>>   - bit has to be fd_mask to work properly on 64bit platforms.  Constants
>>>     must also be cast even though the result ultimately is promoted
>>>     to 64bit.
>>>   - Correct a loop index upper bound in selscan().
>> 
>> Sorry about that, should've tested my earlier patch for more than a couple 
>> of days.  I seldom remember c's integer promotion rules as they relate to 
>> constants.  You'd think they'd make it easy on us and just promote it to 
>> the largest type in the expression/lvalue.  I'm not sure why they don't. 
>> Perhaps the more careful among you knows the answer.
>
> The rule for operations is quite simple: An operation never cares for the 
> type of its user. It only uses the type of the operand(s) to determine its 
> result type. So for a = b + c the type of the result of + only depends on the 
> types of b and c, but never on a.
> Integer literals have a bit ugly rules what type they are: It depends on the 
> base (!) and on the magnitude of the literal.
> If in doubt and you need a specific type (and maybe making it more clear for 
> a reader) then cast.
>

I'm familiar with the rule, what I don't know is the rationale.  It 
would've been much more convenient if they did care for the user.

In what case does the base matter?  If you use a literal large enough the 
compiler conveniently complains.  However, in this case the shift value 
was computed and applied to 1 which overflowed before being assigned to a 
64bit value.

Thanks,
Jeff


More information about the svn-src-head mailing list