]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/60036 (Spurious signedness conversion warning with relational operator)
authorMarek Polacek <polacek@redhat.com>
Tue, 4 Feb 2014 18:05:29 +0000 (18:05 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 4 Feb 2014 18:05:29 +0000 (18:05 +0000)
PR c/60036
c-family/
* c-common.c (conversion_warning): Unwrap C_MAYBE_CONST_EXPR and/or
SAVE_EXPR.
testsuite/
* gcc.dg/pr60036.c: New test.

From-SVN: r207481

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr60036.c [new file with mode: 0644]

index 58dc42ca223e22c4754223d2d69575c3f90141d0..82807f385798ab826ef7d39c53e6aa5eda4b6af6 100644 (file)
@@ -1,3 +1,9 @@
+2014-02-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c/60036
+       * c-common.c (conversion_warning): Unwrap C_MAYBE_CONST_EXPR and/or
+       SAVE_EXPR.
+
 2014-02-03  Marc Glisse  <marc.glisse@inria.fr>
 
        PR c++/53017
index fc12788171cf3b79bf8a64321497971b735a67a7..007e7275fc8650e4510fff53dbccda28efab6133 100644 (file)
@@ -2714,6 +2714,14 @@ conversion_warning (location_t loc, tree type, tree expr)
   if (!warn_conversion && !warn_sign_conversion && !warn_float_conversion)
     return;
 
+  /* This may happen, because for LHS op= RHS we preevaluate
+     RHS and create C_MAYBE_CONST_EXPR <SAVE_EXPR <RHS>>, which
+     means we could no longer see the code of the EXPR.  */
+  if (TREE_CODE (expr) == C_MAYBE_CONST_EXPR)
+    expr = C_MAYBE_CONST_EXPR_EXPR (expr);
+  if (TREE_CODE (expr) == SAVE_EXPR)
+    expr = TREE_OPERAND (expr, 0);
+
   switch (TREE_CODE (expr))
     {
     case EQ_EXPR:
index 028b911c271ea0ef3064d815cc87e497045e13b6..4c28041dfc2417df6a3494d10507a957b4598cb0 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c/60036
+       * gcc.dg/pr60036.c: New test.
+
 2014-02-04  Markus Trippelsdorf  <markus@trippelsdorf.de>
 
        PR ipa/60058
diff --git a/gcc/testsuite/gcc.dg/pr60036.c b/gcc/testsuite/gcc.dg/pr60036.c
new file mode 100644 (file)
index 0000000..07eb6ac
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR c/60036 */
+/* { dg-do compile } */
+/* { dg-options "-Wconversion" } */
+
+extern int fn (void);
+
+void
+foo (int i)
+{
+  unsigned int f = 9;
+
+  /* Don't warn on these.  */
+  f += fn () || i;
+  f += fn () && i;
+  f += ! fn ();
+  f -= fn () == i;
+  f |= fn () != i;
+  f &= fn () < i;
+  f ^= fn () > i;
+  f &= fn () <= i;
+  f ^= fn () >= i;
+
+  /* But warn on the following.  */
+  f += fn (); /* { dg-warning "conversion" } */
+  f += fn () | i; /* { dg-warning "conversion" } */
+  f += fn () & i; /* { dg-warning "conversion" } */
+  f += fn () ^ i; /* { dg-warning "conversion" } */
+}