This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix libcpp lexing of raw strings (PR preprocessor/48740)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>, Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 23 Apr 2011 19:00:03 +0200
- Subject: [PATCH] Fix libcpp lexing of raw strings (PR preprocessor/48740)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The attached testcase fails when using -save-temps, -E
prints the string as
R"raw(foo%sbar%sfred%sbob?????]raw"
instead of
R"raw(foo%sbar%sfred%sbob?????)raw"
because ??) is ] trigraph.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk/4.6?
2011-04-23 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/48740
* lex.c (lex_raw_string): When raw string ends with
??) followed by raw prefix and ", ensure it is preprocessed
with ??) rather than ??].
* c-c++-common/raw-string-11.c: New test.
--- libcpp/lex.c.jj 2011-03-19 16:20:30.000000000 +0100
+++ libcpp/lex.c 2011-04-23 14:22:53.000000000 +0200
@@ -1410,7 +1410,9 @@ lex_raw_string (cpp_reader *pfile, cpp_t
raw_prefix_len) == 0
&& cur[raw_prefix_len+1] == '"')
{
- cur += raw_prefix_len+2;
+ BUF_APPEND (")", 1);
+ base++;
+ cur += raw_prefix_len + 2;
goto break_outer_loop;
}
else
--- gcc/testsuite/c-c++-common/raw-string-11.c.jj 2011-04-23 14:24:08.000000000 +0200
+++ gcc/testsuite/c-c++-common/raw-string-11.c 2011-04-23 14:28:02.000000000 +0200
@@ -0,0 +1,13 @@
+// PR preprocessor/48740
+// { dg-options "-std=gnu99 -trigraphs -save-temps" { target c } }
+// { dg-options "-std=c++0x -save-temps" { target c++ } }
+// { dg-do run }
+
+int main ()
+{
+ return __builtin_memcmp (R"raw(foo%sbar%sfred%sbob?????)raw",
+ "foo%sbar%sfred%sbob?""?""?""?""?",
+ sizeof ("foo%sbar%sfred%sbob?""?""?""?""?"));
+}
+
+// { dg-final { cleanup-saved-temps } }
Jakub