Commit 36952dea by Zack Weinberg Committed by Zack Weinberg

parser.c (cp_lexer_peek_token, [...]): Don't handle CPP_PRAGMA tokens specially.

	* parser.c (cp_lexer_peek_token, cp_lexer_consume_token):
	Don't handle CPP_PRAGMA tokens specially.
	(cp_lexer_handle_pragma): Use cp_lexer_consume_token.  Don't
	purge the token; do clear token->value after processing.  Add
	assertion at beginning that token->value is nonzero.
	(cp_parser_statement, cp_parser_declaration_seq_opt): Handle
	CPP_PRAGMA as a full statement or declaration in its own right.

From-SVN: r87822
parent 52c5701b
2004-09-21 Zack Weinberg <zack@codesourcery.com>
* parser.c (cp_lexer_peek_token, cp_lexer_consume_token):
Don't handle CPP_PRAGMA tokens specially.
(cp_lexer_handle_pragma): Use cp_lexer_consume_token. Don't
purge the token; do clear token->value after processing. Add
assertion at beginning that token->value is nonzero.
(cp_parser_statement, cp_parser_declaration_seq_opt): Handle
CPP_PRAGMA as a full statement or declaration in its own right.
2004-09-21 Matt Austern <austern@apple.com> 2004-09-21 Matt Austern <austern@apple.com>
PR c++/15049 PR c++/15049
* decl.c (grokvardecl): Accept declarations of global variables * decl.c (grokvardecl): Accept declarations of global variables
using anonymous types. using anonymous types.
2004-09-21 Roger Sayle <roger@eyesopen.com> 2004-09-21 Roger Sayle <roger@eyesopen.com>
PR c++/7503 PR c++/7503
......
...@@ -496,9 +496,6 @@ cp_lexer_peek_token (cp_lexer *lexer) ...@@ -496,9 +496,6 @@ cp_lexer_peek_token (cp_lexer *lexer)
if (lexer->next_token->type == CPP_PURGED) if (lexer->next_token->type == CPP_PURGED)
cp_lexer_skip_purged_tokens (lexer); cp_lexer_skip_purged_tokens (lexer);
if (lexer->next_token->type == CPP_PRAGMA)
cp_lexer_handle_pragma (lexer);
token = lexer->next_token; token = lexer->next_token;
/* Provide debugging output. */ /* Provide debugging output. */
...@@ -601,9 +598,6 @@ cp_lexer_consume_token (cp_lexer* lexer) ...@@ -601,9 +598,6 @@ cp_lexer_consume_token (cp_lexer* lexer)
if (lexer->next_token->type == CPP_PURGED) if (lexer->next_token->type == CPP_PURGED)
cp_lexer_skip_purged_tokens (lexer); cp_lexer_skip_purged_tokens (lexer);
if (lexer->next_token->type == CPP_PRAGMA)
cp_lexer_handle_pragma (lexer);
token = lexer->next_token++; token = lexer->next_token++;
/* Provide debugging output. */ /* Provide debugging output. */
...@@ -652,27 +646,24 @@ cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok) ...@@ -652,27 +646,24 @@ cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
} }
} }
/* Handle a pragma token and skip over it. We need the loop because /* Consume and handle a pragma token. */
the next token might also be a pragma token. */
static void static void
cp_lexer_handle_pragma (cp_lexer *lexer) cp_lexer_handle_pragma (cp_lexer *lexer)
{ {
gcc_assert (lexer->next_token->type == CPP_PRAGMA); cpp_string s;
cp_token *token = cp_lexer_consume_token (lexer);
gcc_assert (token->type == CPP_PRAGMA);
gcc_assert (token->value);
while (lexer->next_token->type == CPP_PRAGMA) s.len = TREE_STRING_LENGTH (token->value);
{ s.text = (const unsigned char *) TREE_STRING_POINTER (token->value);
tree t = lexer->next_token->value;
cpp_string s;
s.len = TREE_STRING_LENGTH (t);
s.text = (const unsigned char *) TREE_STRING_POINTER (t);
cp_lexer_set_source_position_from_token (lexer, lexer->next_token); cp_lexer_set_source_position_from_token (lexer, token);
cpp_handle_deferred_pragma (parse_in, &s); cpp_handle_deferred_pragma (parse_in, &s);
/* Make sure we don't run this pragma twice. */ /* Clearing token->value here means that we will get an ICE if we
cp_lexer_purge_token (lexer); try to process this #pragma again (which should be impossible). */
cp_lexer_skip_purged_tokens (lexer); token->value = NULL;
}
} }
/* Begin saving tokens. All tokens consumed after this point will be /* Begin saving tokens. All tokens consumed after this point will be
...@@ -5892,6 +5883,13 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr) ...@@ -5892,6 +5883,13 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr)
/* Anything that starts with a `{' must be a compound-statement. */ /* Anything that starts with a `{' must be a compound-statement. */
else if (token->type == CPP_OPEN_BRACE) else if (token->type == CPP_OPEN_BRACE)
statement = cp_parser_compound_statement (parser, NULL, false); statement = cp_parser_compound_statement (parser, NULL, false);
/* CPP_PRAGMA is a #pragma inside a function body, which constitutes
a statement all its own. */
else if (token->type == CPP_PRAGMA)
{
cp_lexer_handle_pragma (parser->lexer);
return;
}
/* Everything else must be a declaration-statement or an /* Everything else must be a declaration-statement or an
expression-statement. Try for the declaration-statement expression-statement. Try for the declaration-statement
...@@ -6649,6 +6647,16 @@ cp_parser_declaration_seq_opt (cp_parser* parser) ...@@ -6649,6 +6647,16 @@ cp_parser_declaration_seq_opt (cp_parser* parser)
continue; continue;
} }
if (token->type == CPP_PRAGMA)
{
/* A top-level declaration can consist solely of a #pragma.
A nested declaration cannot, so this is done here and not
in cp_parser_declaration. (A #pragma at block scope is
handled in cp_parser_statement.) */
cp_lexer_handle_pragma (parser->lexer);
continue;
}
/* The C lexer modifies PENDING_LANG_CHANGE when it wants the /* The C lexer modifies PENDING_LANG_CHANGE when it wants the
parser to enter or exit implicit `extern "C"' blocks. */ parser to enter or exit implicit `extern "C"' blocks. */
while (pending_lang_change > 0) while (pending_lang_change > 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment