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
+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...
+ else
+ {
+ /* Set a dummy type here to avoid warning about implicit 'int'. */
+ specs->type = integer_type_node;
+ }
&& 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;
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;
}
c_parser_declspecs (parser, specs, true, true, start_attr_ok);
}
c_parser_declspecs (parser, specs, true, true, start_attr_ok);
{
/* 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;
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;
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))
}
/* 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))