Commit 651a20b5 by Kai Tietz Committed by Kai Tietz

re PR preprocessor/17349 (// comments cause weird behaviour with options -E -C)

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-16  Kai Tietz  <kai.tietz@onevision.com>

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

From-SVN: r166817
parent 92cf7399
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> 2010-11-16 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44545 PR tree-optimization/44545
......
/* { dg-do preprocess } */
/* { dg-options "-C -P" } */
#define macro(X) X
macro(
// Comment1
x
// Comment2
);
/* { dg-final { scan-file cmdlne-C3.i "\\\*\\\/ x \\\/\\\*" } } */
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> 2010-11-02 Ian Lance Taylor <iant@google.com>
* configure.ac: Use AC_SYS_LARGEFILE. * configure.ac: Use AC_SYS_LARGEFILE.
......
...@@ -1641,7 +1641,7 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from, ...@@ -1641,7 +1641,7 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
cppchar_t type) cppchar_t type)
{ {
unsigned char *buffer; unsigned char *buffer;
unsigned int len, clen; unsigned int len, clen, i;
len = pfile->buffer->cur - from + 1; /* + 1 for the initial '/'. */ 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, ...@@ -1650,13 +1650,14 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
if (is_vspace (pfile->buffer->cur[-1])) if (is_vspace (pfile->buffer->cur[-1]))
len--; len--;
/* If we are currently in a directive, then we need to store all /* If we are currently in a directive or in argument parsing, then
C++ comments as C comments internally, and so we need to we need to store all C++ comments as C comments internally, and
allocate a little extra space in that case. so we need to allocate a little extra space in that case.
Note that the only time we encounter a directive here is Note that the only time we encounter a directive here is
when we are saving comments in a "#define". */ 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); buffer = _cpp_unaligned_alloc (pfile, clen);
...@@ -1668,11 +1669,16 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from, ...@@ -1668,11 +1669,16 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from,
memcpy (buffer + 1, from, len - 1); memcpy (buffer + 1, from, len - 1);
/* Finish conversion to a C comment, if necessary. */ /* 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[1] = '*';
buffer[clen - 2] = '*'; buffer[clen - 2] = '*';
buffer[clen - 1] = '/'; 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. */ /* Finally store this comment for use by clients of libcpp. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment