re PR c/35430 (ICE with complex arithmetic)
authorJakub Jelinek <jakub@redhat.com>
Tue, 4 Nov 2008 20:51:38 +0000 (21:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 4 Nov 2008 20:51:38 +0000 (21:51 +0100)
PR c/35430
* c-common.c (warn_for_sign_compare): For complex result_type
use component's type.

* gcc.dg/pr35430.c: New test.
* g++.dg/warn/Wsign-compare-2.C: New test.

Co-Authored-By: Andrew Pinski <andrew_pinski@playstation.sony.com>
From-SVN: r141587

gcc/ChangeLog
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wsign-compare-2.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr35430.c [new file with mode: 0644]

index a0152b1..7e062db 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-04  Jakub Jelinek  <jakub@redhat.com>
+           Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR c/35430
+       * c-common.c (warn_for_sign_compare): For complex result_type
+       use component's type.
+
 2008-11-04  Jakub Jelinek  <jakuB@redhat.com>
 
        * print-tree.c (print_node): Use code instead of TREE_CODE (node).
index 3a97bd7..ea7379e 100644 (file)
@@ -8241,7 +8241,7 @@ warn_for_sign_compare (location_t location,
       && TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
       && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
       && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
-      != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
+        != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
     {
       warning_at (location,
                  OPT_Wsign_compare, "comparison between types %qT and %qT",
@@ -8258,9 +8258,9 @@ warn_for_sign_compare (location_t location,
     /* OK */;
   else
     {
-      tree sop, uop;
+      tree sop, uop, base_type;
       bool ovf;
-      
+
       if (op0_signed)
         sop = orig_op0, uop = orig_op1;
       else 
@@ -8268,6 +8268,8 @@ warn_for_sign_compare (location_t location,
 
       STRIP_TYPE_NOPS (sop); 
       STRIP_TYPE_NOPS (uop);
+      base_type = (TREE_CODE (result_type) == COMPLEX_TYPE
+                  ? TREE_TYPE (result_type) : result_type);
 
       /* Do not warn if the signed quantity is an unsuffixed integer
          literal (or some static constant expression involving such
@@ -8280,7 +8282,7 @@ warn_for_sign_compare (location_t location,
          in the result if the result were signed.  */
       else if (TREE_CODE (uop) == INTEGER_CST
                && (resultcode == EQ_EXPR || resultcode == NE_EXPR)
-               && int_fits_type_p (uop, c_common_signed_type (result_type)))
+              && int_fits_type_p (uop, c_common_signed_type (base_type)))
         /* OK */;
       /* In C, do not warn if the unsigned quantity is an enumeration
          constant and its maximum value would fit in the result if the
@@ -8288,7 +8290,7 @@ warn_for_sign_compare (location_t location,
       else if (!c_dialect_cxx() && TREE_CODE (uop) == INTEGER_CST
                && TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE
                && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE (uop)),
-                                   c_common_signed_type (result_type)))
+                                  c_common_signed_type (base_type)))
         /* OK */;
       else 
         warning_at (location,
index daf656f..b2dfc59 100644 (file)
@@ -1,4 +1,11 @@
 2008-11-04  Jakub Jelinek  <jakub@redhat.com>
+           Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR c/35430
+       * gcc.dg/pr35430.c: New test.
+       * g++.dg/warn/Wsign-compare-2.C: New test.
+
+2008-11-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/37106
        * gcc.dg/pr37106-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C b/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C
new file mode 100644 (file)
index 0000000..2b83606
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c/35430
+// { dg-do compile }
+// { dg-options "-Wsign-compare" }
+
+void
+foo (__complex__ int i)
+{
+  i == 0u;
+  i == ~1u;    // { dg-warning "comparison between signed and unsigned integer expressions" }
+}
diff --git a/gcc/testsuite/gcc.dg/pr35430.c b/gcc/testsuite/gcc.dg/pr35430.c
new file mode 100644 (file)
index 0000000..ab5e4ca
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR c/35430 */
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+void
+foo (__complex__ int i)
+{
+  i == 0u;
+  i == ~1u;    /* { dg-warning "comparison between signed and unsigned integer expressions" } */
+}