Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Jan 2009 09:14:03 -1000 (HST)
From:      Jeff Roberson <jroberson@jroberson.net>
To:        Christoph Mallon <christoph.mallon@gmx.de>
Cc:        svn-src-head@freebsd.org, Jeff Roberson <jeff@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org
Subject:   Re: svn commit: r187693 - head/sys/kern
Message-ID:  <20090125091247.Y983@desktop>
In-Reply-To: <497CB95A.109@gmx.de>
References:  <200901251838.n0PIcgXk024858@svn.freebsd.org> <20090125085419.O983@desktop> <497CB95A.109@gmx.de>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090125091247.Y983>