diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 64068a2cab5ae210f242e579a0c7ff608d7c678f..583d13ff584cc684f0c6e726a0eea1e6c0f29669 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2003-07-28  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/11530
+	* parser.c (cp_parser_postfix_expression): Do not call mark_used.
+	* semantics.c (finish_id_expression): Call mark_used for all
+	declarations.
+
 2003-07-28  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/11667
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 1b7b3def8b792e91d835e56087ba0fa57103e4e3..00f1c6eda4fe3a2d7ff14aa6a56cfd46b968dfa6 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -3428,10 +3428,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p)
 	return postfix_expression;
     }
 
-  /* Remember that there was a reference to this entity.  */
-  if (DECL_P (postfix_expression))
-    mark_used (postfix_expression);
-
   /* Keep looping until the postfix-expression is complete.  */
   while (true)
     {
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index abfe08633d6f9b90812f86f548015ae4ca79a9d0..bf30ca08b8f1045e91ef9751eaed9e0f8e009fa8 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -2486,19 +2486,8 @@ finish_id_expression (tree id_expression,
 	      *non_constant_expression_p = true;
 	    }
 	}
-
-      if (scope)
-	{
-	  decl = (adjust_result_of_qualified_name_lookup 
-		  (decl, scope, current_class_type));
-	  if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl))
-	    *qualifying_class = scope;
-	  else if (!processing_template_decl)
-	    decl = convert_from_reference (decl);
-	  else if (TYPE_P (scope))
-	    decl = build (SCOPE_REF, TREE_TYPE (decl), scope, decl);
-	}
-      else if (TREE_CODE (decl) == NAMESPACE_DECL)
+      
+      if (TREE_CODE (decl) == NAMESPACE_DECL)
 	{
 	  error ("use of namespace `%D' as expression", decl);
 	  return error_mark_node;
@@ -2516,6 +2505,25 @@ finish_id_expression (tree id_expression,
 	  print_candidates (decl);
 	  return error_mark_node;
 	}
+
+      /* Mark variable-like entities as used.  Functions are similarly
+	 marked either below or after overload resolution.  */
+      if (TREE_CODE (decl) == VAR_DECL
+	  || TREE_CODE (decl) == PARM_DECL
+	  || TREE_CODE (decl) == RESULT_DECL)
+	mark_used (decl);
+
+      if (scope)
+	{
+	  decl = (adjust_result_of_qualified_name_lookup 
+		  (decl, scope, current_class_type));
+	  if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl))
+	    *qualifying_class = scope;
+	  else if (!processing_template_decl)
+	    decl = convert_from_reference (decl);
+	  else if (TYPE_P (scope))
+	    decl = build (SCOPE_REF, TREE_TYPE (decl), scope, decl);
+	}
       else if (TREE_CODE (decl) == FIELD_DECL)
 	decl = finish_non_static_data_member (decl, current_class_ref,
 					      /*qualifying_scope=*/NULL_TREE);
@@ -2525,7 +2533,10 @@ finish_id_expression (tree id_expression,
 
 	  if (TREE_CODE (first_fn) == TEMPLATE_DECL)
 	    first_fn = DECL_TEMPLATE_RESULT (first_fn);
-	  
+
+	  if (!really_overloaded_fn (decl))
+	    mark_used (first_fn);
+
 	  if (TREE_CODE (first_fn) == FUNCTION_DECL
 	      && DECL_FUNCTION_MEMBER_P (first_fn))
 	    {
@@ -2533,9 +2544,6 @@ finish_id_expression (tree id_expression,
 	      decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
 	      return finish_class_member_access_expr (decl, id_expression);
 	    }
-	  else if (!really_overloaded_fn (decl))
-	    /* not really overloaded function */
-	    mark_used (first_fn);
 	}
       else
 	{
@@ -2566,8 +2574,6 @@ finish_id_expression (tree id_expression,
 	      perform_or_defer_access_check (TYPE_BINFO (path), decl);
 	    }
 	  
-	  mark_used (decl);
-	  
 	  if (! processing_template_decl)
 	    decl = convert_from_reference (decl);
 	}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f0171688fcbc55b358e7edd7df790b33185744bc..6b59e6a9b0c4c478b6cdc01996803722319efe79 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-28  Jan Hubicka  <jh@suse.cz>
+
+	PR c++/11530
+	* g++.dg/opt/call1.C: New test.
+
 2003-07-28  Alexandre Oliva <aoliva@redhat.com>
 
 	PR c++/11667
diff --git a/gcc/testsuite/g++.dg/opt/call1.C b/gcc/testsuite/g++.dg/opt/call1.C
new file mode 100644
index 0000000000000000000000000000000000000000..642e024084927a7dd7ac4cfbbf969bbd2cccb33a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/call1.C
@@ -0,0 +1,21 @@
+// { dg-options "-O2" }
+
+void a (void (*f)())
+{
+  f();
+}
+
+struct RunState
+{
+  static void runcallback() { }
+  static void wait()
+  {
+    a (runcallback);
+  }
+};
+
+int main()
+{
+  RunState::wait();
+  return 0;
+}