This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
> And indeed, it would appear that your other problem > > > j = ((char) (i * 2)) / 2; > > is the same root problem. We can't look through the narrowing cast as > readily as we're doing. Here's the revised version of the patch. It now prevents the distribution of the truncation down through the left shift when the target type is signed. Both parts of the patch are necessary in order to fix the PR, given that the first case is now redirected to the second one. Bootstrapped/regtested (C/C++) on i586-pc-linux-gnu (gcc-3_1-branch). 2002-05-30 Eric Botcazou <ebotcazou@multimania.com> PR c/6677 convert.c (convert_to_integer) [LSHIFT_EXPR]: Don't pass the truncation down if the target type is signed. fold-const.c (extract_muldiv) [NOP_EXPR]: Don't truncate if the target type is a smaller signed type. /* PR c/6677 */ /* Verify that GCC doesn't bypass a truncation to a signed type when folding. */ extern void abort (void); extern void exit (int); int main (void) { int i = 127; char j; j = ((char) (i << 1)) / 2; if (j != -1) abort(); j = ((char) (i * 2)) / 2; if (j != -1) abort(); exit(0); } -- Eric Botcazou ebotcazou@multimania.com
Attachment:
pr6677.diff
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |