From bd9697727ba8f11b7015a5e7e4ab20cd172ddc81 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Thu, 1 Feb 2001 19:13:53 +0000 Subject: [PATCH] cpphash.h (struct cpp_buffer): Move saved_flags from cpp_reader. * cpphash.h (struct cpp_buffer): Move saved_flags from cpp_reader. * cpplex.c (_cpp_lex_token): New token picks up the saved flags, and AVOID_LPASTE is cleared on meeting an unescaped newline. * cppmacro.c (builtin_macro): Set builtin flags here. (paste_all_tokens): Preserve AVOID_LPASTE on pasted token. (replace_args): Clarify intent. (cpp_get_token): Macro expansion tokens get the saved flags. Update. * cppmain.c (scan_buffer): Remove now-redundant print.printed check. From-SVN: r39393 --- gcc/ChangeLog | 13 +++++++++++++ gcc/cpphash.h | 6 +++--- gcc/cpplex.c | 7 ++++--- gcc/cppmacro.c | 30 +++++++++++++++--------------- gcc/cppmain.c | 3 +-- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 509d8622116..a9fe795852b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2001-02-01 Neil Booth + + * cpphash.h (struct cpp_buffer): Move saved_flags from cpp_reader. + * cpplex.c (_cpp_lex_token): New token picks up the saved flags, + and AVOID_LPASTE is cleared on meeting an unescaped newline. + * cppmacro.c (builtin_macro): Set builtin flags here. + (paste_all_tokens): Preserve AVOID_LPASTE on pasted token. + (replace_args): Clarify intent. + (cpp_get_token): Macro expansion tokens get the saved flags. + Update. + * cppmain.c (scan_buffer): Remove now-redundant print.printed + check. + 2001-02-01 Jeffrey Oldham * config/mips/iris6.h (SUPPORTS_INIT_PRIORITY): Reverse change of diff --git a/gcc/cpphash.h b/gcc/cpphash.h index 6874c21d41c..77c80cdc00d 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -194,6 +194,9 @@ struct cpp_buffer /* Line number at line_base (above). */ unsigned int lineno; + /* Contains PREV_WHITE and/or AVOID_LPASTE. */ + unsigned char saved_flags; + /* Because of the way the lexer works, -Wtrigraphs can sometimes warn twice for the same trigraph. This helps prevent that. */ const unsigned char *last_Wtrigraphs; @@ -331,9 +334,6 @@ struct cpp_reader /* We're printed a warning recommending against using #import. */ unsigned char import_warning; - /* Used to flag the token after a paste AVOID_LPASTE. */ - unsigned char saved_flags; - /* True after cpp_start_read completes. Used to inhibit some warnings while parsing the command line. */ unsigned char done_initializing; diff --git a/gcc/cpplex.c b/gcc/cpplex.c index f9431f812fd..3ff23b4abac 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -857,7 +857,8 @@ _cpp_lex_token (pfile, result) done_directive: buffer = pfile->buffer; pfile->state.next_bol = 0; - result->flags = 0; + result->flags = buffer->saved_flags; + buffer->saved_flags = 0; next_char: pfile->lexer_pos.line = buffer->lineno; next_char2: @@ -899,7 +900,7 @@ _cpp_lex_token (pfile, result) /* This is a new line, so clear any white space flag. Newlines in arguments are white space (6.10.3.10); parse_arg takes care of that. */ - result->flags &= ~PREV_WHITE; + result->flags &= ~(PREV_WHITE | AVOID_LPASTE); goto next_char; } @@ -1196,7 +1197,7 @@ _cpp_lex_token (pfile, result) /* Get whitespace right - newline_in_args sets it. */ if (pfile->lexer_pos.col == 1) - result->flags &= ~PREV_WHITE; + result->flags &= ~(PREV_WHITE | AVOID_LPASTE); } else { diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index 2d4663d4671..afe60dce877 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -146,6 +146,7 @@ builtin_macro (pfile, token) cpp_reader *pfile; cpp_token *token; { + unsigned char flags = ((token->flags & PREV_WHITE) | AVOID_LPASTE); cpp_hashnode *node = token->val.node; switch (node->value.builtin) @@ -219,6 +220,8 @@ builtin_macro (pfile, token) cpp_ice (pfile, "invalid builtin macro \"%s\"", node->name); break; } + + token->flags = flags; } /* Used by cpperror.c to obtain the correct line and column to report @@ -458,7 +461,7 @@ paste_all_tokens (pfile, lhs) /* The pasted token has the PREV_WHITE flag of the LHS, is no longer PASTE_LEFT, and is subject to macro expansion. */ lhs->flags &= ~(PREV_WHITE | PASTE_LEFT | NO_EXPAND); - lhs->flags |= orig_flags & PREV_WHITE; + lhs->flags |= orig_flags & (PREV_WHITE | AVOID_LPASTE); } /* Reads the unexpanded tokens of a macro argument into ARG. VAR_ARGS @@ -798,11 +801,11 @@ replace_args (pfile, macro, args, list) /* The first token gets PREV_WHITE of the CPP_MACRO_ARG. */ dest->flags &= ~PREV_WHITE; dest->flags |= src->flags & PREV_WHITE; + dest->flags |= AVOID_LPASTE; /* The last token gets the PASTE_LEFT of the CPP_MACRO_ARG. */ dest[count - 1].flags |= src->flags & PASTE_LEFT; - dest[0].flags |= AVOID_LPASTE; dest += count; } @@ -906,10 +909,6 @@ cpp_get_token (pfile, token) cpp_reader *pfile; cpp_token *token; { - unsigned char flags = pfile->saved_flags; - - pfile->saved_flags = 0; - for (;;) { cpp_context *context = pfile->context; @@ -922,11 +921,13 @@ cpp_get_token (pfile, token) else if (context->list.first != context->list.limit) { *token = *context->list.first++; + token->flags |= pfile->buffer->saved_flags; + pfile->buffer->saved_flags = 0; /* PASTE_LEFT tokens can only appear in macro expansions. */ if (token->flags & PASTE_LEFT) { paste_all_tokens (pfile, token); - pfile->saved_flags = AVOID_LPASTE; + pfile->buffer->saved_flags = AVOID_LPASTE; } } else @@ -934,7 +935,7 @@ cpp_get_token (pfile, token) if (context->macro) { /* Avoid accidental paste at the end of a macro. */ - flags |= AVOID_LPASTE; + pfile->buffer->saved_flags |= AVOID_LPASTE; _cpp_pop_context (pfile); continue; } @@ -944,8 +945,6 @@ cpp_get_token (pfile, token) return; } - token->flags |= flags; - flags = 0; if (token->type != CPP_NAME) break; @@ -959,20 +958,21 @@ cpp_get_token (pfile, token) /* Macros invalidate controlling macros. */ pfile->mi_state = MI_FAILED; - /* Remember PREV_WHITE and avoid an accidental paste. */ - flags = (token->flags & PREV_WHITE) | AVOID_LPASTE; - if (node->flags & NODE_BUILTIN) { builtin_macro (pfile, token); - token->flags = flags; break; } if (node->value.macro->disabled) token->flags |= NO_EXPAND; else if (enter_macro_context (pfile, node)) - continue; + { + /* Pass AVOID_LPASTE and our PREV_WHITE to next token. */ + pfile->buffer->saved_flags = ((token->flags & PREV_WHITE) + | AVOID_LPASTE); + continue; + } } /* Don't interpret _Pragma within directives. The standard is diff --git a/gcc/cppmain.c b/gcc/cppmain.c index 13bbbdd3c4f..a68d19cf9db 100644 --- a/gcc/cppmain.c +++ b/gcc/cppmain.c @@ -234,8 +234,7 @@ scan_buffer (pfile) putc (' ', print.outf); } } - else if (print.printed - && (token->flags & (PREV_WHITE | AVOID_LPASTE)) + else if ((token->flags & (PREV_WHITE | AVOID_LPASTE)) == AVOID_LPASTE && cpp_avoid_paste (pfile, &tokens[1 - index], token)) token->flags |= PREV_WHITE; -- 2.30.2