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.
This commit is contained in:
Nathan Sidwell 2020-10-20 07:51:40 -07:00
parent 35f258f4bb
commit dbcc6b1577
6 changed files with 24 additions and 19 deletions

View File

@ -5,4 +5,4 @@
#define f(x) x
#include "eof-2.h"
/* { dg-regexp {[^\n]*eof-2.h:4: error: unterminated argument list invoking macro "f"\n} } */
/* { dg-regexp {[^\n]*eof-2.h:4:21: error: unterminated argument list invoking macro "f"\n} } */

View File

@ -3,6 +3,6 @@
/* { dg-do preprocess } */
/* { dg-additional-options "-include $srcdir/c-c++-common/cpp/eof-2.h" } */
/* { dg-regexp {[^\n]*eof-2.h:4: error: unterminated argument list invoking macro "f"\n} } */
/* { dg-regexp {[^\n]*eof-2.h:4:21: error: unterminated argument list invoking macro "f"\n} } */
token )

View File

@ -2768,7 +2768,10 @@ _cpp_lex_direct (cpp_reader *pfile)
if (!_cpp_get_fresh_line (pfile))
{
result->type = CPP_EOF;
if (!pfile->state.in_directive)
/* Not a real EOF in a directive or arg parsing -- we refuse
to advance to the next file now, and will once we're out
of those modes. */
if (!pfile->state.in_directive && !pfile->state.parsing_args)
{
/* Tell the compiler the line number of the EOF token. */
result->src_loc = pfile->line_table->highest_line;

View File

@ -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)
{