From 18cace467402a35fa2344f6b48890b2e986ad2a5 Mon Sep 17 00:00:00 2001 From: Lewis Hyatt Date: Mon, 14 Oct 2024 17:59:46 -0400 Subject: 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. --- libcpp/lex.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libcpp') diff --git a/libcpp/lex.cc b/libcpp/lex.cc index 858970b5d17..9964f5194d4 100644 --- a/libcpp/lex.cc +++ b/libcpp/lex.cc @@ -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, -- cgit v1.2.3