Author: Marek Kurdej Date: 2022-02-13T21:36:58+01:00 New Revision: 25282bd6c4bf54a21c0f8dbf00db6e70922c02fa
URL: https://github.com/llvm/llvm-project/commit/25282bd6c4bf54a21c0f8dbf00db6e70922c02fa DIFF: https://github.com/llvm/llvm-project/commit/25282bd6c4bf54a21c0f8dbf00db6e70922c02fa.diff LOG: [clang-format] Handle PointerAlignment in `if` and `switch` statements with initializers (C++17) the same way as in `for` loops. Reviewed By: MyDeveloperDay, owenpan Differential Revision: https://reviews.llvm.org/D119650 Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index f1db5224fc55b..a6c6ddcad117b 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -26,6 +26,13 @@ namespace format { namespace { +/// Returns \c true if the line starts with a token that can start a statement +/// with an initializer. +static bool startsWithInitStatement(const AnnotatedLine &Line) { + return Line.startsWith(tok::kw_for) || Line.startsWith(tok::kw_if) || + Line.startsWith(tok::kw_switch); +} + /// Returns \c true if the token can be used as an identifier in /// an Objective-C \c \@selector, \c false otherwise. /// @@ -1135,7 +1142,7 @@ class AnnotatingParser { else if (Contexts.back().InInheritanceList) Tok->setType(TT_InheritanceComma); else if (Contexts.back().FirstStartOfName && - (Contexts.size() == 1 || Line.startsWith(tok::kw_for))) { + (Contexts.size() == 1 || startsWithInitStatement(Line))) { Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true; Line.IsMultiVariableDeclStmt = true; } @@ -3090,7 +3097,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, FormatStyle::PAS_Left || (Line.IsMultiVariableDeclStmt && (Left.NestingLevel == 0 || - (Left.NestingLevel == 1 && Line.First->is(tok::kw_for))))); + (Left.NestingLevel == 1 && startsWithInitStatement(Line))))); } if (Right.is(TT_FunctionTypeLParen) && Left.isNot(tok::l_paren) && (!Left.is(TT_PointerOrReference) || diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 40de29e58737f..fc2b121faee02 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -8396,6 +8396,12 @@ TEST_F(FormatTest, DeclarationsOfMultipleVariables) { Style); verifyFormat("vector<int*> a, b;", Style); verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); + verifyFormat("/*comment*/ for (int *p, *q; p != q; p = p->next) {\n}", Style); + verifyFormat("if (int *p, *q; p != q) {\n p = p->next;\n}", Style); + verifyFormat("/*comment*/ if (int *p, *q; p != q) {\n p = p->next;\n}", + Style); + verifyFormat("switch (int *p, *q; p != q) {\n default:\n break;\n}", Style); + verifyFormat("/*comment*/ switch (int *p, *q; p != q) {\n default:\n break;\n}", Style); } TEST_F(FormatTest, ConditionalExpressionsInBrackets) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits