public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/c++-modules] A few parser cleanups
@ 2020-01-31 13:35 Nathan Sidwell
0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2020-01-31 13:35 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:55695b9451e0557f67b695bc2c0fdbcf48a7226f
commit 55695b9451e0557f67b695bc2c0fdbcf48a7226f
Author: Nathan Sidwell <nathan@acm.org>
Date: Thu Jan 30 08:33:53 2020 -0800
A few parser cleanups
gcc/cp/
* parser.c (cp_lexer_alloc): Remove pch finalizing.
(cp_parser_skip_to_closing_parenthesis_1): Deal with falling into
a CPP_PRAGMA.
(cp_parser_skip_to_end_of_{,block_or_}statement): Likewise.
(cp_parser_skip_to_pragma_eol): Don't consume CPP_EOF.
(cp_parser_new): Take a lexer, don't create it here.
(cp_parser_declaration): Just point at peeked tokens, don't copy.
(cp_parser_block_declaration): Likewise.
(cp_parser_initial_pragma): Don't get the first token.
(c_parse_file): Do it here, and finalize pch.
Diff:
---
ChangeLog.modules | 12 ++++++
gcc/cp/parser.c | 111 ++++++++++++++++++++++++++++++------------------------
2 files changed, 73 insertions(+), 50 deletions(-)
diff --git a/ChangeLog.modules b/ChangeLog.modules
index b65ae07..cf2b16a0 100644
--- a/ChangeLog.modules
+++ b/ChangeLog.modules
@@ -1,5 +1,17 @@
2020-01-30 Nathan Sidwell <nathan@acm.org>
+ gcc/cp/
+ * parser.c (cp_lexer_alloc): Remove pch finalizing.
+ (cp_parser_skip_to_closing_parenthesis_1): Deal with falling into
+ a CPP_PRAGMA.
+ (cp_parser_skip_to_end_of_{,block_or_}statement): Likewise.
+ (cp_parser_skip_to_pragma_eol): Don't consume CPP_EOF.
+ (cp_parser_new): Take a lexer, don't create it here.
+ (cp_parser_declaration): Just point at peeked tokens, don't copy.
+ (cp_parser_block_declaration): Likewise.
+ (cp_parser_initial_pragma): Don't get the first token.
+ (c_parse_file): Do it here, and finalize pch.
+
libcpp/
* lex.c (_cpp_lex_direct): Set location of PRAGMA_EOL.
gcc/testsuite/
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 4598b65..bcaeafb 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -609,12 +609,8 @@ debug (cp_parser *ptr)
static cp_lexer *
cp_lexer_alloc (void)
{
- cp_lexer *lexer;
-
- c_common_no_more_pch ();
-
/* Allocate the memory. */
- lexer = ggc_cleared_alloc<cp_lexer> ();
+ cp_lexer *lexer = ggc_cleared_alloc<cp_lexer> ();
/* Initially we are not debugging. */
lexer->debugging_p = false;
@@ -2131,7 +2127,7 @@ pop_unparsed_function_queues (cp_parser *parser)
/* Constructors and destructors. */
static cp_parser *cp_parser_new
- (void);
+ (cp_lexer *);
/* Routines to parse various constructs.
@@ -3793,6 +3789,11 @@ cp_parser_skip_to_closing_parenthesis_1 (cp_parser *parser,
condop_depth--;
break;
+ case CPP_PRAGMA:
+ /* We fell into a pragma. Skip it, and continue. */
+ cp_parser_skip_to_pragma_eol (parser, token);
+ break;
+
default:
break;
}
@@ -3884,6 +3885,11 @@ cp_parser_skip_to_end_of_statement (cp_parser* parser)
++nesting_depth;
break;
+ case CPP_PRAGMA:
+ /* We fell into a pragma. Skip it, and be done */
+ cp_parser_skip_to_pragma_eol (parser, token);
+ return;
+
default:
break;
}
@@ -3959,6 +3965,11 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
nesting_depth++;
break;
+ case CPP_PRAGMA:
+ /* We fell into a pragma. Skip it, and be done */
+ cp_parser_skip_to_pragma_eol (parser, token);
+ return;
+
default:
break;
}
@@ -4025,8 +4036,13 @@ cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
parser->lexer->in_pragma = false;
do
- token = cp_lexer_consume_token (parser->lexer);
- while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
+ {
+ token = cp_lexer_peek_token (parser->lexer);
+ if (token->type == CPP_EOF)
+ break;
+ cp_lexer_consume_token (parser->lexer);
+ }
+ while (token->type != CPP_PRAGMA_EOL);
/* Ensure that the pragma is not parsed again. */
cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
@@ -4097,7 +4113,7 @@ cp_parser_make_indirect_declarator (enum tree_code code, tree class_type,
/* Create a new C++ parser. */
static cp_parser *
-cp_parser_new (void)
+cp_parser_new (cp_lexer *lexer)
{
/* Initialize the binops_by_token so that we can get the tree
directly from the token. */
@@ -4105,7 +4121,7 @@ cp_parser_new (void)
binops_by_token[binops[i].token_type] = binops[i];
cp_parser *parser = ggc_cleared_alloc<cp_parser> ();
- parser->lexer = cp_lexer_alloc ();
+ parser->lexer = lexer;
parser->context = cp_parser_context_new (NULL);
/* For now, we always accept GNU extensions. */
@@ -13748,11 +13764,7 @@ cp_parser_declaration_seq_opt (cp_parser* parser)
static void
cp_parser_declaration (cp_parser* parser)
{
- cp_token token1;
- cp_token token2;
int saved_pedantic;
- void *p;
- tree attributes = NULL_TREE;
/* Check for the `__extension__' keyword. */
if (cp_parser_extension_opt (parser, &saved_pedantic))
@@ -13766,35 +13778,33 @@ cp_parser_declaration (cp_parser* parser)
}
/* Try to figure out what kind of declaration is present. */
- token1 = *cp_lexer_peek_token (parser->lexer);
+ cp_token *token1 = cp_lexer_peek_token (parser->lexer);
+ cp_token *token2 = NULL;
- if (token1.type != CPP_EOF)
- token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
- else
- {
- token2.type = CPP_EOF;
- token2.keyword = RID_MAX;
- }
+ if (token1->type != CPP_EOF)
+ token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
/* Get the high-water mark for the DECLARATOR_OBSTACK. */
- p = obstack_alloc (&declarator_obstack, 0);
+ void *p = obstack_alloc (&declarator_obstack, 0);
+
+ tree attributes = NULL_TREE;
/* If the next token is `extern' and the following token is a string
literal, then we have a linkage specification. */
- if (token1.keyword == RID_EXTERN
- && cp_parser_is_pure_string_literal (&token2))
+ if (token1->keyword == RID_EXTERN
+ && cp_parser_is_pure_string_literal (token2))
cp_parser_linkage_specification (parser);
/* If the next token is `template', then we have either a template
declaration, an explicit instantiation, or an explicit
specialization. */
- else if (token1.keyword == RID_TEMPLATE)
+ else if (token1->keyword == RID_TEMPLATE)
{
/* `template <>' indicates a template specialization. */
- if (token2.type == CPP_LESS
+ if (token2->type == CPP_LESS
&& cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
cp_parser_explicit_specialization (parser);
/* `template <' indicates a template declaration. */
- else if (token2.type == CPP_LESS)
+ else if (token2->type == CPP_LESS)
cp_parser_template_declaration (parser, /*member_p=*/false);
/* Anything else must be an explicit instantiation. */
else
@@ -13802,7 +13812,7 @@ cp_parser_declaration (cp_parser* parser)
}
/* If the next token is `export', it's new-style modules or
old-style template. */
- else if (token1.keyword == RID_EXPORT)
+ else if (token1->keyword == RID_EXPORT)
{
if (!modules_p ())
cp_parser_template_declaration (parser, /*member_p=*/false);
@@ -13813,34 +13823,34 @@ cp_parser_declaration (cp_parser* parser)
after that is `template', we have a GNU extended explicit
instantiation directive. */
else if (cp_parser_allow_gnu_extensions_p (parser)
- && (token1.keyword == RID_EXTERN
- || token1.keyword == RID_STATIC
- || token1.keyword == RID_INLINE)
- && token2.keyword == RID_TEMPLATE)
+ && token2->keyword == RID_TEMPLATE
+ && (token1->keyword == RID_EXTERN
+ || token1->keyword == RID_STATIC
+ || token1->keyword == RID_INLINE))
cp_parser_explicit_instantiation (parser);
/* If the next token is `namespace', check for a named or unnamed
namespace definition. */
- else if (token1.keyword == RID_NAMESPACE
+ else if (token1->keyword == RID_NAMESPACE
&& (/* A named namespace definition. */
- (token2.type == CPP_NAME
+ (token2->type == CPP_NAME
&& (cp_lexer_peek_nth_token (parser->lexer, 3)->type
!= CPP_EQ))
- || (token2.type == CPP_OPEN_SQUARE
+ || (token2->type == CPP_OPEN_SQUARE
&& cp_lexer_peek_nth_token (parser->lexer, 3)->type
== CPP_OPEN_SQUARE)
/* An unnamed namespace definition. */
- || token2.type == CPP_OPEN_BRACE
- || token2.keyword == RID_ATTRIBUTE))
+ || token2->type == CPP_OPEN_BRACE
+ || token2->keyword == RID_ATTRIBUTE))
cp_parser_namespace_definition (parser);
/* An inline (associated) namespace definition. */
- else if (token1.keyword == RID_INLINE
- && token2.keyword == RID_NAMESPACE)
+ else if (token2->keyword == RID_NAMESPACE
+ && token1->keyword == RID_INLINE)
cp_parser_namespace_definition (parser);
/* Objective-C++ declaration/definition. */
- else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
+ else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1->keyword))
cp_parser_objc_declaration (parser, NULL_TREE);
else if (c_dialect_objc ()
- && token1.keyword == RID_ATTRIBUTE
+ && token1->keyword == RID_ATTRIBUTE
&& cp_parser_objc_valid_prefix_attributes (parser, &attributes))
cp_parser_objc_declaration (parser, attributes);
/* At this point we may have a template declared by a concept
@@ -13902,7 +13912,6 @@ static void
cp_parser_block_declaration (cp_parser *parser,
bool statement_p)
{
- cp_token *token1;
int saved_pedantic;
/* Check for the `__extension__' keyword. */
@@ -13918,7 +13927,7 @@ cp_parser_block_declaration (cp_parser *parser,
/* Peek at the next token to figure out which kind of declaration is
present. */
- token1 = cp_lexer_peek_token (parser->lexer);
+ cp_token *token1 = cp_lexer_peek_token (parser->lexer);
/* If the next keyword is `asm', we have an asm-definition. */
if (token1->keyword == RID_ASM)
@@ -43723,12 +43732,8 @@ static GTY (()) cp_parser *the_parser;
static void
cp_parser_initial_pragma (cp_token *first_token)
{
- cp_lexer_get_preprocessor_token (0, first_token);
if (cp_parser_pragma_kind (first_token) != PRAGMA_GCC_PCH_PREPROCESS)
- {
- c_common_no_more_pch ();
- return;
- }
+ return;
cp_lexer_get_preprocessor_token (0, first_token);
@@ -44183,9 +44188,15 @@ c_parse_file (void)
/* It's possible that parsing the first pragma will load a PCH file,
which is a GC collection point. So we have to do that before
allocating any memory. Modules is incompatible with PCH. */
+ cp_lexer_get_preprocessor_token (0, &first);
cp_parser_initial_pragma (&first);
+ c_common_no_more_pch ();
+
+ /* cp_lexer_new_main is called before doing any GC allocation
+ because tokenization might load a PCH file. */
+ cp_lexer *lexer = cp_lexer_alloc ();
- the_parser = cp_parser_new ();
+ the_parser = cp_parser_new (lexer);
cp_parser_translation_unit (the_parser, &first);
class_decl_loc_t::diag_mismatched_tags ();
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-01-31 13:35 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-31 13:35 [gcc/devel/c++-modules] A few parser cleanups Nathan Sidwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).