OSDN Git Service

2010-02-19 Manuel López-Ibáñez <manu@gcc.gnu.org>
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2010 21:12:09 +0000 (21:12 +0000)
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2010 21:12:09 +0000 (21:12 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156911 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr41779.c [new file with mode: 0644]

index e724239..f4a916b 100644 (file)
@@ -1,3 +1,9 @@
+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
index f9bdf38..1039e24 100644 (file)
@@ -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))
index 14b2ea4..f5863dc 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/c-c++-common/pr41779.c b/gcc/testsuite/c-c++-common/pr41779.c
new file mode 100644 (file)
index 0000000..f7153d9
--- /dev/null
@@ -0,0 +1,31 @@
+/* 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" } */
+}