re PR other/30465 (Duplicated overflow warning)

2007-03-04  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR other/30465
	* c-common.c (convert_and_check): Don't give warnings for
	conversion if 'expr' already overflowed.

testsuite/
	* gcc.dg/multiple-overflow-warn-3.c: New.
	* g++.dg/warn/multiple-overflow-warn-3.C: New.

From-SVN: r122534
This commit is contained in:
Manuel López-Ibáñez 2007-03-04 23:29:41 +00:00
parent af13a7a6ec
commit f73fe417bc
5 changed files with 50 additions and 17 deletions

View File

@ -1,3 +1,9 @@
2007-03-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR other/30465
* c-common.c (convert_and_check): Don't give warnings for
conversion if 'expr' already overflowed.
2007-03-04 Roger Sayle <roger@eyesopen.com>
PR middle-end/30744

View File

@ -1250,10 +1250,9 @@ convert_and_check (tree type, tree expr)
result = convert (type, expr);
if (skip_evaluation)
if (skip_evaluation || TREE_OVERFLOW_P (expr))
return result;
if (TREE_CODE (expr) == INTEGER_CST
&& (TREE_CODE (type) == INTEGER_TYPE
|| TREE_CODE (type) == ENUMERAL_TYPE)
@ -1274,21 +1273,19 @@ convert_and_check (tree type, tree expr)
else if (warn_conversion)
conversion_warning (type, expr);
}
else
{
if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
warning (OPT_Woverflow,
"overflow in implicit constant conversion");
/* No warning for converting 0x80000000 to int. */
else if (pedantic
&& (TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE
|| TYPE_PRECISION (TREE_TYPE (expr))
!= TYPE_PRECISION (type)))
warning (OPT_Woverflow,
"overflow in implicit constant conversion");
else if (warn_conversion)
conversion_warning (type, expr);
}
else if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
warning (OPT_Woverflow,
"overflow in implicit constant conversion");
/* No warning for converting 0x80000000 to int. */
else if (pedantic
&& (TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE
|| TYPE_PRECISION (TREE_TYPE (expr))
!= TYPE_PRECISION (type)))
warning (OPT_Woverflow,
"overflow in implicit constant conversion");
else if (warn_conversion)
conversion_warning (type, expr);
}
else if (TREE_CODE (result) == INTEGER_CST && TREE_OVERFLOW (result))
warning (OPT_Woverflow,

View File

@ -1,3 +1,9 @@
2007-03-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR other/30465
* gcc.dg/multiple-overflow-warn-3.c: New.
* g++.dg/warn/multiple-overflow-warn-3.C: New.
2007-03-04 Simon Martin <simartin@users.sourceforge.net>
PR c++/30895

View File

@ -0,0 +1,12 @@
/* PR 30465 : Test for duplicated warnings in a conversion. */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
wchar_t
g (void)
{
wchar_t wc = ((wchar_t)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */
/* { dg-warning "overflow" "" { target *-*-* } 8 } */
return wc;
}

View File

@ -0,0 +1,12 @@
/* PR 30465 : Test for duplicated warnings in a conversion. */
/* { dg-do compile } */
/* { dg-options "-Woverflow" } */
short int
g (void)
{
short int wc = ((short int)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */
/* { dg-warning "overflow" "" { target *-*-* } 8 } */
return wc;
}