OSDN Git Service

PR c++/3478
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Jan 2004 20:33:35 +0000 (20:33 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Jan 2004 20:33:35 +0000 (20:33 +0000)
* parser.c (cp_parser_decl_specifier_seq): If the first decl_spec
is error_mark_node, don't add any more decl_specs.
(cp_parser_init_declarator): After committing to a declaration, if
the decl_specifiers start with error_mark_node, issue an error and
change the type to "int".

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75688 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c

index 24e088f..2d100c8 100644 (file)
@@ -1,3 +1,12 @@
+2004-01-11  Ian Lance Taylor  <ian@wasabisystems.com>
+
+       PR c++/3478
+       * parser.c (cp_parser_decl_specifier_seq): If the first decl_spec
+       is error_mark_node, don't add any more decl_specs.
+       (cp_parser_init_declarator): After committing to a declaration, if
+       the decl_specifiers start with error_mark_node, issue an error and
+       change the type to "int".
+
 2004-01-09  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        PR bootstrap/7817
index a9e50ec..2f5c9d9 100644 (file)
@@ -6717,7 +6717,8 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
        }
 
       /* Add the DECL_SPEC to the list of specifiers.  */
-      decl_specs = tree_cons (NULL_TREE, decl_spec, decl_specs);
+      if (decl_specs == NULL || TREE_VALUE (decl_specs) != error_mark_node)
+       decl_specs = tree_cons (NULL_TREE, decl_spec, decl_specs);
 
       /* After we see one decl-specifier, further decl-specifiers are
         always optional.  */
@@ -9818,6 +9819,17 @@ cp_parser_init_declarator (cp_parser* parser,
      possibly be looking at any other construct.  */
   cp_parser_commit_to_tentative_parse (parser);
 
+  /* If the decl specifiers were bad, issue an error now that we're
+     sure this was intended to be a declarator.  Then continue
+     declaring the variable(s), as int, to try to cut down on further
+     errors.  */
+  if (decl_specifiers != NULL
+      && TREE_VALUE (decl_specifiers) == error_mark_node)
+    {
+      cp_parser_error (parser, "invalid type in declaration");
+      TREE_VALUE (decl_specifiers) = integer_type_node;
+    }
+
   /* Check to see whether or not this declaration is a friend.  */
   friend_p = cp_parser_friend_p (decl_specifiers);