Skip to content

Commit

Permalink
[clang-format] Don't finalize #if, #else, #endif, etc.
Browse files Browse the repository at this point in the history
Don't finalize a preprocessor branch directive if it's the first
token of an annotated line. See the rationale at
https://reviews.llvm.org/D150057#inline-1449546.

Fixes #63379

Differential Revision: https://reviews.llvm.org/D153243
  • Loading branch information
owenca committed Jun 21, 2023
1 parent a27c416 commit 8e85739
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
12 changes: 10 additions & 2 deletions clang/lib/Format/UnwrappedLineFormatter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1411,8 +1411,16 @@ unsigned UnwrappedLineFormatter::format(
NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
RangeMinLevel = UINT_MAX;
}
if (!DryRun)
markFinalized(TheLine.First);
if (!DryRun) {
auto *Tok = TheLine.First;
if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next &&
Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
tok::pp_else, tok::pp_endif)) {
Tok = Tok->Next;
}
markFinalized(Tok);
}
}
PenaltyCache[CacheKey] = Penalty;
return Penalty;
Expand Down
10 changes: 1 addition & 9 deletions clang/lib/Format/WhitespaceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,8 @@ void WhitespaceManager::replaceWhitespace(FormatToken &Tok, unsigned Newlines,
unsigned Spaces,
unsigned StartOfTokenColumn,
bool IsAligned, bool InPPDirective) {
auto PPBranchDirectiveStartsLine = [&Tok] {
return Tok.is(tok::hash) && !Tok.Previous && Tok.Next &&
Tok.Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
tok::pp_else, tok::pp_endif);
};
if ((Tok.Finalized && !PPBranchDirectiveStartsLine()) ||
(Tok.MacroCtx && Tok.MacroCtx->Role == MR_ExpandedArg)) {
if (Tok.Finalized || (Tok.MacroCtx && Tok.MacroCtx->Role == MR_ExpandedArg))
return;
}
Tok.setDecision((Newlines > 0) ? FD_Break : FD_Continue);
Changes.push_back(Change(Tok, /*CreateReplacement=*/true, Tok.WhitespaceRange,
Spaces, StartOfTokenColumn, Newlines, "", "",
Expand Down
7 changes: 7 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23106,6 +23106,13 @@ TEST_F(FormatTest, DisableRegions) {
"int* j;\n"
"// clang-format only\n"
"int* k;");

verifyNoChange("// clang-format off\n"
"#if 0\n"
" #if SHOULD_STAY_INDENTED\n"
" #endif\n"
"#endif\n"
"// clang-format on");
}

TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
Expand Down

0 comments on commit 8e85739

Please sign in to comment.