[clang] [clang-format] Add IndentPPDirectives Leave option (PR #139750)
Gedare Bloom via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 12 18:22:46 PDT 2025
https://github.com/gedare updated https://github.com/llvm/llvm-project/pull/139750
>From 5faf0fd027ff5ef3927747cd6ca5efea84d6e3c0 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Tue, 13 May 2025 08:42:41 -0600
Subject: [PATCH 1/7] [clang-format] Add IndentPPDirectives Leave option
Allow an option to leave preprocessor directive indenting as-is.
This simplifies handling mixed styles of CPP directive indentation.
Fixes #38511.
---
clang/include/clang/Format/Format.h | 14 +++-
clang/lib/Format/ContinuationIndenter.cpp | 6 ++
clang/lib/Format/Format.cpp | 1 +
clang/lib/Format/TokenAnnotator.cpp | 3 +-
clang/lib/Format/UnwrappedLineFormatter.cpp | 17 +++--
clang/lib/Format/UnwrappedLineParser.cpp | 9 ++-
clang/unittests/Format/FormatTest.cpp | 76 +++++++++++++++++----
7 files changed, 101 insertions(+), 25 deletions(-)
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 03cff5f8cfb66..342fefcfc408c 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -2976,7 +2976,19 @@ struct FormatStyle {
/// #endif
/// #endif
/// \endcode
- PPDIS_BeforeHash
+ PPDIS_BeforeHash,
+ /// Leaves indentation of directives as-is.
+ /// \note
+ /// Ignores ``PPIndentWidth``.
+ /// \endnote
+ /// \code
+ /// #if FOO
+ /// #if BAR
+ /// #include <foo>
+ /// #endif
+ /// #endif
+ /// \endcode
+ PPDIS_Leave
};
/// The preprocessor directive indenting style to use.
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 888d0faf80931..a02c1fef19cea 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -778,6 +778,12 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
+ if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave &&
+ State.Line->InPPDirective && Previous.is(tok::hash) &&
+ &Previous == State.Line->First) {
+ Spaces += Current.OriginalColumn - Previous.OriginalColumn - 1;
+ }
+
// Indent preprocessor directives after the hash if required.
int PPColumnCorrection = 0;
if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash &&
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index f095d2c18cfcf..1776e373cf8a8 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -535,6 +535,7 @@ struct ScalarEnumerationTraits<FormatStyle::PPDirectiveIndentStyle> {
IO.enumCase(Value, "None", FormatStyle::PPDIS_None);
IO.enumCase(Value, "AfterHash", FormatStyle::PPDIS_AfterHash);
IO.enumCase(Value, "BeforeHash", FormatStyle::PPDIS_BeforeHash);
+ IO.enumCase(Value, "Leave", FormatStyle::PPDIS_Leave);
}
};
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index bbb7ef2c337d6..e20c50f387f41 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -3627,7 +3627,8 @@ void TokenAnnotator::setCommentLineLevels(
// Align comments for preprocessor lines with the # in column 0 if
// preprocessor lines are not indented. Otherwise, align with the next
// line.
- Line->Level = Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash &&
+ Line->Level = (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_None) &&
PPDirectiveOrImportStmt
? 0
: NextNonCommentLine->Level;
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index 2a7bfd1a7dc5b..561d303039010 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -62,10 +62,16 @@ class LevelIndentTracker {
// having the right size in adjustToUnmodifiedline.
if (Line.Level >= IndentForLevel.size())
IndentForLevel.resize(Line.Level + 1, -1);
- if (Style.IndentPPDirectives != FormatStyle::PPDIS_None &&
- (Line.InPPDirective ||
- (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
- Line.Type == LT_CommentAbovePPDirective))) {
+ if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave &&
+ Line.InPPDirective) {
+ Indent = Line.InMacroBody
+ ? (Line.Level - Line.PPLevel) * Style.IndentWidth +
+ AdditionalIndent
+ : Line.First->OriginalColumn;
+ } else if (Style.IndentPPDirectives != FormatStyle::PPDIS_None &&
+ (Line.InPPDirective ||
+ (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
+ Line.Type == LT_CommentAbovePPDirective))) {
unsigned PPIndentWidth =
(Style.PPIndentWidth >= 0) ? Style.PPIndentWidth : Style.IndentWidth;
Indent = Line.InMacroBody
@@ -1656,7 +1662,8 @@ void UnwrappedLineFormatter::formatFirstToken(
// Preprocessor directives get indented before the hash only if specified. In
// Javascript import statements are indented like normal statements.
if (!Style.isJavaScript() &&
- Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash &&
+ (Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) &&
(Line.Type == LT_PreprocessorDirective ||
Line.Type == LT_ImportStatement)) {
Indent = 0;
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index f4bbfcf8461bc..ff5b8b01f3e80 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -162,7 +162,8 @@ UnwrappedLineParser::UnwrappedLineParser(
LangOpts(getFormattingLangOpts(Style)), Keywords(Keywords),
CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr),
Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1),
- IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None
+ IncludeGuard((Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_Leave)
? IG_Rejected
: IG_Inited),
IncludeGuardToken(nullptr), FirstStartColumn(FirstStartColumn),
@@ -170,7 +171,8 @@ UnwrappedLineParser::UnwrappedLineParser(
void UnwrappedLineParser::reset() {
PPBranchLevel = -1;
- IncludeGuard = Style.IndentPPDirectives == FormatStyle::PPDIS_None
+ IncludeGuard = Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_Leave
? IG_Rejected
: IG_Inited;
IncludeGuardToken = nullptr;
@@ -1140,7 +1142,8 @@ void UnwrappedLineParser::parsePPEndIf() {
// If the #endif of a potential include guard is the last thing in the file,
// then we found an include guard.
if (IncludeGuard == IG_Defined && PPBranchLevel == -1 && Tokens->isEOF() &&
- Style.IndentPPDirectives != FormatStyle::PPDIS_None) {
+ !(Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_Leave)) {
IncludeGuard = IG_Found;
}
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 4e9d31895998f..223bab5d285d2 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5527,7 +5527,6 @@ TEST_F(FormatTest, IndentsPPDirectiveWithPPIndentWidth) {
" x; \\\n"
" }",
style);
-
style.PPIndentWidth = 2;
verifyFormat("#ifdef foo\n"
"#define bar() \\\n"
@@ -5547,22 +5546,55 @@ TEST_F(FormatTest, IndentsPPDirectiveWithPPIndentWidth) {
"#endif",
style);
+ style.IndentPPDirectives = FormatStyle::PPDIS_Leave;
+ style.IndentWidth = 4;
+ verifyNoChange("#ifndef foo\n"
+ "#define foo\n"
+ "if (emacs) {\n"
+ "#ifdef is\n"
+ "#define lit \\\n"
+ " if (af) { \\\n"
+ " return duh(); \\\n"
+ " }\n"
+ "#endif\n"
+ "}\n"
+ "#endif",
+ style);
+ verifyNoChange("#ifndef foo\n"
+ " #define foo\n"
+ "if (emacs) {\n"
+ " #ifdef is\n"
+ "#define lit \\\n"
+ " if (af) { \\\n"
+ " return duh(); \\\n"
+ " }\n"
+ " #endif\n"
+ "}\n"
+ "#endif",
+ style);
+ verifyNoChange(" #ifndef foo\n"
+ "# define foo\n"
+ "if (emacs) {\n"
+ "#ifdef is\n"
+ " # define lit \\\n"
+ " if (af) { \\\n"
+ " return duh(); \\\n"
+ " }\n"
+ "#endif\n"
+ "}\n"
+ " #endif",
+ style);
+
style.IndentWidth = 1;
style.PPIndentWidth = 4;
- verifyFormat("#if 1\n"
- "#define X \\\n"
- " { \\\n"
- " x; \\\n"
- " x; \\\n"
- " }\n"
- "#endif",
- style);
- verifyFormat("#define X \\\n"
- " { \\\n"
- " x; \\\n"
- " x; \\\n"
- " }",
- style);
+ verifyNoChange("# if 1\n"
+ " #define X \\\n"
+ " { \\\n"
+ " x; \\\n"
+ " x; \\\n"
+ " }\n"
+ "# endif",
+ style);
style.IndentWidth = 4;
style.PPIndentWidth = 1;
@@ -25597,6 +25629,20 @@ TEST_F(FormatTest, SkipMacroDefinitionBody) {
"a",
Style);
+ Style.IndentPPDirectives = FormatStyle::PPDIS_Leave;
+ verifyNoChange("#if A\n"
+ "#define A a\n"
+ "#endif",
+ Style);
+ verifyNoChange("#if A\n"
+ " #define A a\n"
+ "#endif",
+ Style);
+ verifyNoChange("#if A\n"
+ "# define A a\n"
+ "#endif",
+ Style);
+
// Adjust indendations but don't change the definition.
Style.IndentPPDirectives = FormatStyle::PPDIS_None;
verifyNoChange("#if A\n"
>From 7131f2446e86b289d6a680b4c06a363291eec59c Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Tue, 13 May 2025 08:49:27 -0600
Subject: [PATCH 2/7] clang-format-style
---
clang/docs/ClangFormatStyleOptions.rst | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index 6be4d512bda6a..9413b9a348b76 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -4426,6 +4426,21 @@ the configuration (without a prefix: ``Auto``).
#endif
#endif
+ * ``PPDIS_Leave`` (in configuration: ``Leave``)
+ Leaves indentation of directives as-is.
+
+ .. note::
+
+ Ignores ``PPIndentWidth``.
+
+ .. code-block:: c++
+
+ #if FOO
+ #if BAR
+ #include <foo>
+ #endif
+ #endif
+
.. _IndentRequiresClause:
>From 1d757daa677f09c6f0fe719a562a105530ec8362 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Tue, 13 May 2025 08:52:09 -0600
Subject: [PATCH 3/7] release notes
---
clang/docs/ReleaseNotes.rst | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 51e5973098c14..47299d1cd9a5f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -470,8 +470,10 @@ AST Matchers
clang-format
------------
- Add ``SpaceInEmptyBraces`` option and set it to ``Always`` for WebKit style.
+<<<<<<< HEAD
- Add ``NumericLiteralCase`` option for enforcing character case in numeric
literals.
+- Add ``Leave`` suboption to ``IndentPPDirectives``.
libclang
--------
>From a0532119c32d18dd56a73ef43c758cef7fe34a76 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Thu, 15 May 2025 21:46:14 -0600
Subject: [PATCH 4/7] remove spurious whitespace change
---
clang/unittests/Format/FormatTest.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 223bab5d285d2..80ea0ab555365 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5527,6 +5527,7 @@ TEST_F(FormatTest, IndentsPPDirectiveWithPPIndentWidth) {
" x; \\\n"
" }",
style);
+
style.PPIndentWidth = 2;
verifyFormat("#ifdef foo\n"
"#define bar() \\\n"
>From 7039ddcbba05aec747ef2f5c896bd057a56b253b Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Mon, 19 May 2025 13:15:05 -0600
Subject: [PATCH 5/7] Update clang/lib/Format/UnwrappedLineParser.cpp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Björn Schäpers <github at hazardy.de>
---
clang/lib/Format/UnwrappedLineParser.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index ff5b8b01f3e80..4812dddf4216c 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1142,8 +1142,8 @@ void UnwrappedLineParser::parsePPEndIf() {
// If the #endif of a potential include guard is the last thing in the file,
// then we found an include guard.
if (IncludeGuard == IG_Defined && PPBranchLevel == -1 && Tokens->isEOF() &&
- !(Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
- Style.IndentPPDirectives == FormatStyle::PPDIS_Leave)) {
+ Style.IndentPPDirectives != FormatStyle::PPDIS_None &&
+ Style.IndentPPDirectives != FormatStyle::PPDIS_Leave) {
IncludeGuard = IG_Found;
}
}
>From 2ee8fabaea372cd2a79a23c20081782ed65cc0f6 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Thu, 11 Sep 2025 13:45:20 -0600
Subject: [PATCH 6/7] Handle comment above PP Directive
---
clang/lib/Format/UnwrappedLineFormatter.cpp | 2 +-
clang/unittests/Format/FormatTest.cpp | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index 561d303039010..0fb0dd7f2f164 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -63,7 +63,7 @@ class LevelIndentTracker {
if (Line.Level >= IndentForLevel.size())
IndentForLevel.resize(Line.Level + 1, -1);
if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave &&
- Line.InPPDirective) {
+ (Line.InPPDirective || Line.Type == LT_CommentAbovePPDirective)) {
Indent = Line.InMacroBody
? (Line.Level - Line.PPLevel) * Style.IndentWidth +
AdditionalIndent
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 80ea0ab555365..79eb341f91ed5 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5585,6 +5585,13 @@ TEST_F(FormatTest, IndentsPPDirectiveWithPPIndentWidth) {
"}\n"
" #endif",
style);
+ verifyNoChange("#ifdef foo\n"
+ "#else\n"
+ "/* This is a comment */\n"
+ "#ifdef BAR\n"
+ "#endif\n"
+ "#endif",
+ style);
style.IndentWidth = 1;
style.PPIndentWidth = 4;
>From 35abd12c3a6d431ad6012e34e3951b99d2206059 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Fri, 12 Sep 2025 19:22:03 -0600
Subject: [PATCH 7/7] Updates from review
---
clang/lib/Format/ContinuationIndenter.cpp | 30 +++++++++------------
clang/lib/Format/TokenAnnotator.cpp | 3 +--
clang/lib/Format/UnwrappedLineFormatter.cpp | 3 +--
clang/lib/Format/UnwrappedLineParser.cpp | 4 +--
clang/unittests/Format/FormatTest.cpp | 17 ++++++++++++
5 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index a02c1fef19cea..9413c13a4137e 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -778,27 +778,23 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
- if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave &&
- State.Line->InPPDirective && Previous.is(tok::hash) &&
- &Previous == State.Line->First) {
- Spaces += Current.OriginalColumn - Previous.OriginalColumn - 1;
- }
-
// Indent preprocessor directives after the hash if required.
int PPColumnCorrection = 0;
- if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash &&
- Previous.is(tok::hash) && State.FirstIndent > 0 &&
- &Previous == State.Line->First &&
+ if (&Previous == State.Line->First && Previous.is(tok::hash) &&
(State.Line->Type == LT_PreprocessorDirective ||
State.Line->Type == LT_ImportStatement)) {
- Spaces += State.FirstIndent;
-
- // For preprocessor indent with tabs, State.Column will be 1 because of the
- // hash. This causes second-level indents onward to have an extra space
- // after the tabs. We avoid this misalignment by subtracting 1 from the
- // column value passed to replaceWhitespace().
- if (Style.UseTab != FormatStyle::UT_Never)
- PPColumnCorrection = -1;
+ if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) {
+ Spaces += State.FirstIndent;
+
+ // For preprocessor indent with tabs, State.Column will be 1 because of
+ // the hash. This causes second-level indents onward to have an extra
+ // space after the tabs. We avoid this misalignment by subtracting 1 from
+ // the column value passed to replaceWhitespace().
+ if (Style.UseTab != FormatStyle::UT_Never)
+ PPColumnCorrection = -1;
+ } else if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave) {
+ Spaces += Current.OriginalColumn - Previous.OriginalColumn - 1;
+ }
}
if (!DryRun) {
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index e20c50f387f41..d97f56751ea69 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -3627,8 +3627,7 @@ void TokenAnnotator::setCommentLineLevels(
// Align comments for preprocessor lines with the # in column 0 if
// preprocessor lines are not indented. Otherwise, align with the next
// line.
- Line->Level = (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash ||
- Style.IndentPPDirectives == FormatStyle::PPDIS_None) &&
+ Line->Level = Style.IndentPPDirectives < FormatStyle::PPDIS_BeforeHash &&
PPDirectiveOrImportStmt
? 0
: NextNonCommentLine->Level;
diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp
index 0fb0dd7f2f164..ac9d147defc13 100644
--- a/clang/lib/Format/UnwrappedLineFormatter.cpp
+++ b/clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -1662,8 +1662,7 @@ void UnwrappedLineFormatter::formatFirstToken(
// Preprocessor directives get indented before the hash only if specified. In
// Javascript import statements are indented like normal statements.
if (!Style.isJavaScript() &&
- (Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
- Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) &&
+ Style.IndentPPDirectives < FormatStyle::PPDIS_BeforeHash &&
(Line.Type == LT_PreprocessorDirective ||
Line.Type == LT_ImportStatement)) {
Indent = 0;
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 4812dddf4216c..6bb1de50c94a6 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -162,8 +162,8 @@ UnwrappedLineParser::UnwrappedLineParser(
LangOpts(getFormattingLangOpts(Style)), Keywords(Keywords),
CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr),
Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1),
- IncludeGuard((Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
- Style.IndentPPDirectives == FormatStyle::PPDIS_Leave)
+ IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None ||
+ Style.IndentPPDirectives == FormatStyle::PPDIS_Leave
? IG_Rejected
: IG_Inited),
IncludeGuardToken(nullptr), FirstStartColumn(FirstStartColumn),
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 79eb341f91ed5..d9db06667d802 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5547,6 +5547,23 @@ TEST_F(FormatTest, IndentsPPDirectiveWithPPIndentWidth) {
"#endif",
style);
+ style.IndentWidth = 1;
+ style.PPIndentWidth = 4;
+ verifyFormat("#if 1\n"
+ "#define X \\\n"
+ " { \\\n"
+ " x; \\\n"
+ " x; \\\n"
+ " }\n"
+ "#endif",
+ style);
+ verifyFormat("#define X \\\n"
+ " { \\\n"
+ " x; \\\n"
+ " x; \\\n"
+ " }",
+ style);
+
style.IndentPPDirectives = FormatStyle::PPDIS_Leave;
style.IndentWidth = 4;
verifyNoChange("#ifndef foo\n"
More information about the cfe-commits
mailing list