diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 2f27bf912fa2f..78405f23e4003 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2163,6 +2163,9 @@ void UnwrappedLineParser::parseIfThenElse() { nextToken(); if (FormatTok->Tok.is(tok::l_paren)) parseParens(); + // handle AttributeMacro if (x) UNLIKELY + if (FormatTok->is(TT_AttributeMacro)) + nextToken(); // handle [[likely]] / [[unlikely]] if (FormatTok->is(tok::l_square) && tryToParseSimpleAttribute()) parseSquare(); @@ -2182,6 +2185,9 @@ void UnwrappedLineParser::parseIfThenElse() { } if (FormatTok->Tok.is(tok::kw_else)) { nextToken(); + // handle AttributeMacro else UNLIKELY + if (FormatTok->is(TT_AttributeMacro)) + nextToken(); // handle [[likely]] / [[unlikely]] if (FormatTok->Tok.is(tok::l_square) && tryToParseSimpleAttribute()) parseSquare(); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 37d08d2d91292..2eb10609646a6 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -22274,6 +22274,42 @@ TEST_F(FormatTest, LikelyUnlikely) { " return 29;\n" "}", Style); + + verifyFormat("if (argc > 5) [[unlikely]]\n" + " return 29;\n", + Style); + verifyFormat("if (argc > 5) [[likely]]\n" + " return 29;\n", + Style); + + Style.AttributeMacros.push_back("UNLIKELY"); + Style.AttributeMacros.push_back("LIKELY"); + verifyFormat("if (argc > 5) UNLIKELY\n" + " return 29;\n", + Style); + + verifyFormat("if (argc > 5) UNLIKELY {\n" + " return 29;\n" + "}", + Style); + verifyFormat("if (argc > 5) UNLIKELY {\n" + " return 29;\n" + "} else [[likely]] {\n" + " return 42;\n" + "}\n", + Style); + verifyFormat("if (argc > 5) UNLIKELY {\n" + " return 29;\n" + "} else LIKELY {\n" + " return 42;\n" + "}\n", + Style); + verifyFormat("if (argc > 5) [[unlikely]] {\n" + " return 29;\n" + "} else LIKELY {\n" + " return 42;\n" + "}\n", + Style); } TEST_F(FormatTest, PenaltyIndentedWhitespace) {