[PATCH] Fix up preprocessing of raw-string literals

Jakub Jelinek jakub@redhat.com
Fri Jul 5 15:22:00 GMT 2013


Hi!

I've noticed that if we preprocess source with multi-line raw-string
literals (or -save-temps compile), the lines can be off if the multi-line
raw-string literal contains just a few lines (under the threshold to emit
#line directive); we already have a function for that for CPP_COMMENT
tokens and it seems it can be used for all raw string literals too.

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

2013-07-05  Jakub Jelinek  <jakub@redhat.com>

	* c-ppoutput.c (scan_translation_unit): Call account_for_newlines
	for all CPP_TOKEN_FLD_STR tokens, not just CPP_COMMENT.

	* include/cpplib.h (cpp_token_val_index): Change parameter type to
	const cpp_token *.
	* lex.c (cpp_token_val_index): Likewise.

	* c-c++-common/raw-string-18.c: New test.
	* c-c++-common/raw-string-19.c: New test.

--- gcc/c-family/c-ppoutput.c.jj	2013-02-13 17:05:52.948743047 +0100
+++ gcc/c-family/c-ppoutput.c	2013-07-05 12:45:50.225852614 +0200
@@ -251,7 +251,7 @@ scan_translation_unit (cpp_reader *pfile
 	  cpp_output_token (token, print.outf);
 	}
 
-      if (token->type == CPP_COMMENT)
+      if (cpp_token_val_index (token) == CPP_TOKEN_FLD_STR)
 	account_for_newlines (token->val.str.text, token->val.str.len);
     }
 }
--- libcpp/include/cpplib.h.jj	2013-04-28 23:35:36.000000000 +0200
+++ libcpp/include/cpplib.h	2013-07-05 12:47:06.356659944 +0200
@@ -248,7 +248,7 @@ struct GTY(()) cpp_token {
 };
 
 /* Say which field is in use.  */
-extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok);
+extern enum cpp_token_fld_kind cpp_token_val_index (const cpp_token *tok);
 
 /* A type wide enough to hold any multibyte source character.
    cpplib's character constant interpreter requires an unsigned type.
--- libcpp/lex.c.jj	2013-07-04 19:16:26.000000000 +0200
+++ libcpp/lex.c	2013-07-05 12:46:33.751190308 +0200
@@ -3168,7 +3168,7 @@ _cpp_aligned_alloc (cpp_reader *pfile, s
 /* Say which field of TOK is in use.  */
 
 enum cpp_token_fld_kind
-cpp_token_val_index (cpp_token *tok)
+cpp_token_val_index (const cpp_token *tok)
 {
   switch (TOKEN_SPELL (tok))
     {
--- gcc/testsuite/c-c++-common/raw-string-18.c.jj	2013-07-05 12:51:16.393902794 +0200
+++ gcc/testsuite/c-c++-common/raw-string-18.c	2013-07-05 12:55:15.795931265 +0200
@@ -0,0 +1,21 @@
+/* PR preprocessor/57824 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fdump-tree-optimized-lineno" { target c } } */
+/* { dg-options "-std=c++11 -fdump-tree-optimized-lineno" { target c++ } } */
+
+const char x[] = R"(
+abc
+def
+ghi
+)";
+
+int
+main ()
+{
+  extern void foo (); foo ();
+  return 0;
+}
+
+/* Verify call to foo is on line 15.  */
+/* { dg-final { scan-tree-dump ": 15\[]:]\[^\n\r]*foo" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/c-c++-common/raw-string-19.c.jj	2013-07-05 12:55:23.596803291 +0200
+++ gcc/testsuite/c-c++-common/raw-string-19.c	2013-07-05 12:55:51.418347139 +0200
@@ -0,0 +1,22 @@
+/* PR preprocessor/57824 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fdump-tree-optimized-lineno -save-temps" { target c } } */
+/* { dg-options "-std=c++11 -fdump-tree-optimized-lineno -save-temps" { target c++ } } */
+
+const char x[] = R"(
+abc
+def
+ghi
+)";
+
+int
+main ()
+{
+  extern void foo (); foo ();
+  return 0;
+}
+
+/* Verify call to foo is on line 15.  */
+/* { dg-final { scan-tree-dump ": 15\[]:]\[^\n\r]*foo" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+/* { dg-final { cleanup-saved-temps } } */

	Jakub



More information about the Gcc-patches mailing list