OSDN Git Service

2010-11-16 Kai Tietz <kai.tietz@onevision.com>
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Nov 2010 19:50:17 +0000 (19:50 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Nov 2010 19:50:17 +0000 (19:50 +0000)
        PR preprocessor/17349
        * lex.c (save_comment): Handle in argument passing c++
        comments special.

2010-11-16  Kai Tietz  <kai.tietz@onevision.com>

        PR preprocessor/17349
        * gcc.dg/cpp/cmdlne-C3.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166817 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/cmdlne-C3.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/lex.c

index 1ffbb15..fd40483 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-16  Kai Tietz  <kai.tietz@onevision.com>
+
+       PR preprocessor/17349
+       * gcc.dg/cpp/cmdlne-C3.c: New.
+
 2010-11-16  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/44545
diff --git a/gcc/testsuite/gcc.dg/cpp/cmdlne-C3.c b/gcc/testsuite/gcc.dg/cpp/cmdlne-C3.c
new file mode 100644 (file)
index 0000000..86a9422
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do preprocess } */
+/* { dg-options "-C -P" } */
+
+#define macro(X) X
+
+macro(
+// Comment1
+x
+// Comment2
+);
+
+/* { dg-final { scan-file cmdlne-C3.i "\\\*\\\/ x \\\/\\\*" } } */
+
index afaca8a..ec0602a 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-16  Kai Tietz  <kai.tietz@onevision.com>
+
+       PR preprocessor/17349
+       * lex.c (save_comment): Handle in argument passing c++
+       comments special.
+
 2010-11-02  Ian Lance Taylor  <iant@google.com>
 
        * configure.ac: Use AC_SYS_LARGEFILE.
index 2e962a7..5cd5686 100644 (file)
@@ -1641,7 +1641,7 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
              cppchar_t type)
 {
   unsigned char *buffer;
-  unsigned int len, clen;
+  unsigned int len, clen, i;
 
   len = pfile->buffer->cur - from + 1; /* + 1 for the initial '/'.  */
 
@@ -1650,13 +1650,14 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
   if (is_vspace (pfile->buffer->cur[-1]))
     len--;
 
-  /* If we are currently in a directive, then we need to store all
-     C++ comments as C comments internally, and so we need to
-     allocate a little extra space in that case.
+  /* If we are currently in a directive or in argument parsing, then
+     we need to store all C++ comments as C comments internally, and
+     so we need to allocate a little extra space in that case.
 
      Note that the only time we encounter a directive here is
      when we are saving comments in a "#define".  */
-  clen = (pfile->state.in_directive && type == '/') ? len + 2 : len;
+  clen = ((pfile->state.in_directive || pfile->state.parsing_args)
+         && type == '/') ? len + 2 : len;
 
   buffer = _cpp_unaligned_alloc (pfile, clen);
 
@@ -1668,11 +1669,16 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
   memcpy (buffer + 1, from, len - 1);
 
   /* Finish conversion to a C comment, if necessary.  */
-  if (pfile->state.in_directive && type == '/')
+  if ((pfile->state.in_directive || pfile->state.parsing_args) && type == '/')
     {
       buffer[1] = '*';
       buffer[clen - 2] = '*';
       buffer[clen - 1] = '/';
+      /* As there can be in a C++ comments illegal sequences for C comments
+         we need to filter them out.  */
+      for (i = 2; i < (clen - 2); i++)
+        if (buffer[i] == '/' && (buffer[i - 1] == '*' || buffer[i + 1] == '*'))
+          buffer[i] = '|';
     }
 
   /* Finally store this comment for use by clients of libcpp. */