diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-01-14 10:47:09 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-01-14 10:47:09 +0100 |
commit | 5f8d50239ba11866a5e0251975142fee6632ab2f (patch) | |
tree | f281e4baaa435f4349cbed1f76a9f1ae97fba37a /gcc/fold-const.c | |
parent | 429c98c9a813a425c325f992126c365898f56d94 (diff) | |
download | gcc-5f8d50239ba11866a5e0251975142fee6632ab2f.zip gcc-5f8d50239ba11866a5e0251975142fee6632ab2f.tar.gz gcc-5f8d50239ba11866a5e0251975142fee6632ab2f.tar.bz2 |
re PR c/42721 (possible integer wrong code bug)
PR c/42721
Port from no-undefined-overflow branch
2009-03-09 Richard Guenther <rguenther@suse.de>
* fold-const.c (add_double_with_sign): Fix unsigned overflow
detection.
* gcc.c-torture/execute/pr42721.c: New test.
From-SVN: r155887
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9e40296..9d249cc 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -326,13 +326,17 @@ add_double_with_sign (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1, HOST_WIDE_INT h; l = l1 + l2; - h = h1 + h2 + (l < l1); + h = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) h1 + + (unsigned HOST_WIDE_INT) h2 + + (l < l1)); *lv = l; *hv = h; if (unsigned_p) - return (unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1; + return ((unsigned HOST_WIDE_INT) h < (unsigned HOST_WIDE_INT) h1 + || (h == h1 + && l < l1)); else return OVERFLOW_SUM_SIGN (h1, h2, h); } |