diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8d5e2d425cfa..1a862ad9c662 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,15 @@
 2004-09-16  Mark Mitchell  <mark@codesourcery.com>
 
+	PR c++/16002
+	* parser.c (cp_parser_simple_declaration): Commit to tentative
+	parses after seeing a decl-specifier.
+	(cp_parser_simple_declaration): Eliminate spurious message.
+	(cp_parser_init_declarator): Adjust error message.
+
+	PR c++/16029
+	* lex.c (unqualified_name_lookup_error): Mark the dummy
+	declaration as used.
+
 	PR c++/17501
 	* parser.c (cp_parser_nested_name_specifier): Do not resolve
 	typename types if the user explicitly said "typename".
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 6157b7f10ff9..4fa1645d6a2e 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -572,6 +572,9 @@ unqualified_name_lookup_error (tree name)
 	  decl = build_decl (VAR_DECL, name, error_mark_node);
 	  DECL_CONTEXT (decl) = current_function_decl;
 	  push_local_binding (name, decl, 0);
+	  /* Mark the variable as used so that we do not get warnings
+	     about it being unused later.  */
+	  TREE_USED (decl) = 1;
 	}
     }
 
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index bfe749c8483a..d4b12aadfd62 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7026,6 +7026,13 @@ cp_parser_simple_declaration (cp_parser* parser,
       /* Give up.  */
       goto done;
     }
+  
+  /* If we have seen at least one decl-specifier, and the next token
+     is not a parenthesis, then we must be looking at a declaration.
+     (After "int (" we might be looking at a functional cast.)  */
+  if (decl_specifiers.any_specifiers_p 
+      && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
+    cp_parser_commit_to_tentative_parse (parser);
 
   /* Keep going until we hit the `;' at the end of the simple
      declaration.  */
@@ -7079,7 +7086,12 @@ cp_parser_simple_declaration (cp_parser* parser,
       /* Anything else is an error.  */
       else
 	{
-	  cp_parser_error (parser, "expected `,' or `;'");
+	  /* If we have already issued an error message we don't need
+	     to issue another one.  */
+	  if (decl != error_mark_node
+	      || (cp_parser_parsing_tentatively (parser)
+		  && !cp_parser_committed_to_tentative_parse (parser)))
+	    cp_parser_error (parser, "expected `,' or `;'");
 	  /* Skip tokens until we reach the end of the statement.  */
 	  cp_parser_skip_to_end_of_statement (parser);
 	  /* If the next token is now a `;', consume it.  */
@@ -10641,7 +10653,7 @@ cp_parser_init_declarator (cp_parser* parser,
       && token->type != CPP_COMMA
       && token->type != CPP_SEMICOLON)
     {
-      cp_parser_error (parser, "expected init-declarator");
+      cp_parser_error (parser, "expected initializer");
       return error_mark_node;
     }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 85bc7ed985b1..d03730861cdd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2004-09-17  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/16002
+	* g++.dg/template/error18.C: New test.
+	
+	PR c++/16029
+	* g++.dg/warn/Wunused-8.C: New test.
+
 2004-09-17  Steven Bosscher  <stevenb@suse.de>
 
 	PR tree-optimization/17513
diff --git a/gcc/testsuite/g++.dg/parse/error18.C b/gcc/testsuite/g++.dg/parse/error18.C
new file mode 100644
index 000000000000..363aae998798
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error18.C
@@ -0,0 +1,7 @@
+// PR c++/16002
+
+void f()
+{
+  double Q *= 5.0; // { dg-error "initializer" }
+}
+
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-8.C b/gcc/testsuite/g++.dg/warn/Wunused-8.C
new file mode 100644
index 000000000000..a1c8a1fb4268
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-8.C
@@ -0,0 +1,9 @@
+// PR c++/16029
+// { dg-options "-Wunused" }
+
+int main ()
+{
+  // We should not see an "unused" warning about "whatever" on the
+  // next line.
+  return whatever (); // { dg-error "declared" }
+}