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
This commit is contained in:
parent
92cf739996
commit
651a20b54b
@ -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
|
||||
|
13
gcc/testsuite/gcc.dg/cpp/cmdlne-C3.c
Normal file
13
gcc/testsuite/gcc.dg/cpp/cmdlne-C3.c
Normal file
@ -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 \\\/\\\*" } } */
|
||||
|
@ -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.
|
||||
|
18
libcpp/lex.c
18
libcpp/lex.c
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user