libcpp: Fix up raw string literal parsing error-recovery [PR96323]

Message ID 20200728082636.GZ2363@tucnak
State New
Headers show
Series
  • libcpp: Fix up raw string literal parsing error-recovery [PR96323]
Related show

Commit Message

xionghu luo via Gcc-patches July 28, 2020, 8:26 a.m.
Hi!

For (invalid) newline inside of the raw string literal delimiter, doing
continue means we skip the needed processing of newlines.  Instead of
duplicating that, this patch just doesn't continue for those.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2020-07-28  Jakub Jelinek  <jakub@redhat.com>

	PR preprocessor/96323
	* lex.c (lex_raw_string): For c == '\n' don't continue after reporting
	an prefix delimiter error.

	* c-c++-common/cpp/pr96323.c: New test.


	Jakub

Comments

Nathan Sidwell July 28, 2020, 12:22 p.m. | #1
On 7/28/20 4:26 AM, Jakub Jelinek wrote:
> Hi!

> 

> For (invalid) newline inside of the raw string literal delimiter, doing

> continue means we skip the needed processing of newlines.  Instead of

> duplicating that, this patch just doesn't continue for those.

> 

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

>


ok, thanks!  It's hard to think of all the wrong ways code can be written!

nathan

-- 
Nathan Sidwell

Patch

--- libcpp/lex.c.jj	2020-05-20 10:33:37.000000000 +0200
+++ libcpp/lex.c	2020-07-27 09:12:19.827974203 +0200
@@ -1885,7 +1885,8 @@  lex_raw_string (cpp_reader *pfile, cpp_t
 		 the best failure mode.  */
 	      prefix_len = 0;
 	    }
-	  continue;
+	  if (c != '\n')
+	    continue;
 	}
 
       if (phase != PHASE_NONE)
--- gcc/testsuite/c-c++-common/cpp/pr96323.c.jj	2020-07-27 09:19:42.021557709 +0200
+++ gcc/testsuite/c-c++-common/cpp/pr96323.c	2020-07-27 09:30:37.197052063 +0200
@@ -0,0 +1,8 @@ 
+/* PR preprocessor/96323 */
+/* { dg-do preprocess } */
+/* { dg-options "-std=gnu99 -Wno-c++-compat -trigraphs" { target c } } */
+/* { dg-options "-std=c++0x" { target c++ } } */
+/* { dg-error "invalid new-line in raw string delimiter" "" { target *-*-* } .+2 } */
+/* { dg-warning "missing terminating . character" "" { target *-*-* } .+2 } */
+const char tu[] = R"a";
+const char tua[] = "(R)a";