diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 95933ac0245c979ab6df94db8d8a82890b3533c1..cd1af6f8a9153b05ad0d11e3b005261ca2e794ec 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2006-09-06  Jason Merrill  <jason@redhat.com>
+
+	PR c++/26696
+	* cvt.c (convert_to_void): Replace a subexpression with no side 
+	effects with void_zero_node.
+	* tree.c (is_overloaded_fn): Look through COMPONENT_REF.
+	(get_first_fn): Ditto.
+	* decl.c (grokdeclarator): No need to look through COMPONENT_REF.
+
 2006-09-05  Jason Merrill  <jason@redhat.com>
 
 	PR c++/26571
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 710bc74ccde801abf206464532435bd575ee354b..83b35d6fc763c0cfed4a9808fd6e1e8c587735cc 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -960,6 +960,8 @@ convert_to_void (tree expr, const char *implicit)
 	}
       expr = build1 (CONVERT_EXPR, void_type_node, expr);
     }
+  if (! TREE_SIDE_EFFECTS (expr))
+    expr = void_zero_node;
   return expr;
 }
 
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 542fcbe40af0b864eff4637810bfc82e048b9fad..95f0695c6f685dac75ab5c17c1206fbe92076414 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7014,8 +7014,6 @@ grokdeclarator (const cp_declarator *declarator,
 		  tree fns = TREE_OPERAND (decl, 0);
 
 		  dname = fns;
-		  if (TREE_CODE (dname) == COMPONENT_REF)
-		    dname = TREE_OPERAND (dname, 1);
 		  if (TREE_CODE (dname) != IDENTIFIER_NODE)
 		    {
 		      gcc_assert (is_overloaded_fn (dname));
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index db7e40a9cd45376c202bbf33732623b68b90ff6e..89941cc554282927427fc13cc8b51146316cb8df 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -853,7 +853,8 @@ int
 is_overloaded_fn (tree x)
 {
   /* A baselink is also considered an overloaded function.  */
-  if (TREE_CODE (x) == OFFSET_REF)
+  if (TREE_CODE (x) == OFFSET_REF
+      || TREE_CODE (x) == COMPONENT_REF)
     x = TREE_OPERAND (x, 1);
   if (BASELINK_P (x))
     x = BASELINK_FUNCTIONS (x);
@@ -880,6 +881,8 @@ get_first_fn (tree from)
 {
   gcc_assert (is_overloaded_fn (from));
   /* A baselink is also considered an overloaded function.  */
+  if (TREE_CODE (from) == COMPONENT_REF)
+    from = TREE_OPERAND (from, 1);
   if (BASELINK_P (from))
     from = BASELINK_FUNCTIONS (from);
   return OVL_CURRENT (from);
diff --git a/gcc/testsuite/g++.dg/other/component1.C b/gcc/testsuite/g++.dg/other/component1.C
index 80b95609d0ed2cacdf6fd202a0fd2b80d8dea979..601e019ae74d1bb2e19365e7976f61445d90b137 100644
--- a/gcc/testsuite/g++.dg/other/component1.C
+++ b/gcc/testsuite/g++.dg/other/component1.C
@@ -23,7 +23,7 @@ void Foo () {
   c.f;		        // { dg-error "statement cannot resolve" "" }
   c.f<int>;		// { dg-error "statement cannot resolve" "" }
   
-  c.g == 1;		// { dg-error "invalid use of" "" }
-  c.f == 1;		// { dg-error "invalid use of" "" }
-  c.f<int> == 1;	// { dg-error "invalid use of" "" }
+  c.g == 1;		// { dg-error "invalid" "" }
+  c.f == 1;		// { dg-error "invalid" "" }
+  c.f<int> == 1;	// { dg-error "invalid" "" }
 }
diff --git a/gcc/testsuite/g++.dg/warn/noeffect8.C b/gcc/testsuite/g++.dg/warn/noeffect8.C
new file mode 100644
index 0000000000000000000000000000000000000000..99d3688149b03ccf2996dceaf56727b84a98ec2a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/noeffect8.C
@@ -0,0 +1,12 @@
+// PR c++/26696
+
+struct A
+{
+  static void f() {}
+}; 
+
+int main() 
+{
+  A a; 
+  a.f;    			// { dg-warning "not call" }
+}