/* Basic concepts [gram.basic] */
-static bool cp_parser_translation_unit
- (cp_parser *);
+static void cp_parser_translation_unit (cp_parser *);
/* Expressions [gram.expr] */
/* Parse a translation-unit.
translation-unit:
- declaration-seq [opt]
-
- Returns TRUE if all went well. */
+ declaration-seq [opt] */
-static bool
+static void
cp_parser_translation_unit (cp_parser* parser)
{
- /* The address of the first non-permanent object on the declarator
- obstack. */
- static void *declarator_obstack_base;
-
- bool success;
+ gcc_checking_assert (!cp_error_declarator);
+
+ /* Create the declarator obstack. */
+ gcc_obstack_init (&declarator_obstack);
+ /* Create the error declarator. */
+ cp_error_declarator = make_declarator (cdk_error);
+ /* Create the empty parameter list. */
+ no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE,
+ UNKNOWN_LOCATION);
+ /* Remember where the base of the declarator obstack lies. */
+ void *declarator_obstack_base = obstack_next_free (&declarator_obstack);
- /* Create the declarator obstack, if necessary. */
- if (!cp_error_declarator)
+ for (;;)
{
- gcc_obstack_init (&declarator_obstack);
- /* Create the error declarator. */
- cp_error_declarator = make_declarator (cdk_error);
- /* Create the empty parameter list. */
- no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE,
- UNKNOWN_LOCATION);
- /* Remember where the base of the declarator obstack lies. */
- declarator_obstack_base = obstack_next_free (&declarator_obstack);
+ cp_parser_declaration_seq_opt (parser);
+ gcc_assert (!cp_parser_parsing_tentatively (parser));
+ if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
+ break;
+ /* Must have been an extra close-brace. */
+ cp_parser_error (parser, "expected declaration");
+ cp_lexer_consume_token (parser->lexer);
+ /* If the next token is now a `;', consume it. */
+ if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
+ cp_lexer_consume_token (parser->lexer);
}
- cp_parser_declaration_seq_opt (parser);
-
- /* If there are no tokens left then all went well. */
- if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
- {
- /* Get rid of the token array; we don't need it any more. */
- cp_lexer_destroy (parser->lexer);
- parser->lexer = NULL;
-
- /* This file might have been a context that's implicitly extern
- "C". If so, pop the lang context. (Only relevant for PCH.) */
- if (parser->implicit_extern_c)
- {
- pop_lang_context ();
- parser->implicit_extern_c = false;
- }
-
- /* Finish up. */
- finish_translation_unit ();
-
- success = true;
- }
- else
+ /* Get rid of the token array; we don't need it any more. */
+ cp_lexer_destroy (parser->lexer);
+ parser->lexer = NULL;
+
+ /* This file might have been a context that's implicitly extern
+ "C". If so, pop the lang context. (Only relevant for PCH.) */
+ if (parser->implicit_extern_c)
{
- cp_parser_error (parser, "expected declaration");
- success = false;
+ pop_lang_context ();
+ parser->implicit_extern_c = false;
}
/* Make sure the declarator obstack was fully cleaned up. */
gcc_assert (obstack_next_free (&declarator_obstack)
== declarator_obstack_base);
-
- /* All went well. */
- return success;
}
/* Return the appropriate tsubst flags for parsing, possibly in N3276
? dk_no_deferred : dk_no_check);
cp_parser_translation_unit (the_parser);
the_parser = NULL;
+
+ finish_translation_unit ();
}
/* Create an identifier for a generic parameter type (a synthesized