(convert_to_integer): Warn if integer is truncated and that changes the value.
From-SVN: r3496
This commit is contained in:
parent
3c15ff863f
commit
4c42625bf5
@ -172,6 +172,30 @@ convert_to_integer (type, expr)
|
||||
|
||||
switch (ex_form)
|
||||
{
|
||||
case INTEGER_CST:
|
||||
if (TREE_UNSIGNED (type))
|
||||
{
|
||||
if (TREE_INT_CST_LOW (expr) >> outprec)
|
||||
warning ("integer constant truncated");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if the sign bit of the low-order part isn't replicated
|
||||
through the entire high part, we have overflow */
|
||||
int sign = TREE_INT_CST_LOW (expr) & (1 << (outprec - 1));
|
||||
if (!sign) /* lower part positive */
|
||||
{
|
||||
if (TREE_INT_CST_LOW (expr) >> outprec)
|
||||
warning ("integer constant truncated");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((TREE_INT_CST_LOW (expr) >> outprec) + 1)
|
||||
warning ("integer constant truncated");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RSHIFT_EXPR:
|
||||
/* We can pass truncation down through right shifting
|
||||
when the shift count is a nonpositive constant. */
|
||||
|
Loading…
Reference in New Issue
Block a user