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:
parent
af6665e1fd
commit
18cace4674
3 changed files with 18 additions and 1 deletions
8
gcc/testsuite/c-c++-common/raw-string-directive-3.c
Normal file
8
gcc/testsuite/c-c++-common/raw-string-directive-3.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
/* { dg-options "-std=gnu99" { target c } } */
|
||||
/* { dg-options "-std=c++11" { target c++ } } */
|
||||
|
||||
/* { dg-error "invalid new-line in raw string delimiter" "" { target *-*-* } .+4 } */
|
||||
/* { dg-error "unterminated raw string" "" { target *-*-* } .+3 } */
|
||||
/* { dg-error "stray 'R' in program" "" { target *-*-* } .+2 } */
|
||||
/* { dg-warning "expected a string" "" { target *-*-* } .+1 } */
|
||||
#pragma message R""
|
8
gcc/testsuite/c-c++-common/raw-string-directive-4.c
Normal file
8
gcc/testsuite/c-c++-common/raw-string-directive-4.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
/* { dg-options "-std=gnu99" { target c } } */
|
||||
/* { dg-options "-std=c++11" { target c++ } } */
|
||||
|
||||
/* { dg-error "invalid new-line in raw string delimiter" "" { target *-*-* } .+4 } */
|
||||
/* { dg-error "unterminated raw string" "" { target *-*-* } .+3 } */
|
||||
/* { dg-error "stray 'R' in program" "" { target *-*-* } .+2 } */
|
||||
/* { dg-warning "expected a string" "" { target *-*-* } .+1 } */
|
||||
_Pragma("message R\"\"")
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue