summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-typeck.c34
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/20020220-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr59871.c22
-rw-r--r--libdecnumber/ChangeLog5
-rw-r--r--libdecnumber/decNumberLocal.h7
7 files changed, 79 insertions, 6 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index a158f11cb01..237ac1a959c 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-23 Marek Polacek <polacek@redhat.com>
+
+ PR c/59871
+ * c-typeck.c (build_compound_expr): Warn even for right-hand operand
+ of a comma expression.
+ (emit_side_effect_warnings): Likewise.
+
2014-01-23 Balaji V. Iyer <balaji.v.iyer@intel.com>
PR c/59825
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 92304b0db9e..781d4df246d 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -4778,6 +4778,23 @@ build_compound_expr (location_t loc, tree expr1, tree expr2)
"left-hand operand of comma expression has no effect");
}
}
+ else if (TREE_CODE (expr1) == COMPOUND_EXPR
+ && warn_unused_value)
+ {
+ tree r = expr1;
+ location_t cloc = loc;
+ while (TREE_CODE (r) == COMPOUND_EXPR)
+ {
+ if (EXPR_HAS_LOCATION (r))
+ cloc = EXPR_LOCATION (r);
+ r = TREE_OPERAND (r, 1);
+ }
+ if (!TREE_SIDE_EFFECTS (r)
+ && !VOID_TYPE_P (TREE_TYPE (r))
+ && !CONVERT_EXPR_P (r))
+ warning_at (cloc, OPT_Wunused_value,
+ "right-hand operand of comma expression has no effect");
+ }
/* With -Wunused, we should also warn if the left-hand operand does have
side-effects, but computes a value which is not used. For example, in
@@ -9643,6 +9660,23 @@ emit_side_effect_warnings (location_t loc, tree expr)
if (!VOID_TYPE_P (TREE_TYPE (expr)) && !TREE_NO_WARNING (expr))
warning_at (loc, OPT_Wunused_value, "statement with no effect");
}
+ else if (TREE_CODE (expr) == COMPOUND_EXPR)
+ {
+ tree r = expr;
+ location_t cloc = loc;
+ while (TREE_CODE (r) == COMPOUND_EXPR)
+ {
+ if (EXPR_HAS_LOCATION (r))
+ cloc = EXPR_LOCATION (r);
+ r = TREE_OPERAND (r, 1);
+ }
+ if (!TREE_SIDE_EFFECTS (r)
+ && !VOID_TYPE_P (TREE_TYPE (r))
+ && !CONVERT_EXPR_P (r)
+ && !TREE_NO_WARNING (expr))
+ warning_at (cloc, OPT_Wunused_value,
+ "right-hand operand of comma expression has no effect");
+ }
else
warn_if_unused_value (expr, loc);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 564d4258c7b..3857078b1db 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-23 Marek Polacek <polacek@redhat.com>
+
+ PR c/59871
+ * gcc.dg/20020220-2.c: Adjust dg-warning message.
+ * gcc.dg/pr59871.c: New test.
+
2014-01-23 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58980
diff --git a/gcc/testsuite/gcc.dg/20020220-2.c b/gcc/testsuite/gcc.dg/20020220-2.c
index c6c57a92136..95606703cc5 100644
--- a/gcc/testsuite/gcc.dg/20020220-2.c
+++ b/gcc/testsuite/gcc.dg/20020220-2.c
@@ -1,5 +1,5 @@
/* PR c/4697
- Test whether value computed not used warning is given for compound
+ Test whether operand has no effect warning is given for compound
expression. */
/* { dg-do compile } */
/* { dg-options "-O2 -Wunused" } */
@@ -7,6 +7,6 @@
int b;
int foo (int a)
{
- a = a + 1, 5 * b; /* { dg-warning "value computed is not used" } */
+ a = a + 1, 5 * b; /* { dg-warning "right-hand operand of comma expression has no effect" } */
return a;
}
diff --git a/gcc/testsuite/gcc.dg/pr59871.c b/gcc/testsuite/gcc.dg/pr59871.c
new file mode 100644
index 00000000000..c881aa198d5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr59871.c
@@ -0,0 +1,22 @@
+/* PR c/59871 */
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+extern int bar ();
+
+void
+foo (int *p, int i)
+{
+ p[0] = (bar (), 1, bar ()); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ p[1] = (1, bar ()); /* { dg-warning "left-hand operand of comma expression has no effect" } */
+ bar (), 1, bar (); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ bar (), 1; /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ 1, bar (); /* { dg-warning "left-hand operand of comma expression has no effect" } */
+ (bar (), 1); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ bar (), 5 * i; /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ (bar (), 5 * i); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ (bar (), (bar (), (bar (), (bar (), (bar (), (bar (), (bar (), 7))))))); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ bar (), (bar (), (bar (), (bar (), (bar (), (bar (), (bar (), 7)))))); /* { dg-warning "right-hand operand of comma expression has no effect" } */
+ bar (), (bar (), (bar (), (bar (), (bar (), (bar (), (7, bar ())))))); /* { dg-warning "left-hand operand of comma expression has no effect" } */
+ (bar (), (bar (), (bar (), (bar (), (bar (), (bar (), (7, bar ()))))))); /* { dg-warning "left-hand operand of comma expression has no effect" } */
+}
diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index 36a60033c1b..14df41c99ea 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-23 Marek Polacek <polacek@redhat.com>
+
+ PR c/59871
+ * decNumberLocal.h (UBFROMUS, UBFROMUI): Remove last argument.
+
2014-01-02 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years
diff --git a/libdecnumber/decNumberLocal.h b/libdecnumber/decNumberLocal.h
index 94e7f7f9b1f..4936231f2a2 100644
--- a/libdecnumber/decNumberLocal.h
+++ b/libdecnumber/decNumberLocal.h
@@ -153,10 +153,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define UBTOUI(b) (memcpy((void *)&uiwork, b, 4), uiwork)
/* Store a uInt, etc., into bytes starting at a char* or uByte*. */
- /* Returns i, evaluated, for convenience; has to use uiwork because */
- /* i may be an expression. */
- #define UBFROMUS(b, i) (uswork=(i), memcpy(b, (void *)&uswork, 2), uswork)
- #define UBFROMUI(b, i) (uiwork=(i), memcpy(b, (void *)&uiwork, 4), uiwork)
+ /* Has to use uiwork because i may be an expression. */
+ #define UBFROMUS(b, i) (uswork=(i), memcpy(b, (void *)&uswork, 2))
+ #define UBFROMUI(b, i) (uiwork=(i), memcpy(b, (void *)&uiwork, 4))
/* X10 and X100 -- multiply integer i by 10 or 100 */
/* [shifts are usually faster than multiply; could be conditional] */