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:
Jakub Jelinek
2026-01-30 10:56:10 +01:00
committed by Jakub Jelinek
parent 0779f13125
commit 1297b7204a
3 changed files with 19 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
/* PR preprocessor/123273 */
/* { dg-do preprocess } */
/* { dg-options -fdirectives-only } */
/* *\/""" */

View File

@@ -0,0 +1,6 @@
/* PR preprocessor/123273 */
/* { dg-do preprocess } */
/* { dg-options -fdirectives-only } */
/* *\\
/""" */

View File

@@ -5490,6 +5490,12 @@ cpp_directive_only_process (cpp_reader *pfile,
switch (c)
{
case '\\':
if (esc)
{
star = false;
esc = false;
}
else
esc = true;
break;
@@ -5521,7 +5527,7 @@ cpp_directive_only_process (cpp_reader *pfile,
break;
case '/':
if (star)
if (star && !esc)
goto done_comment;
/* FALLTHROUGH */