This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix libcpp lexing of raw strings (PR preprocessor/48740)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]