https://github.com/ZhongRuoyu created 
https://github.com/llvm/llvm-project/pull/164300

Line comments in preprocessor directives were incorrectly marked as continuing 
the directive, causing clang-format to add backslashes after them on repeated 
runs. Line comments cannot span multiple lines with backslashes, so they should 
not be treated as PP directive continuations.

Fix by unsetting `InPPDirective` in `WhitespaceManager::replaceWhitespace` for 
line comments in two places: when breaking lines and when formatting tokens on 
the same line. This stops the spurious backslash insertion for both standalone 
line comments after preprocessor directives and trailing line comments after 
macro bodies.

Fixes https://github.com/llvm/llvm-project/issues/164282.


>From 4f19c01f0608821cadebfb969771c69243796ae0 Mon Sep 17 00:00:00 2001
From: Ruoyu Zhong <[email protected]>
Date: Tue, 21 Oct 2025 02:44:16 +0800
Subject: [PATCH] [clang-format] Fix repeated backslash insertion in macro line
 comments

Line comments in preprocessor directives were incorrectly marked as
continuing the directive, causing clang-format to add backslashes
after them on repeated runs. Line comments cannot span multiple lines
with backslashes, so they should not be treated as PP directive
continuations.

Fix by unsetting InPPDirective in WhitespaceManager::replaceWhitespace
for line comments in two places: when breaking lines and when formatting
tokens on the same line. This stops the spurious backslash insertion for
both standalone line comments after preprocessor directives and trailing
line comments after macro bodies.

Fixes https://github.com/llvm/llvm-project/issues/164282.
---
 clang/lib/Format/ContinuationIndenter.cpp     |  9 ++++++---
 clang/unittests/Format/FormatTestComments.cpp | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Format/ContinuationIndenter.cpp 
b/clang/lib/Format/ContinuationIndenter.cpp
index 26a95421775f3..1b0a2f001474d 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -798,9 +798,11 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState 
&State, bool DryRun,
   }
 
   if (!DryRun) {
+    bool ContinuePPDirective =
+        State.Line->InMacroBody && Current.isNot(TT_LineComment);
     Whitespaces.replaceWhitespace(Current, /*Newlines=*/0, Spaces,
                                   State.Column + Spaces + PPColumnCorrection,
-                                  /*IsAligned=*/false, 
State.Line->InMacroBody);
+                                  /*IsAligned=*/false, ContinuePPDirective);
   }
 
   // If "BreakBeforeInheritanceComma" mode, don't break within the inheritance
@@ -1178,8 +1180,9 @@ unsigned 
ContinuationIndenter::addTokenOnNewLine(LineState &State,
     }
     unsigned Newlines =
         std::max(1u, std::min(Current.NewlinesBefore, MaxEmptyLinesToKeep));
-    bool ContinuePPDirective =
-        State.Line->InPPDirective && State.Line->Type != LT_ImportStatement;
+    bool ContinuePPDirective = State.Line->InPPDirective &&
+                               State.Line->Type != LT_ImportStatement &&
+                               Current.isNot(TT_LineComment);
     Whitespaces.replaceWhitespace(Current, Newlines, State.Column, 
State.Column,
                                   CurrentState.IsAligned, ContinuePPDirective);
   }
diff --git a/clang/unittests/Format/FormatTestComments.cpp 
b/clang/unittests/Format/FormatTestComments.cpp
index fc80bf4024fd9..f5c791a29ba02 100644
--- a/clang/unittests/Format/FormatTestComments.cpp
+++ b/clang/unittests/Format/FormatTestComments.cpp
@@ -839,6 +839,25 @@ TEST_F(FormatTestComments, MultiLineCommentsInDefines) {
                    getLLVMStyleWithColumns(17)));
 }
 
+TEST_F(FormatTestComments, LineCommentsInMacrosDoNotGetEscapedNewlines) {
+  FormatStyle Style = getLLVMStyleWithColumns(0);
+  Style.ReflowComments = FormatStyle::RCS_Never;
+  verifyFormat("#define FOO (1U) // comment\n"
+               "                 // comment",
+               Style);
+
+  Style.ColumnLimit = 32;
+  EXPECT_EQ("#define SOME_MACRO(x) x\n"
+            "#define FOO                    \\\n"
+            "  SOME_MACRO(1) +              \\\n"
+            "      SOME_MACRO(2) // comment\n"
+            "                    // comment",
+            format("#define SOME_MACRO(x) x\n"
+                   "#define FOO SOME_MACRO(1) + SOME_MACRO(2) // comment\n"
+                   "                                          // comment",
+                   Style));
+}
+
 TEST_F(FormatTestComments, ParsesCommentsAdjacentToPPDirectives) {
   EXPECT_EQ("namespace {}\n// Test\n#define A",
             format("namespace {}\n   // Test\n#define A"));

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to