From ae49af94850b26e50268031e24f1559d5a51edec Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 28 Jul 2020 15:40:15 +0200 Subject: [PATCH] libcpp: Fix up raw string literal parsing error-recovery [PR96323] 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. 2020-07-28 Jakub Jelinek 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. --- gcc/testsuite/c-c++-common/cpp/pr96323.c | 8 ++++++++ libcpp/lex.c | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/cpp/pr96323.c diff --git a/gcc/testsuite/c-c++-common/cpp/pr96323.c b/gcc/testsuite/c-c++-common/cpp/pr96323.c new file mode 100644 index 00000000000..7a8edff27cc --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr96323.c @@ -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"; diff --git a/libcpp/lex.c b/libcpp/lex.c index 5d94882abe8..9aec9e0bd04 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -1885,7 +1885,8 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base) the best failure mode. */ prefix_len = 0; } - continue; + if (c != '\n') + continue; } if (phase != PHASE_NONE) -- 2.30.2