From 8e85739a5f24e34cb22768fe6ef33b593ed054df Mon Sep 17 00:00:00 2001 From: Owen Pan Date: Sun, 18 Jun 2023 23:18:00 -0700 Subject: [PATCH] [clang-format] Don't finalize #if, #else, #endif, etc. 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 --- clang/lib/Format/UnwrappedLineFormatter.cpp | 12 ++++++++++-- clang/lib/Format/WhitespaceManager.cpp | 10 +--------- clang/unittests/Format/FormatTest.cpp | 7 +++++++ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp index 6d9a43d..3eacd020 100644 --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -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; diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp index 040b953..2425552 100644 --- a/clang/lib/Format/WhitespaceManager.cpp +++ b/clang/lib/Format/WhitespaceManager.cpp @@ -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, "", "", diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 4c58df8..6b05404 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -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) { -- 2.7.4