diff options
author | Lewis Hyatt <lhyatt@gmail.com> | 2024-10-14 17:59:46 -0400 |
---|---|---|
committer | Lewis Hyatt <lhyatt@gcc.gnu.org> | 2024-11-23 13:44:38 -0500 |
commit | 18cace467402a35fa2344f6b48890b2e986ad2a5 (patch) | |
tree | 982e443b7223f91a61a003ce9bf61a9e3b4c20e7 /gcc | |
parent | af6665e1fdcc6bcd42db51845d7cb2f19fbda650 (diff) | |
download | gcc-18cace467402a35fa2344f6b48890b2e986ad2a5.zip gcc-18cace467402a35fa2344f6b48890b2e986ad2a5.tar.gz gcc-18cace467402a35fa2344f6b48890b2e986ad2a5.tar.bz2 |
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 'gcc')
-rw-r--r-- | gcc/testsuite/c-c++-common/raw-string-directive-3.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/raw-string-directive-4.c | 8 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/raw-string-directive-3.c b/gcc/testsuite/c-c++-common/raw-string-directive-3.c new file mode 100644 index 0000000..fa4fa97 --- /dev/null +++ b/gcc/testsuite/c-c++-common/raw-string-directive-3.c @@ -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"" diff --git a/gcc/testsuite/c-c++-common/raw-string-directive-4.c b/gcc/testsuite/c-c++-common/raw-string-directive-4.c new file mode 100644 index 0000000..935e3a1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/raw-string-directive-4.c @@ -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\"\"") |