diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-10-20 07:51:40 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-10-20 08:01:34 -0700 |
commit | dbcc6b1577bedd2bf5879393c862b6c461787503 (patch) | |
tree | 7c7367f1c312b308ff6755df41cbeea55c62fbe8 /libcpp/macro.c | |
parent | 35f258f4bbba7fa044f90b4f14d1bc942db58089 (diff) | |
download | gcc-dbcc6b1577bedd2bf5879393c862b6c461787503.zip gcc-dbcc6b1577bedd2bf5879393c862b6c461787503.tar.gz gcc-dbcc6b1577bedd2bf5879393c862b6c461787503.tar.bz2 |
preprocessor: Further fix for EOF in macro args [PR97471]
My previous attempt at fixing this was incorrect. The problem occurs
earlier in that _cpp_lex_direct processes the unwinding EOF needs in
collect_args mode. This patch changes it not to do that, in the same
way as directive parsing works. Also collect_args shouldn't push_back
such fake EOFs, and neither should funlike_invocation_p.
libcpp/
* lex.c (_cpp_lex_direct): Do not complete EOF processing when
parsing_args.
* macro.c (collect_args): Do not unwind fake EOF.
(funlike_invocation_p): Do not unwind fake EOF.
(cpp_context): Replace abort with gcc_assert.
gcc/testsuite/
* gcc.dg/cpp/endif.c: Move to ...
* c-c++-common/cpp/endif.c: ... here.
* gcc.dg/cpp/endif.h: Move to ...
* c-c++-common/cpp/endif.h: ... here.
* c-c++-common/cpp/eof-2.c: Adjust diagnostic.
* c-c++-common/cpp/eof-3.c: Adjust diagnostic.
Diffstat (limited to 'libcpp/macro.c')
-rw-r--r-- | libcpp/macro.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/libcpp/macro.c b/libcpp/macro.c index 9cb3b10..0874028 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -1259,13 +1259,10 @@ collect_args (cpp_reader *pfile, const cpp_hashnode *node, if (token->type == CPP_EOF) { - /* We still need the CPP_EOF to end directives, to end - pre-expansion of a macro argument, and at the end of the main - file. We do not want it at the end of a -include'd (forced) - header file. */ - if (pfile->state.in_directive - || !pfile->line_table->depth - || pfile->context->prev) + /* Unless the EOF is marking the end of an argument, it's a fake + one from the end of a file that _cpp_clean_line will not have + advanced past. */ + if (token == &pfile->endarg) _cpp_backup_tokens (pfile, 1); cpp_error (pfile, CPP_DL_ERROR, "unterminated argument list invoking macro \"%s\"", @@ -1328,13 +1325,19 @@ funlike_invocation_p (cpp_reader *pfile, cpp_hashnode *node, pfile->state.parsing_args = 2; return collect_args (pfile, node, pragma_buff, num_args); } - - /* Back up. We may have skipped padding, in which case backing - up more than one token when expanding macros is in general - too difficult. We re-insert it in its own context. */ - _cpp_backup_tokens (pfile, 1); - if (padding) - _cpp_push_token_context (pfile, NULL, padding, 1); + + /* Back up. A CPP_EOF is either an EOF from an argument we're + expanding, or a fake one from lex_direct. We want to backup the + former, but not the latter. We may have skipped padding, in + which case backing up more than one token when expanding macros + is in general too difficult. We re-insert it in its own + context. */ + if (token->type != CPP_EOF || token == &pfile->endarg) + { + _cpp_backup_tokens (pfile, 1); + if (padding) + _cpp_push_token_context (pfile, NULL, padding, 1); + } return NULL; } @@ -2638,8 +2641,7 @@ _cpp_pop_context (cpp_reader *pfile) cpp_context *context = pfile->context; /* We should not be popping the base context. */ - if (context == &pfile->base_context) - abort (); + gcc_assert (context != &pfile->base_context); if (context->c.macro) { |