aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-06-07 19:50:10 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-06-07 19:50:10 +0200
commitd84686d14a6df2fbfe72830c1f6dc7456cca751e (patch)
tree6bf1acdbbbfd98a7996cc0ee8d991ab35560999a /gcc
parent026698d28e6eac591edfc8b1fd397e73b0503c56 (diff)
downloadgcc-d84686d14a6df2fbfe72830c1f6dc7456cca751e.zip
gcc-d84686d14a6df2fbfe72830c1f6dc7456cca751e.tar.gz
gcc-d84686d14a6df2fbfe72830c1f6dc7456cca751e.tar.bz2
re PR c++/44444 (-Wunused-but-set-variable problem with field references)
PR c++/44444 * expr.c (mark_exp_read): Handle INDIRECT_REF. * cvt.c (convert_to_void): Handle INDIRECT_REF like handled_component_p. * g++.dg/warn/Wunused-var-12.C: New test. From-SVN: r160388
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cvt.c4
-rw-r--r--gcc/cp/expr.c3
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-12.C36
5 files changed, 49 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 622a793..3bfd7f1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2010-06-07 Jakub Jelinek <jakub@redhat.com>
+ PR c++/44444
+ * expr.c (mark_exp_read): Handle INDIRECT_REF.
+ * cvt.c (convert_to_void): Handle INDIRECT_REF like
+ handled_component_p.
+
PR c++/44443
* decl.c (initialize_local_var): If TREE_USED is set on the type,
set also DECL_READ_P on the decl.
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 4aee151..04c068c 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -834,7 +834,9 @@ convert_to_void (tree expr, const char *implicit, tsubst_flags_t complain)
while (TREE_CODE (exprv) == COMPOUND_EXPR)
exprv = TREE_OPERAND (exprv, 1);
- if (DECL_P (exprv) || handled_component_p (exprv))
+ if (DECL_P (exprv)
+ || handled_component_p (exprv)
+ || TREE_CODE (exprv) == INDIRECT_REF)
/* Expr is not being 'used' here, otherwise we whould have
called mark_{rl}value_use use here, which would have in turn
called mark_exp_read. Rather, we call mark_exp_read directly
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index ef5d6be..0a0ba53 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -1,7 +1,7 @@
/* Convert language-specific tree expression to rtl instructions,
for GNU compiler.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 2000, 2001, 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
+ 2000, 2001, 2002, 2003, 2004, 2007, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -132,6 +132,7 @@ mark_exp_read (tree exp)
case IMAGPART_EXPR:
CASE_CONVERT:
case ADDR_EXPR:
+ case INDIRECT_REF:
mark_exp_read (TREE_OPERAND (exp, 0));
break;
case COMPOUND_EXPR:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a2ac156..70d709e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2010-06-07 Jakub Jelinek <jakub@redhat.com>
+ PR c++/44444
+ * g++.dg/warn/Wunused-var-12.C: New test.
+
PR c++/44443
* c-c++-common/Wunused-var-11.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-12.C b/gcc/testsuite/g++.dg/warn/Wunused-var-12.C
new file mode 100644
index 0000000..3300cbe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-12.C
@@ -0,0 +1,36 @@
+// PR c++/44444
+// { dg-do compile }
+// { dg-options "-Wunused" }
+
+struct S
+{
+ const int &u;
+ const int &v;
+ S (const int &a, const int &b) : u(a), v(b) { }
+};
+
+bool
+f1 ()
+{
+ bool t = false;
+ S z = S (1, 2);
+ t |= z.u == 1;
+ t |= z.v == 2;
+ return t;
+}
+
+void
+f2 ()
+{
+ S z = S (1, 2);
+ z.u; // { dg-warning "no effect" }
+}
+
+int i;
+
+void
+f3 ()
+{
+ S z = S (1, 2);
+ i++, z.u; // { dg-warning "no effect" }
+}