re PR preprocessor/69869 (internal compiler error: Segmentation fault in call to skip_macro_block_comment when using '-traditional-cpp')

PR preprocessor/69869
	* traditional.c (skip_macro_block_comment): Return bool, true if
	the macro block comment is unterminated.
	(copy_comment): Use return value from skip_macro_block_comment instead
	of always false.

	* gcc.dg/cpp/trad/pr69869.c: New test.

From-SVN: r257220
This commit is contained in:
Jakub Jelinek 2018-01-31 09:31:52 +01:00 committed by Jakub Jelinek
parent 7b56ebc347
commit 1306a81d81
4 changed files with 32 additions and 5 deletions

View File

@ -1,5 +1,8 @@
2018-01-31 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/69869
* gcc.dg/cpp/trad/pr69869.c: New test.
PR c/84100
* gcc.dg/pr84100.c: New test.

View File

@ -0,0 +1,8 @@
/* PR preprocessor/69869 */
/* { dg-do preprocess } */
/* { dg-options "-traditional-cpp" } */
#define C(a,b)a/**/b
C (foo/,**/)
C (foo/,*)
/* { dg-error "-:unterminated comment" "" {target "*-*-*"} .-1 } */

View File

@ -1,3 +1,11 @@
2018-01-31 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/69869
* traditional.c (skip_macro_block_comment): Return bool, true if
the macro block comment is unterminated.
(copy_comment): Use return value from skip_macro_block_comment instead
of always false.
2018-01-27 Jakub Jelinek <jakub@redhat.com>
* include/cpplib.h (enum cpp_builtin_type): Change BT_LAST_USER from

View File

@ -119,8 +119,11 @@ check_output_buffer (cpp_reader *pfile, size_t n)
}
/* Skip a C-style block comment in a macro as a result of -CC.
Buffer->cur points to the initial asterisk of the comment. */
static void
PFILE->buffer->cur points to the initial asterisk of the comment,
change it to point to after the '*' and '/' characters that terminate it.
Return true if the macro has not been termined, in that case set
PFILE->buffer->cur to the end of the buffer. */
static bool
skip_macro_block_comment (cpp_reader *pfile)
{
const uchar *cur = pfile->buffer->cur;
@ -131,10 +134,15 @@ skip_macro_block_comment (cpp_reader *pfile)
/* People like decorating comments with '*', so check for '/'
instead for efficiency. */
while(! (*cur++ == '/' && cur[-2] == '*') )
;
while (! (*cur++ == '/' && cur[-2] == '*'))
if (cur[-1] == '\n')
{
pfile->buffer->cur = cur - 1;
return true;
}
pfile->buffer->cur = cur;
return false;
}
/* CUR points to the asterisk introducing a comment in the current
@ -158,7 +166,7 @@ copy_comment (cpp_reader *pfile, const uchar *cur, int in_define)
buffer->cur = cur;
if (pfile->context->prev)
unterminated = false, skip_macro_block_comment (pfile);
unterminated = skip_macro_block_comment (pfile);
else
unterminated = _cpp_skip_block_comment (pfile);