This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C/C++ PATCH] Fix -Wunused-but-set* with computed goto (PR c/46015)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 18 Oct 2010 17:00:19 +0200
- Subject: [C/C++ PATCH] Fix -Wunused-but-set* with computed goto (PR c/46015)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
As the testcase shows, mark_exp_read wasn't being called on computed goto's
argument, leading to spurious -Wunused-but-set* warnings.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?
2010-10-18 Jakub Jelinek <jakub@redhat.com>
PR c/46015
* c-parser.c (c_parser_statement_after_labels): Call mark_exp_read
on computed goto argument.
* semantics.c (finish_goto_stmt): Call mark_rvalue_use on computed
goto destination.
* c-c++-common/Wunused-var-13.c: New test.
--- gcc/c-parser.c.jj 2010-10-07 19:45:22.000000000 +0200
+++ gcc/c-parser.c 2010-10-18 13:34:24.000000000 +0200
@@ -4116,9 +4116,12 @@ c_parser_statement_after_labels (c_parse
}
else if (c_parser_next_token_is (parser, CPP_MULT))
{
+ tree val;
+
c_parser_consume_token (parser);
- stmt = c_finish_goto_ptr (loc,
- c_parser_expression (parser).value);
+ val = c_parser_expression (parser).value;
+ mark_exp_read (val);
+ stmt = c_finish_goto_ptr (loc, val);
}
else
c_parser_error (parser, "expected identifier or %<*%>");
--- gcc/cp/semantics.c.jj 2010-09-17 14:10:56.000000000 +0200
+++ gcc/cp/semantics.c 2010-10-18 14:00:06.000000000 +0200
@@ -537,6 +537,7 @@ finish_goto_stmt (tree destination)
TREE_USED (destination) = 1;
else
{
+ destination = mark_rvalue_use (destination);
if (!processing_template_decl)
{
destination = cp_convert (ptr_type_node, destination);
--- gcc/testsuite/c-c++-common/Wunused-var-13.c.jj 2010-10-18 14:01:07.000000000 +0200
+++ gcc/testsuite/c-c++-common/Wunused-var-13.c 2010-10-18 14:01:59.000000000 +0200
@@ -0,0 +1,27 @@
+/* PR c/46015 */
+/* { dg-options "-Wunused" } */
+/* { dg-do compile } */
+
+int
+f1 (int i)
+{
+ static void *labs[2] = { &&lab1, &&lab2 };
+ goto *(labs[i & 1]);
+
+lab1:
+ return 1;
+lab2:
+ return 2;
+}
+
+int
+f2 (int i)
+{
+ void *labs[2] = { &&lab1, &&lab2 };
+ goto *labs[i & 1];
+
+lab1:
+ return 1;
+lab2:
+ return 2;
+}
Jakub