diff options
author | Richard Stallman <rms@gnu.org> | 1992-09-11 08:53:34 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-09-11 08:53:34 +0000 |
commit | 17651386eecee506fb6ea2e15c0bb9171464cf43 (patch) | |
tree | e3db093d35bf861c01d0764c4c692dbfe274047d | |
parent | 2d7243898e983c8df7abc4b51cfe9ef23327f0a9 (diff) | |
download | gcc-17651386eecee506fb6ea2e15c0bb9171464cf43.zip gcc-17651386eecee506fb6ea2e15c0bb9171464cf43.tar.gz gcc-17651386eecee506fb6ea2e15c0bb9171464cf43.tar.bz2 |
(build_binary_op): When checking shift widths, don't assume target integer
fits in a HOST_WIDE_INT.
From-SVN: r2106
-rw-r--r-- | gcc/c-typeck.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 145a27b..3181f15 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2347,12 +2347,17 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) { if (TREE_CODE (op1) == INTEGER_CST) { - if (TREE_INT_CST_LOW (op1) > 0) - short_shift = 1; - else if (TREE_INT_CST_LOW (op1) < 0) + if (tree_int_cst_lt (op1, integer_zero_node)) warning ("shift count is negative"); - if (TREE_INT_CST_LOW (op1) >= TYPE_PRECISION (type0)) - warning ("shift count >= width of type"); + else + { + if (TREE_INT_CST_LOW (op1) | TREE_INT_CST_HIGH (op1)) + short_shift = 1; + if (TREE_INT_CST_HIGH (op1) != 0 + || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1) + >= TYPE_PRECISION (type0))) + warning ("shift count >= width of type"); + } } /* Use the type of the value to be shifted. This is what most traditional C compilers do. */ @@ -2372,12 +2377,15 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) case LSHIFT_EXPR: if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { - if (TREE_CODE (op1) == INTEGER_CST - && TREE_INT_CST_LOW (op1) < 0) - warning ("shift count is negative"); - if (TREE_CODE (op1) == INTEGER_CST - && TREE_INT_CST_LOW (op1) >= TYPE_PRECISION (type0)) - warning ("shift count >= width of type"); + if (TREE_CODE (op1) == INTEGER_CST) + { + if (tree_int_cst_lt (op1, integer_zero_node)) + warning ("shift count is negative"); + else if (TREE_INT_CST_HIGH (op1) != 0 + || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1) + >= TYPE_PRECISION (type0))) + warning ("shift count >= width of type"); + } /* Use the type of the value to be shifted. This is what most traditional C compilers do. */ result_type = type0; @@ -2397,12 +2405,15 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) case LROTATE_EXPR: if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { - if (TREE_CODE (op1) == INTEGER_CST - && TREE_INT_CST_LOW (op1) < 0) - warning ("shift count is negative"); - if (TREE_CODE (op1) == INTEGER_CST - && TREE_INT_CST_LOW (op1) >= TYPE_PRECISION (type0)) - warning ("shift count >= width of type"); + if (TREE_CODE (op1) == INTEGER_CST) + { + if (tree_int_cst_lt (op1, integer_zero_node)) + warning ("shift count is negative"); + else if (TREE_INT_CST_HIGH (op1) != 0 + || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1) + >= TYPE_PRECISION (type0))) + warning ("shift count >= width of type"); + } /* Use the type of the value to be shifted. This is what most traditional C compilers do. */ result_type = type0; |