libcpp: Fix ICE lexing invalid raw string in a deferred pragma [PR117118]

The PR shows that we ICE after lexing an invalid unterminated raw string,
because lex_raw_string() pops the main buffer unexpectedly. Resolve by
handling this case the same way as for other directives.

libcpp/ChangeLog:
	PR preprocessor/117118
	* lex.cc (lex_raw_string): Treat an unterminated raw string the same
	way for a deferred pragma as is done for other directives.

gcc/testsuite/ChangeLog:
	PR preprocessor/117118
	* c-c++-common/raw-string-directive-3.c: New test.
	* c-c++-common/raw-string-directive-4.c: New test.
This commit is contained in:
Lewis Hyatt
2024-10-14 17:59:46 -04:00
committed by Lewis Hyatt
parent af6665e1fd
commit 18cace4674
3 changed files with 18 additions and 1 deletions

View File

@@ -2762,7 +2762,8 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
{
pos--;
pfile->buffer->cur = pos;
if ((pfile->state.in_directive || pfile->state.parsing_args)
if ((pfile->state.in_directive || pfile->state.parsing_args
|| pfile->state.in_deferred_pragma)
&& pfile->buffer->next_line >= pfile->buffer->rlimit)
{
cpp_error_with_line (pfile, CPP_DL_ERROR, token->src_loc, 0,