From: Jakub Jelinek Date: Fri, 30 Jan 2026 09:56:10 +0000 (+0100) Subject: libcpp: Fix up comment handling in -fdirectives-only preprocessing [PR123273] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1297b7204aca7fbad741ae02086fa5e134083a5f;p=thirdparty%2Fgcc.git 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 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 --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 00000000000..902d378fd3a --- /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 00000000000..33437bd508c --- /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 df278534eee..63f7a5fe5b8 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 */