|<< Back to previous view|
[PCC-409] 'invalid' bitshift produces possibly incorrect code Created: 10/Sep/12 Updated: 15/Sep/12
|Component/s:||Common code, i386 target|
|Reporter:||Iain Hibbert||Assignee:||Anders Magnusson|
The following code snippet (which construct I found in some GNU code)
unsigned int foo(unsigned int a)
return a << 31 << 1;
when compiled with pcc, produces a warning
foo.c, line 3: warning: shift larger than type
which of course is true (though gcc does not warn about it, as I guess that
it was intentionally written that way). However, while considering what to do
about it, I noticed that the output code pcc produces is not strictly correct..
.ident "PCC: pcc 1.1.0.DEVEL 20120910 for netbsd-i386"
it seems that the function merely returns its input; the equivalent output from gcc
(and what I would expect) is to return 0 since all the bits have been shifted out
in fact, pcc is shifting "count % maxbits" rather than "count" here, which also produces
incorrect result for larger shifts..
|Comment by Iain Hibbert [ 10/Sep/12 09:54 PM ]|
I should note, that in C99 6.5.7 "Bitwise shift operators" note 3, it does say
"If the value of the right operand is negative or is greater than or equal to the width of
the promoted left operand, the behavior is undefined."
which means that pcc is not unconforming here, just that the result is not necessarily what I would expect..
|Comment by Anders Magnusson [ 10/Sep/12 10:18 PM ]|
|The code for clearing types is commented out in optim.c due to lack of side effects check. It should probably be fixed.|
|Comment by Anders Magnusson [ 15/Sep/12 04:05 PM ]|
|The mod for correct size is now removed, to give least surprises.|