aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-02-04 18:05:29 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-02-04 18:05:29 +0000
commit66f206041a2088880a65063e1bfa18b9ef86f4e4 (patch)
tree6cf58a0f991d5dd49ba9587ef28fd3e70e804bf3 /gcc
parent8472fa801bfcc8cfcbd8848b0c86c3527a984fe9 (diff)
downloadgcc-66f206041a2088880a65063e1bfa18b9ef86f4e4.zip
gcc-66f206041a2088880a65063e1bfa18b9ef86f4e4.tar.gz
gcc-66f206041a2088880a65063e1bfa18b9ef86f4e4.tar.bz2
re PR c/60036 (Spurious signedness conversion warning with relational operator)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr60036.c28
4 files changed, 47 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 58dc42c..82807f3 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index fc12788..007e727 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 028b911..4c28041 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..07eb6ac
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr60036.c
@@ -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" } */
+}