[clang] 5a4ddbd - [clang-format] [PR45639] clang-format splits up the brackets of C++17 attribute [[ ]] when used with the first parameter
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 7 14:02:28 PDT 2020
Author: mydeveloperday
Date: 2020-05-07T22:00:04+01:00
New Revision: 5a4ddbd69db2b0e09398214510501d0e59a0c30b
URL: https://github.com/llvm/llvm-project/commit/5a4ddbd69db2b0e09398214510501d0e59a0c30b
DIFF: https://github.com/llvm/llvm-project/commit/5a4ddbd69db2b0e09398214510501d0e59a0c30b.diff
LOG: [clang-format] [PR45639] clang-format splits up the brackets of C++17 attribute [[ ]] when used with the first parameter
Summary:
https://bugs.llvm.org/show_bug.cgi?id=45639
clang-format incorrectly splits the `[[` in a long argument list
```
void SomeLongClassName::ALongMethodNameInThatClass([[maybe_unused]] const shared_ptr<ALongTypeName>& argumentNameForThat
LongType) {
}
```
becomes
```
void SomeLongClassName::ALongMethodNameInThatClass([
[maybe_unused]] const shared_ptr<ALongTypeName> &argumentNameForThatLongType) {
}
```
leaving one `[` on the previous line
For a function with just 1 very long argument, clang-format chooses to split between the `[[`,
This revision prevents the slip between the two `[` and the second `[`
Reviewed By: krasimir
Subscribers: cfe-commits
Tags: #clang, #clang-format
Differential Revision: https://reviews.llvm.org/D79401
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 408f68e35418..216ae984c67a 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -3888,7 +3888,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
if (Right.is(tok::kw___attribute) ||
(Right.is(tok::l_square) && Right.is(TT_AttributeSquare)))
- return true;
+ return !Left.is(TT_AttributeSquare);
if (Left.is(tok::identifier) && Right.is(tok::string_literal))
return true;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 86eeb2705595..9a654d66250c 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7672,6 +7672,19 @@ TEST_F(FormatTest, UnderstandsSquareAttributes) {
MultiLineFunctions);
}
+TEST_F(FormatTest, AttributePenaltyBreaking) {
+ FormatStyle Style = getLLVMStyle();
+ verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n"
+ " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
+ Style);
+ verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n"
+ " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
+ Style);
+ verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const "
+ "shared_ptr<ALongTypeName> &C d) {\n}",
+ Style);
+}
+
TEST_F(FormatTest, UnderstandsEllipsis) {
verifyFormat("int printf(const char *fmt, ...);");
verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
More information about the cfe-commits
mailing list