diff options
author | Dodji Seketeli <dodji@redhat.com> | 2008-08-28 14:49:48 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2008-08-28 16:49:48 +0200 |
commit | 5bdc1946f07880739cdbca20105cebcba5795de0 (patch) | |
tree | cedeeece4140a9cc8474c6215439d0802ddad3f1 /gcc/tree.c | |
parent | 0fca40f598654f83453b17e44f902183859b16e4 (diff) | |
download | gcc-5bdc1946f07880739cdbca20105cebcba5795de0.zip gcc-5bdc1946f07880739cdbca20105cebcba5795de0.tar.gz gcc-5bdc1946f07880739cdbca20105cebcba5795de0.tar.bz2 |
re PR c++/36741 (Bogus "large integer implicitly truncated" passing size_t constant to new)
2008-08-28 Dodji Seketeli <dodji@redhat.com>
PR c++/36741
* tree.c (int_fits_type_p): Don't forget unsigned integers
of type sizetype which higher end word equals -1.
From-SVN: r139712
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -6319,6 +6319,21 @@ int_fits_type_p (const_tree c, const_tree type) for "unknown if constant fits", 0 for "constant known *not* to fit" and 1 for "constant known to fit". */ + if (TREE_TYPE (c) == sizetype + && TYPE_UNSIGNED (TREE_TYPE (c)) + && TREE_INT_CST_HIGH (c) == -1 + && !TREE_OVERFLOW (c)) + /* So c is an unsigned integer which type is sizetype. + sizetype'd integers are sign extended even though they are + unsigned. If the integer value fits in the lower end word of c, + and if the higher end word has all its bits set to 1, that + means the higher end bits are set to 1 only for sign extension. + So let's convert c into an equivalent zero extended unsigned + integer. */ + c = force_fit_type_double (size_type_node, + TREE_INT_CST_LOW (c), + TREE_INT_CST_HIGH (c), + false, false); /* Check if C >= type_low_bound. */ if (type_low_bound && TREE_CODE (type_low_bound) == INTEGER_CST) { |