[clang] 5d82cb3 - [clang-format] @lefticus just taught the world how to use [[unlikely]] but we forgot to teach clang-format
via cfe-commits
cfe-commits at lists.llvm.org
Tue May 19 08:51:03 PDT 2020
Author: mydeveloperday
Date: 2020-05-19T16:50:24+01:00
New Revision: 5d82cb3c3a6af8d12b87bcbdc6abd3b7f4b01652
URL: https://github.com/llvm/llvm-project/commit/5d82cb3c3a6af8d12b87bcbdc6abd3b7f4b01652
DIFF: https://github.com/llvm/llvm-project/commit/5d82cb3c3a6af8d12b87bcbdc6abd3b7f4b01652.diff
LOG: [clang-format] @lefticus just taught the world how to use [[unlikely]] but we forgot to teach clang-format
Summary:
https://twitter.com/lefticus/status/1262392152950288384?s=20
Jason Turner's (@lefticus) most recent C++ weekly explains the usage of [[likely]] and [[unlikely]] in an 'if/else' context in C++ 20
clang-format leaves the code a little messy afterwards..
```
if (argc > 5)
[[unlikely]] {
// ...
}
else if (argc < 0)
[[likely]] {
// ...
}
else
[[likely]] {
// ...
}
```
try to improve the situation
```
if (argc > 5) [[unlikely]] {
// ...
} else if (argc < 0) [[likely]] {
// ...
} else [[likely]] {
// ...
}
```
Reviewed By: JakeMerdichAMD
Subscribers: cfe-commits, lefticus
Tags: #clang, #clang-format
Differential Revision: https://reviews.llvm.org/D80144
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index de820ba05c56..7aaf6345876f 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1956,6 +1956,9 @@ void UnwrappedLineParser::parseIfThenElse() {
nextToken();
if (FormatTok->Tok.is(tok::l_paren))
parseParens();
+ // handle [[likely]] / [[unlikely]]
+ if (FormatTok->is(tok::l_square))
+ parseSquare();
bool NeedsUnwrappedLine = false;
if (FormatTok->Tok.is(tok::l_brace)) {
CompoundStatementIndenter Indenter(this, Style, Line->Level);
@@ -1972,6 +1975,9 @@ void UnwrappedLineParser::parseIfThenElse() {
}
if (FormatTok->Tok.is(tok::kw_else)) {
nextToken();
+ // handle [[likely]] / [[unlikely]]
+ if (FormatTok->is(tok::l_square))
+ parseSquare();
if (FormatTok->Tok.is(tok::l_brace)) {
CompoundStatementIndenter Indenter(this, Style, Line->Level);
parseBlock(/*MustBeDeclaration=*/false);
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 35da582dcd65..a0b1dc7331e1 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -16363,6 +16363,36 @@ TEST_F(FormatTest, VeryLongNamespaceCommentSplit) {
Style));
}
+TEST_F(FormatTest, LikelyUnlikely) {
+ FormatStyle Style = getLLVMStyle();
+
+ verifyFormat("if (argc > 5) [[unlikely]] {\n"
+ " return 29;\n"
+ "}",
+ Style);
+
+ verifyFormat("if (argc > 5) [[likely]] {\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 if (argc > 10) [[likely]] {\n"
+ " return 99;\n"
+ "} else {\n"
+ " return 42;\n"
+ "}\n",
+ Style);
+}
+
} // namespace
} // namespace format
} // namespace clang
More information about the cfe-commits
mailing list