Joseph, you were the last one in this part of
c_parser_switch_statement, but the change you made was for supporting
atomics.  I'm not sure if you'll have context here or not.

PR88660 is a false positive warning for a set-but-unused object.  We
can see trivially from the testcase that "i" is used in the switch
expression, but we get a set-but-unused warning.

In the last major change in this code was ~5 years ago and twiddled the
handling of the switch expression to call convert_lvalue_to_rvalue.

The last argument to that function indicates whether or not we should
mark the switch expression as a use of the object.  We're currently
passing in "false" so the object doesn't get marked and we get the
bogus warning.

The obvious fix is to pass in "true", which is what the proposed patch
does.  If there's a reason we can't/shouldn't do that in this case we
could call mark_exp_read on the switch expression at some point other
point.

Bootstrapped and regression tested on x86_64.  OK for the trunk?

Jeff
Mark switch expression as used to avoid bogus warning

        PR c/88660
        * c-parser.c (c_parser_switch_statement): Make sure to request
        marking the switch expr as used.

        PR c/88660
        * gcc.dg/pr88660.c: New test.
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 6164017de02..1e8f2f7108d 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -6607,7 +6607,7 @@ c_parser_switch_statement (c_parser *parser, bool *if_p)
          && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
        explicit_cast_p = true;
       ce = c_parser_expression (parser);
-      ce = convert_lvalue_to_rvalue (switch_cond_loc, ce, true, false);
+      ce = convert_lvalue_to_rvalue (switch_cond_loc, ce, true, true);
       expr = ce.value;
       /* ??? expr has no valid location?  */
       parens.skip_until_found_close (parser);
diff --git a/gcc/testsuite/gcc.dg/pr88660.c b/gcc/testsuite/gcc.dg/pr88660.c
new file mode 100644
index 00000000000..09a2d3270bd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr88660.c
@@ -0,0 +1,13 @@
+/* { dg-do-compile } */
+/* { dg-options "-O -Wunused-but-set-variable" } */
+
+int main(void)
+{
+       const int i = 0;
+       switch(i)
+       {
+       default: break;
+       }
+}
+
+

Reply via email to