Author: owenca Date: 2022-03-05T12:46:57-08:00 New Revision: 28b76b1e23bb25ed333183361705841ff8f77574
URL: https://github.com/llvm/llvm-project/commit/28b76b1e23bb25ed333183361705841ff8f77574 DIFF: https://github.com/llvm/llvm-project/commit/28b76b1e23bb25ed333183361705841ff8f77574.diff LOG: [clang-format] Handle goto labels for RemoveBracesLLVM Differential Revision: https://reviews.llvm.org/D121042 Added: Modified: clang/lib/Format/UnwrappedLineParser.cpp clang/lib/Format/UnwrappedLineParser.h clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 646374c0cd626..a62aa5e649839 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -476,6 +476,7 @@ bool UnwrappedLineParser::parseLevel(bool HasOpeningBrace, : TT_Unknown; const bool IsPrecededByCommentOrPPDirective = !Style.RemoveBracesLLVM || precededByCommentOrPPDirective(); + bool HasLabel = false; unsigned StatementCount = 0; bool SwitchLabelEncountered = false; do { @@ -486,9 +487,9 @@ bool UnwrappedLineParser::parseLevel(bool HasOpeningBrace, kind = tok::r_brace; auto ParseDefault = [this, HasOpeningBrace, IfKind, NextLevelLBracesType, - &StatementCount] { - parseStructuralElement(IfKind, /*IsTopLevel=*/!HasOpeningBrace, - /*NextLBracesType=*/NextLevelLBracesType); + &HasLabel, &StatementCount] { + parseStructuralElement(IfKind, !HasOpeningBrace, NextLevelLBracesType, + HasLabel ? nullptr : &HasLabel); ++StatementCount; assert(StatementCount > 0 && "StatementCount overflow!"); }; @@ -523,7 +524,7 @@ bool UnwrappedLineParser::parseLevel(bool HasOpeningBrace, if (HasOpeningBrace) { if (!Style.RemoveBracesLLVM) return false; - if (FormatTok->isNot(tok::r_brace) || StatementCount != 1 || + if (FormatTok->isNot(tok::r_brace) || StatementCount != 1 || HasLabel || IsPrecededByCommentOrPPDirective || precededByCommentOrPPDirective()) return false; @@ -1312,7 +1313,8 @@ void UnwrappedLineParser::readTokenWithJavaScriptASI() { void UnwrappedLineParser::parseStructuralElement(IfStmtKind *IfKind, bool IsTopLevel, - TokenType NextLBracesType) { + TokenType NextLBracesType, + bool *HasLabel) { if (Style.Language == FormatStyle::LK_TableGen && FormatTok->is(tok::pp_include)) { nextToken(); @@ -1758,6 +1760,8 @@ void UnwrappedLineParser::parseStructuralElement(IfStmtKind *IfKind, if (FormatTok->is(tok::colon) && !Line->MustBeDeclaration) { Line->Tokens.begin()->Tok->MustBreakBefore = true; parseLabel(!Style.IndentGotoLabels); + if (HasLabel) + *HasLabel = true; return; } // Recognize function-like macro usages without trailing semicolon as diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h index b2a2ae1bedc17..5cc01398a5457 100644 --- a/clang/lib/Format/UnwrappedLineParser.h +++ b/clang/lib/Format/UnwrappedLineParser.h @@ -112,7 +112,8 @@ class UnwrappedLineParser { void readTokenWithJavaScriptASI(); void parseStructuralElement(IfStmtKind *IfKind = nullptr, bool IsTopLevel = false, - TokenType NextLBracesType = TT_Unknown); + TokenType NextLBracesType = TT_Unknown, + bool *HasLabel = nullptr); bool tryToParseBracedList(); bool parseBracedList(bool ContinueOnSemicolons = false, bool IsEnum = false, tok::TokenKind ClosingBraceKind = tok::r_brace); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index f453a4f77f8b3..8909acdae5dc3 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -25018,6 +25018,23 @@ TEST_F(FormatTest, RemoveBraces) { "}", Style); + verifyFormat("if (a) {\n" + "Label:\n" + "}", + Style); + + verifyFormat("if (a) {\n" + "Label:\n" + " f();\n" + "}", + Style); + + verifyFormat("if (a) {\n" + " f();\n" + "Label:\n" + "}", + Style); + // FIXME: See https://github.com/llvm/llvm-project/issues/53543. #if 0 Style.ColumnLimit = 65; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits