re PR c++/41779 (Wconversion cannot see throught real*integer promotions)

2010-02-19  Manuel López-Ibáñez  <manu@gcc.gnu.org>

	PR 41779
	* c-common.c (conversion_warning): Remove widening conversions
	before checking the conversion of integers to reals.
testsuite/
	* c-c++-common/pr41779.c: New.

From-SVN: r156911
parent b42186f1
2010-02-19 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR 41779
* c-common.c (conversion_warning): Remove widening conversions
before checking the conversion of integers to reals.
2010-02-19 Mike Stump <mikestump@comcast.net>
PR objc/43061
......
......@@ -2192,12 +2192,17 @@ conversion_warning (tree type, tree expr)
else if (TREE_CODE (expr_type) == INTEGER_TYPE
&& TREE_CODE (type) == REAL_TYPE)
{
tree type_low_bound = TYPE_MIN_VALUE (expr_type);
tree type_high_bound = TYPE_MAX_VALUE (expr_type);
REAL_VALUE_TYPE real_low_bound
= real_value_from_int_cst (0, type_low_bound);
REAL_VALUE_TYPE real_high_bound
= real_value_from_int_cst (0, type_high_bound);
tree type_low_bound, type_high_bound;
REAL_VALUE_TYPE real_low_bound, real_high_bound;
/* Don't warn about char y = 0xff; float x = (int) y; */
expr = get_unwidened (expr, 0);
expr_type = TREE_TYPE (expr);
type_low_bound = TYPE_MIN_VALUE (expr_type);
type_high_bound = TYPE_MAX_VALUE (expr_type);
real_low_bound = real_value_from_int_cst (0, type_low_bound);
real_high_bound = real_value_from_int_cst (0, type_high_bound);
if (!exact_real_truncate (TYPE_MODE (type), &real_low_bound)
|| !exact_real_truncate (TYPE_MODE (type), &real_high_bound))
......
2010-02-19 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR 41779
* c-c++-common/pr41779.c: New.
2010-02-19 Jakub Jelinek <jakub@redhat.com>
PR debug/43084
......
/* PR41779: Wconversion cannot see throught real*integer promotions. */
/* { dg-do compile } */
/* { dg-skip-if "doubles are floats" { "avr-*-*" } { "*" } { "" } } */
/* { dg-options "-std=c99 -Wconversion" { target c } } */
/* { dg-options "-Wconversion" { target c++ } } */
/* { dg-require-effective-target large_double } */
float f(float x, unsigned short y)
{
return x * y;
}
float f(float x, short y)
{
return x * y;
}
float f(float x, char y)
{
return x * y;
}
float f(float x, unsigned char y)
{
return x * y;
}
float f(float x, int y)
{
return x * y; /* { dg-warning "conversion" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment