summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorLewis Hyatt <lhyatt@gmail.com>2024-10-14 17:59:46 -0400
committerLewis Hyatt <lhyatt@gcc.gnu.org>2024-11-23 13:44:38 -0500
commit18cace467402a35fa2344f6b48890b2e986ad2a5 (patch)
tree982e443b7223f91a61a003ce9bf61a9e3b4c20e7 /libcpp
parentaf6665e1fdcc6bcd42db51845d7cb2f19fbda650 (diff)
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.
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/lex.cc3
1 files changed, 2 insertions, 1 deletions
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,