[gcc r16-7173] libcpp: Fix up comment handling in -fdirectives-only preprocessing [PR123273]
Jakub Jelinek
jakub@gcc.gnu.org
Fri Jan 30 09:57:56 GMT 2026
https://gcc.gnu.org/g:1297b7204aca7fbad741ae02086fa5e134083a5f
commit r16-7173-g1297b7204aca7fbad741ae02086fa5e134083a5f
Author: Jakub Jelinek <jakub@redhat.com>
Date: Fri Jan 30 10:56:10 2026 +0100
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.
Diff:
---
gcc/testsuite/c-c++-common/cpp/dir-only-10.c | 5 +++++
gcc/testsuite/c-c++-common/cpp/dir-only-11.c | 6 ++++++
libcpp/lex.cc | 10 ++++++++--
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/gcc/testsuite/c-c++-common/cpp/dir-only-10.c b/gcc/testsuite/c-c++-common/cpp/dir-only-10.c
new file mode 100644
index 000000000000..902d378fd3a2
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/dir-only-10.c
@@ -0,0 +1,5 @@
+/* PR preprocessor/123273 */
+/* { dg-do preprocess } */
+/* { dg-options -fdirectives-only } */
+
+/* *\/""" */
diff --git a/gcc/testsuite/c-c++-common/cpp/dir-only-11.c b/gcc/testsuite/c-c++-common/cpp/dir-only-11.c
new file mode 100644
index 000000000000..33437bd508cb
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/dir-only-11.c
@@ -0,0 +1,6 @@
+/* PR preprocessor/123273 */
+/* { dg-do preprocess } */
+/* { dg-options -fdirectives-only } */
+
+/* *\\
+/""" */
diff --git a/libcpp/lex.cc b/libcpp/lex.cc
index df278534eeee..63f7a5fe5b8a 100644
--- a/libcpp/lex.cc
+++ b/libcpp/lex.cc
@@ -5490,7 +5490,13 @@ cpp_directive_only_process (cpp_reader *pfile,
switch (c)
{
case '\\':
- esc = true;
+ if (esc)
+ {
+ star = false;
+ esc = false;
+ }
+ else
+ esc = true;
break;
case '\r':
@@ -5521,7 +5527,7 @@ cpp_directive_only_process (cpp_reader *pfile,
break;
case '/':
- if (star)
+ if (star && !esc)
goto done_comment;
/* FALLTHROUGH */
More information about the Gcc-cvs
mailing list