From 5d82cb3c3a6af8d12b87bcbdc6abd3b7f4b01652 Mon Sep 17 00:00:00 2001 From: mydeveloperday Date: Tue, 19 May 2020 16:50:24 +0100 Subject: [PATCH] [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 --- clang/lib/Format/UnwrappedLineParser.cpp | 6 ++++++ clang/unittests/Format/FormatTest.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index de820ba..7aaf634 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 35da582d..a0b1dc7 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 -- 2.7.4