mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-21 19:35:28 -05:00
libcpp: Fix up comment handling in -fdirectives-only preprocessing [PR123273]
Back in 2020 Nathan rewrote the -E -fdirectives-only preprocessing. In PR103130 a year and half later I've fixed the handling of comments so that /* \*/ is considered as full comment even when * is escaped, to match the normal preprocessing. The following testcases shows further bugs in the comment handling. One is that /* *\/ should not be considered as full comment (i.e. when the / after * is escaped). And another one is that the code was treating any number of backslashes as escape, which is wrong, only a single backslash is an escape, two backslashes preprocess as one backslash, three as one backslash and one escape, etc. So, while /* *\ / is a full comment, /* *\\ / or /* *\\\\\\\\\\\\\ / is not. 2026-01-30 Jakub Jelinek <jakub@redhat.com> PR preprocessor/123273 * lex.cc (cpp_directive_only_process): Only go to done_comment for '/' if star is true and esc is false. When seeing '\\' with esc set to true, clear esc as well as star instead of keeping esc set. * c-c++-common/cpp/dir-only-10.c: New test. * c-c++-common/cpp/dir-only-11.c: New test.
This commit is contained in:
committed by
Jakub Jelinek
parent
0779f13125
commit
1297b7204a
5
gcc/testsuite/c-c++-common/cpp/dir-only-10.c
Normal file
5
gcc/testsuite/c-c++-common/cpp/dir-only-10.c
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
/* PR preprocessor/123273 */
|
||||||
|
/* { dg-do preprocess } */
|
||||||
|
/* { dg-options -fdirectives-only } */
|
||||||
|
|
||||||
|
/* *\/""" */
|
||||||
6
gcc/testsuite/c-c++-common/cpp/dir-only-11.c
Normal file
6
gcc/testsuite/c-c++-common/cpp/dir-only-11.c
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/* PR preprocessor/123273 */
|
||||||
|
/* { dg-do preprocess } */
|
||||||
|
/* { dg-options -fdirectives-only } */
|
||||||
|
|
||||||
|
/* *\\
|
||||||
|
/""" */
|
||||||
@@ -5490,7 +5490,13 @@ cpp_directive_only_process (cpp_reader *pfile,
|
|||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case '\\':
|
case '\\':
|
||||||
esc = true;
|
if (esc)
|
||||||
|
{
|
||||||
|
star = false;
|
||||||
|
esc = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
esc = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\r':
|
case '\r':
|
||||||
@@ -5521,7 +5527,7 @@ cpp_directive_only_process (cpp_reader *pfile,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
if (star)
|
if (star && !esc)
|
||||||
goto done_comment;
|
goto done_comment;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user