https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119222

--- Comment #12 from Gwen Fu <gwen3293940943 at gmail dot com> ---
I know how this bug generate this time (100%)!
This is because the funx conversion_warning (in c-family/c-warn.cc , the helper
function for warnings_for_convert_and_check)lacks some checks when expr is of
type double

here is the curcial part about this bugu  of conversion_warning:
static bool
conversion_warning (location_t loc, tree type, tree expr, tree result)
{
  // type -> int , expr->1.0/0.0  result->(int)1.0/0.0 
  .....
  switch (TREE_CODE (expr))
    {
    case EQ_EXPR:
    case NE_EXPR:
    case LE_EXPR:
    case GE_EXPR:
    .....
    case REAL_CST:
    case INTEGER_CST:
    .....
   }
  return false ;
}

And 
warning_for_convert_and_check only responsible for the two situations below :
 if (TREE_CODE (expr) == INTEGER_CST
      && (TREE_CODE (type) == INTEGER_TYPE
          || TREE_CODE (type) == BITINT_TYPE
          || (TREE_CODE (type) == ENUMERAL_TYPE
              && TREE_CODE (ENUM_UNDERLYING_TYPE (type)) != BOOLEAN_TYPE))
      && !int_fits_type_p (expr, type))
{....}
  else if ((TREE_CODE (result) == INTEGER_CST
            || TREE_CODE (result) == FIXED_CST) && TREE_OVERFLOW (result))
{.....}

The rest of the situation is all handed over to the top function。
If you need more testimonies , I will give you !!!!!

Reply via email to