]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libcpp: Fix ICE lexing invalid raw string in a deferred pragma [PR117118]
authorLewis Hyatt <lhyatt@gmail.com>
Mon, 14 Oct 2024 21:59:46 +0000 (17:59 -0400)
committerLewis Hyatt <lhyatt@gcc.gnu.org>
Sat, 23 Nov 2024 18:44:38 +0000 (13:44 -0500)
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.

gcc/testsuite/c-c++-common/raw-string-directive-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/raw-string-directive-4.c [new file with mode: 0644]
libcpp/lex.cc

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 (file)
index 0000000..fa4fa97
--- /dev/null
@@ -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 (file)
index 0000000..935e3a1
--- /dev/null
@@ -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\"\"")
index 858970b5d171d5b6f28b73dcdca285b2aeff071e..9964f5194d4faf4f11bf767102b7bd4cdf3a2c05 100644 (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,