aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-09-11 08:53:34 +0000
committerRichard Stallman <rms@gnu.org>1992-09-11 08:53:34 +0000
commit17651386eecee506fb6ea2e15c0bb9171464cf43 (patch)
treee3db093d35bf861c01d0764c4c692dbfe274047d
parent2d7243898e983c8df7abc4b51cfe9ef23327f0a9 (diff)
downloadgcc-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.c45
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;