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...); }"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits