re PR c++/16002 (Strange error message with new parser)
authorMark Mitchell <mark@codesourcery.com>
Fri, 17 Sep 2004 07:01:11 +0000 (07:01 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 17 Sep 2004 07:01:11 +0000 (07:01 +0000)
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++/16002
* g++.dg/template/error18.C: New test.

PR c++/16029
* g++.dg/warn/Wunused-8.C: New test.

From-SVN: r87633

gcc/cp/ChangeLog
gcc/cp/lex.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/error18.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wunused-8.C [new file with mode: 0644]

index 8d5e2d425cfa65102427b705cfa04677fe3d3d43..1a862ad9c662a68112122bcffe9407396c185286 100644 (file)
@@ -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".
index 6157b7f10ff94aa0378e92576e01dbc51d8ddd11..4fa1645d6a2ed8d69ffc9d47428fa326d9b6dc79 100644 (file)
@@ -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;
        }
     }
 
index bfe749c8483a3206d8edb6219871768f5686eb70..d4b12aadfd6226d045c74db0c39b2b89c9e2aae1 100644 (file)
@@ -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;
     }
 
index 85bc7ed985b18a6b73899953d8a7a49eb18719d8..d03730861cdd818d9ee46f8fcd926946ecc16aba 100644 (file)
@@ -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 (file)
index 0000000..363aae9
--- /dev/null
@@ -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 (file)
index 0000000..a1c8a1f
--- /dev/null
@@ -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" }
+}