]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/46462 (Revision 166700 caused new C test failures)
authorPaolo Bonzini <bonzini@gnu.org>
Sun, 14 Nov 2010 13:10:41 +0000 (13:10 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Sun, 14 Nov 2010 13:10:41 +0000 (13:10 +0000)
2010-11-13  Paolo Bonzini  <bonzini@gnu.org>

PR c/46462
* c-decl.c (declspecs_add_type): Make variables with error types
integers.
* c-parser.c (c_parser_next_tokens_start_declaration): Two IDs
do not start a declaration before an Objective-C foreach.
(c_parser_declaration_or_fndef): Improve recovery after unknown
type name.
(c_parser_for_statement): Hoist entrance of "foreach context"
before ifs, add corresponding reset where it was missing.  Do
not set objc_could_be_foreach_context for C.

From-SVN: r166732

gcc/ChangeLog
gcc/c-decl.c
gcc/c-parser.c

index d4793931a3721c8214a458720ffd4d071d6726e6..ea3e335bbd147ca323c821cb6042753cb716a1a4 100644 (file)
@@ -1,3 +1,16 @@
+2010-11-13  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR c/46462
+       * c-decl.c (declspecs_add_type): Make variables with error types
+       integers.
+       * c-parser.c (c_parser_next_tokens_start_declaration): Two IDs
+       do not start a declaration before an Objective-C foreach.
+       (c_parser_declaration_or_fndef): Improve recovery after unknown
+       type name.
+       (c_parser_for_statement): Hoist entrance of "foreach context"
+       before ifs, add corresponding reset where it was missing.  Do
+       not set objc_could_be_foreach_context for C.
+
 2010-11-14  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR tree-optimization/45722
 2010-11-14  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR tree-optimization/45722
        Check that the pubtypes table has at least one unpruned entry before
        trying to emit it.
 
        Check that the pubtypes table has at least one unpruned entry before
        trying to emit it.
 
-2010-10-30  Paolo Bonzini  <bonzini@gnu.org>
+2010-11-13  Paolo Bonzini  <bonzini@gnu.org>
 
        PR c/20385
        * c-parser.c (c_parser_next_token_starts_declaration): Rename to...
 
        PR c/20385
        * c-parser.c (c_parser_next_token_starts_declaration): Rename to...
index c0d5a4922c331ac1ab9e475b73218d3c83ccbc37..bab402d90f81fa221bc4935a4ccb2ce3de8d7eba 100644 (file)
@@ -9324,6 +9324,11 @@ declspecs_add_type (location_t loc, struct c_declspecs *specs,
        }
       specs->type = type;
     }
        }
       specs->type = type;
     }
+  else
+    {
+      /* Set a dummy type here to avoid warning about implicit 'int'.  */
+      specs->type = integer_type_node;
+    }
 
   return specs;
 }
 
   return specs;
 }
index e5ec2d9b38838098e7adcf4f6dd8f5f4f212ef1f..577528d8b44aac73d242249ae6c5413cafc2ec65 100644 (file)
@@ -641,7 +641,10 @@ c_parser_next_tokens_start_declaration (c_parser *parser)
       && token->id_kind == C_ID_ID
       && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
           || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
       && token->id_kind == C_ID_ID
       && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
           || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
-      && !lookup_name (token->value))
+      && !lookup_name (token->value)
+
+      /* Do not try too hard when we could have "object in array".  */
+      && !parser->objc_could_be_foreach_context)
     return true;
 
   return false;
     return true;
 
   return false;
@@ -1373,10 +1376,12 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
                 c_parser_peek_token (parser)->value);
 
       /* Parse declspecs normally to get a correct pointer type, but avoid
                 c_parser_peek_token (parser)->value);
 
       /* Parse declspecs normally to get a correct pointer type, but avoid
-         a further "fails to be a type name" error.  */
+         a further "fails to be a type name" error.  Refuse nested functions
+         since it is not how the user likely wants us to recover.  */
       c_parser_peek_token (parser)->type = CPP_KEYWORD;
       c_parser_peek_token (parser)->keyword = RID_VOID;
       c_parser_peek_token (parser)->value = error_mark_node;
       c_parser_peek_token (parser)->type = CPP_KEYWORD;
       c_parser_peek_token (parser)->keyword = RID_VOID;
       c_parser_peek_token (parser)->value = error_mark_node;
+      fndef_ok = !nested;
     }
 
   c_parser_declspecs (parser, specs, true, true, start_attr_ok);
     }
 
   c_parser_declspecs (parser, specs, true, true, start_attr_ok);
@@ -4653,14 +4658,15 @@ c_parser_for_statement (c_parser *parser)
     {
       /* Parse the initialization declaration or expression.  */
       object_expression = error_mark_node;
     {
       /* Parse the initialization declaration or expression.  */
       object_expression = error_mark_node;
+      parser->objc_could_be_foreach_context = c_dialect_objc ();
       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
        {
       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
        {
+         parser->objc_could_be_foreach_context = false;
          c_parser_consume_token (parser);
          c_finish_expr_stmt (loc, NULL_TREE);
        }
       else if (c_parser_next_tokens_start_declaration (parser))
        {
          c_parser_consume_token (parser);
          c_finish_expr_stmt (loc, NULL_TREE);
        }
       else if (c_parser_next_tokens_start_declaration (parser))
        {
-         parser->objc_could_be_foreach_context = true;
          c_parser_declaration_or_fndef (parser, true, true, true, true, true, 
                                         &object_expression);
          parser->objc_could_be_foreach_context = false;
          c_parser_declaration_or_fndef (parser, true, true, true, true, true, 
                                         &object_expression);
          parser->objc_could_be_foreach_context = false;
@@ -4690,7 +4696,6 @@ c_parser_for_statement (c_parser *parser)
              int ext;
              ext = disable_extension_diagnostics ();
              c_parser_consume_token (parser);
              int ext;
              ext = disable_extension_diagnostics ();
              c_parser_consume_token (parser);
-             parser->objc_could_be_foreach_context = true;
              c_parser_declaration_or_fndef (parser, true, true, true, true,
                                             true, &object_expression);
              parser->objc_could_be_foreach_context = false;
              c_parser_declaration_or_fndef (parser, true, true, true, true,
                                             true, &object_expression);
              parser->objc_could_be_foreach_context = false;
@@ -4714,7 +4719,6 @@ c_parser_for_statement (c_parser *parser)
        init_expr:
          {
            tree init_expression;
        init_expr:
          {
            tree init_expression;
-           parser->objc_could_be_foreach_context = true;
            init_expression = c_parser_expression (parser).value;
            parser->objc_could_be_foreach_context = false;
            if (c_parser_next_token_is_keyword (parser, RID_IN))
            init_expression = c_parser_expression (parser).value;
            parser->objc_could_be_foreach_context = false;
            if (c_parser_next_token_is_keyword (parser, RID_IN))
@@ -4735,6 +4739,7 @@ c_parser_for_statement (c_parser *parser)
        }
       /* Parse the loop condition.  In the case of a foreach
         statement, there is no loop condition.  */
        }
       /* Parse the loop condition.  In the case of a foreach
         statement, there is no loop condition.  */
+      gcc_assert (!parser->objc_could_be_foreach_context);
       if (!is_foreach_statement)
        {
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
       if (!is_foreach_statement)
        {
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))