[C PATCH] Kill bogus warnings on _Atomics (PR c/60195)
Marek Polacek
polacek@redhat.com
Tue Feb 18 19:09:00 GMT 2014
This PR is about bogus warnings on _Atomics. E.g., for _Atomic int,
the warning "right-hand operand of comma has no effect" makes no sense. One
problem was that when making COMPOUND_EXPR out of atomic variable, we create
artificial variable via create_tmp_var, but we shouldn't warn on those. So
I've set TREE_NO_WARNING on such variables.
Another issue is that we warned that a variable is unused, even when it's
actually used in __atomic_load; mark_exp_read fixed it.
Also I noticed a typo, so fixed (s/val/old/).
Regtested/bootstrapped on x86_64-linux, ok for 5.0? (Or 4.9 instead?)
2014-02-18 Marek Polacek <polacek@redhat.com>
PR c/60195
c/
* c-typeck.c (convert_lvalue_to_rvalue): Set TREE_NO_WARNING on tmp.
Call mark_exp_read on exp.value.
(build_atomic_assign): Set TREE_NO_WARNING on val and old. Set
TREE_ADDRESSABLE on old instead of val.
(emit_side_effect_warnings): Warn only if RHS has !TREE_NO_WARNING.
testsuite/
* gcc.dg/pr60195.c: New test.
diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c
index da6a6fc..2b54290 100644
--- gcc/c/c-typeck.c
+++ gcc/c/c-typeck.c
@@ -2009,6 +2009,7 @@ convert_lvalue_to_rvalue (location_t loc, struct c_expr exp,
tmp = create_tmp_var (nonatomic_type, NULL);
tmp_addr = build_unary_op (loc, ADDR_EXPR, tmp, 0);
TREE_ADDRESSABLE (tmp) = 1;
+ TREE_NO_WARNING (tmp) = 1;
/* Issue __atomic_load (&expr, &tmp, SEQ_CST); */
fndecl = builtin_decl_explicit (BUILT_IN_ATOMIC_LOAD);
@@ -2017,6 +2018,9 @@ convert_lvalue_to_rvalue (location_t loc, struct c_expr exp,
params->quick_push (seq_cst);
func_call = build_function_call_vec (loc, vNULL, fndecl, params, NULL);
+ /* EXPR is always read. */
+ mark_exp_read (exp.value);
+
/* Return tmp which contains the value loaded. */
exp.value = build2 (COMPOUND_EXPR, nonatomic_type, func_call, tmp);
}
@@ -3615,6 +3619,7 @@ build_atomic_assign (location_t loc, tree lhs, enum tree_code modifycode,
nonatomic_rhs_type = build_qualified_type (rhs_type, TYPE_UNQUALIFIED);
val = create_tmp_var (nonatomic_rhs_type, NULL);
TREE_ADDRESSABLE (val) = 1;
+ TREE_NO_WARNING (val) = 1;
rhs = build2 (MODIFY_EXPR, nonatomic_rhs_type, val, rhs);
SET_EXPR_LOCATION (rhs, loc);
add_stmt (rhs);
@@ -3643,7 +3648,8 @@ build_atomic_assign (location_t loc, tree lhs, enum tree_code modifycode,
/* Create the variables and labels required for the op= form. */
old = create_tmp_var (nonatomic_lhs_type, NULL);
old_addr = build_unary_op (loc, ADDR_EXPR, old, 0);
- TREE_ADDRESSABLE (val) = 1;
+ TREE_ADDRESSABLE (old) = 1;
+ TREE_NO_WARNING (old) = 1;
newval = create_tmp_var (nonatomic_lhs_type, NULL);
newval_addr = build_unary_op (loc, ADDR_EXPR, newval, 0);
@@ -9661,6 +9667,7 @@ emit_side_effect_warnings (location_t loc, tree expr)
if (!TREE_SIDE_EFFECTS (r)
&& !VOID_TYPE_P (TREE_TYPE (r))
&& !CONVERT_EXPR_P (r)
+ && !TREE_NO_WARNING (r)
&& !TREE_NO_WARNING (expr))
warning_at (cloc, OPT_Wunused_value,
"right-hand operand of comma expression has no effect");
diff --git gcc/testsuite/gcc.dg/pr60195.c gcc/testsuite/gcc.dg/pr60195.c
index e69de29..0a50a30 100644
--- gcc/testsuite/gcc.dg/pr60195.c
+++ gcc/testsuite/gcc.dg/pr60195.c
@@ -0,0 +1,56 @@
+/* PR c/60195 */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -Wpedantic -Wall" } */
+
+typedef _Atomic int atomic_int;
+
+atomic_int
+fn1 (void)
+{
+ atomic_int y = 0;
+ return y;
+}
+
+atomic_int
+fn2 (void)
+{
+ atomic_int y = 0;
+ y;
+ return y;
+}
+
+atomic_int
+fn3 (void)
+{
+ atomic_int y = 0;
+ y++;
+ return y;
+}
+
+void
+fn4 (void)
+{
+ atomic_int y;
+ y = 0;
+ (void) y;
+}
+
+void
+fn5 (void)
+{
+ atomic_int y = 0; /* { dg-warning "unused variable" } */
+}
+
+void
+fn6 (void)
+{
+ atomic_int y; /* { dg-warning "set but not used" } */
+ y = 0;
+}
+
+void
+fn7 (void)
+{
+ atomic_int y = 0;
+ y++;
+}
Marek
More information about the Gcc-patches
mailing list