From mboxrd@z Thu Jan 1 00:00:00 1970 From: tlaronde@polynum.com Date: Fri, 23 Apr 2010 09:42:21 +0200 To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Message-ID: <20100423074221.GA861@polynum.com> References: <20100422175033.GA6247@polynum.com> <87d97130a41364706523e641fe0dd372@plan9.bell-labs.com> <20100422193236.GA2388@polynum.com> <20100422200740.49F7D5B73@mail.bitblocks.com> <20100422211551.GA987@polynum.com> <20100422224911.F14615B73@mail.bitblocks.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100422224911.F14615B73@mail.bitblocks.com> User-Agent: Mutt/1.4.2.3i Subject: Re: [9fans] BUG!!! in Plan9 compiler! Topicbox-Message-UUID: 0c94006c-ead6-11e9-9d60-3106f5b1d025 On Thu, Apr 22, 2010 at 03:49:11PM -0700, Bakul Shah wrote: > On Thu, 22 Apr 2010 23:15:51 +0200 tlaronde@polynum.com wrote: > > This is: signed long + signed long + unsigned char. > > > Do you mean that there is first promotion : > > > > 1) unsigned char is promoted to unsigned int (A6.1). > > As per C89 in this case the unsigned char value should be > promoted to a *signed* int value. The sum will be of type > signed int and so the division will do the right thing. In > kencc case it seems the sum has type unsigned int for some > reason and further, the signed divisor (2) is promoted to an > unsigned int. Seems like a bug. > > Now that you know the problem, you can work around it by > setting type smallnumber to a signed char (since its range is > 0..64 this should just work with either compiler). > > > And when I do first assignment, there is only promotion (since no > > operator is here). > > There is promotion since you did += but it doesn't matter. > In C, a variable has a static type and you can't override > this type by any assignment. > > > Yielding the correct value in x2, that is then > > divided (or shifted) by 2, hence signed, and no problem? > > Yes. OK, thanks for the clarifications---more conform to what I expected/the way I interpreted the norm---. You gave a very simple test case for verifying a fix. Cheers, -- Thierry Laronde http://www.kergis.com/ Key fingerprint = 0FF7 E906 FBAF FE95 FD89 250D 52B1 AE95 6006 F40C