diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 622a79349b0fd120dc864379317d2109ba66d5da..3bfd7f1e4b254179dc5b1d2905d0a82054241c72 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 4aee15111ed9e7a1eb9e7a1a28ad35c47a05af04..04c068cb3e89f573b167f5b6fad1c6c7ddc86843 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 ef5d6be3c5b6f149c6c34f59e6ebd7cc588213b4..0a0ba534063cfc808ed225a29ce2b128ee68aa91 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 a2ac15621ce9355dab4b21f97e3d046c3916a789..70d709eb0761acef53060cfc6996e9bf6bc1d1cb 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 0000000000000000000000000000000000000000..3300cbe3d8ad5a70e020423c8974aaa8086db4e1
--- /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" }
+}