]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libcpp: Fix up comment handling in -fdirectives-only preprocessing [PR123273]
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Jan 2026 09:56:10 +0000 (10:56 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Jan 2026 09:56:10 +0000 (10:56 +0100)
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.

gcc/testsuite/c-c++-common/cpp/dir-only-10.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/dir-only-11.c [new file with mode: 0644]
libcpp/lex.cc

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 (file)
index 0000000..902d378
--- /dev/null
@@ -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 (file)
index 0000000..33437bd
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR preprocessor/123273 */
+/* { dg-do preprocess } */
+/* { dg-options -fdirectives-only } */
+
+/* *\\
+/""" */
index df278534eeeef43184e9c10e9187c70c27721764..63f7a5fe5b8a5b555bfd0ee8b0b28d8d42c30e69 100644 (file)
@@ -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  */