From d84686d14a6df2fbfe72830c1f6dc7456cca751e Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Mon, 7 Jun 2010 19:50:10 +0200
Subject: [PATCH] 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
---
 gcc/cp/ChangeLog                           |  5 +++
 gcc/cp/cvt.c                               |  4 ++-
 gcc/cp/expr.c                              |  3 +-
 gcc/testsuite/ChangeLog                    |  3 ++
 gcc/testsuite/g++.dg/warn/Wunused-var-12.C | 36 ++++++++++++++++++++++
 5 files changed, 49 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-var-12.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 622a79349b0f..3bfd7f1e4b25 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 4aee15111ed9..04c068cb3e89 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 ef5d6be3c5b6..0a0ba534063c 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 a2ac15621ce9..70d709eb0761 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 000000000000..3300cbe3d8ad
--- /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" }
+}
-- 
GitLab