HazardyKnusperkeks created this revision. HazardyKnusperkeks added reviewers: owenpan, curdeius, MyDeveloperDay. HazardyKnusperkeks added a project: clang-format. HazardyKnusperkeks requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
The check for TT_templateCloser was done first and prevented any line breaks. Rearrange the statements a bit. Fixes https://github.com/llvm/llvm-project/issues/54057 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D120621 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -6440,6 +6440,46 @@ Style); } +TEST_F(FormatTest, BreakBinaryOperatorsInPresenceOfTemplates) { + auto Style = getLLVMStyleWithColumns(45); + EXPECT_EQ(Style.BreakBeforeBinaryOperators, FormatStyle::BOS_None); + verifyFormat( + "bool b =\n" + " is_default_constructible_v<hash<T>> and\n" + " is_copy_constructible_v<hash<T>> and\n" + " is_move_constructible_v<hash<T>> and\n" + " is_copy_assignable_v<hash<T>> and\n" + " is_move_assignable_v<hash<T>> and\n" + " is_destructible_v<hash<T>> and\n" + " is_swappable_v<hash<T>> and\n" + " is_callable_v<hash<T>(T)>;", + Style); + + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; + verifyFormat( + "bool b = is_default_constructible_v<hash<T>>\n" + " and is_copy_constructible_v<hash<T>>\n" + " and is_move_constructible_v<hash<T>>\n" + " and is_copy_assignable_v<hash<T>>\n" + " and is_move_assignable_v<hash<T>>\n" + " and is_destructible_v<hash<T>>\n" + " and is_swappable_v<hash<T>>\n" + " and is_callable_v<hash<T>(T)>;", + Style); + + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; + verifyFormat( + "bool b = is_default_constructible_v<hash<T>>\n" + " and is_copy_constructible_v<hash<T>>\n" + " and is_move_constructible_v<hash<T>>\n" + " and is_copy_assignable_v<hash<T>>\n" + " and is_move_assignable_v<hash<T>>\n" + " and is_destructible_v<hash<T>>\n" + " and is_swappable_v<hash<T>>\n" + " and is_callable_v<hash<T>(T)>;", + Style); +} + TEST_F(FormatTest, ConstructorInitializers) { verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", @@ -24060,6 +24100,40 @@ " return number_zero_v<T>;\n" " }\n" "};"); + + auto Style = getLLVMStyle(); + + verifyFormat( + "template <typename T>\n" + " requires is_default_constructible_v<hash<T>> and\n" + " is_copy_constructible_v<hash<T>> and\n" + " is_move_constructible_v<hash<T>> and\n" + " is_copy_assignable_v<hash<T>> and " + "is_move_assignable_v<hash<T>> and\n" + " is_destructible_v<hash<T>> and is_swappable_v<hash<T>> and\n" + " is_callable_v<hash<T>(T)> and\n" + " is_same_v<size_t, decltype(hash<T>(declval<T>()))> and\n" + " is_same_v<size_t, decltype(hash<T>(declval<T &>()))> and\n" + " is_same_v<size_t, decltype(hash<T>(declval<const T &>()))>\n" + "struct S {};", + Style); + + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; + verifyFormat( + "template <typename T>\n" + " requires is_default_constructible_v<hash<T>>\n" + " and is_copy_constructible_v<hash<T>>\n" + " and is_move_constructible_v<hash<T>>\n" + " and is_copy_assignable_v<hash<T>> and " + "is_move_assignable_v<hash<T>>\n" + " and is_destructible_v<hash<T>> and is_swappable_v<hash<T>>\n" + " and is_callable_v<hash<T>(T)>\n" + " and is_same_v<size_t, decltype(hash<T>(declval<T>()))>\n" + " and is_same_v<size_t, decltype(hash<T>(declval<T &>()))>\n" + " and is_same_v<size_t, decltype(hash<T>(declval<const T " + "&>()))>\n" + "struct S {};", + Style); } TEST_F(FormatTest, StatementAttributeLikeMacros) { Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -4410,6 +4410,14 @@ return false; if (Left.is(TT_TemplateCloser) && Right.is(TT_TemplateOpener)) return true; + if ((Left.is(tok::greater) && Right.is(tok::greater)) || + (Left.is(tok::less) && Right.is(tok::less))) + return false; + if (Right.is(TT_BinaryOperator) && + Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None && + (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_All || + Right.getPrecedence() != prec::Assignment)) + return true; if (Left.isOneOf(TT_TemplateCloser, TT_UnaryOperator) || Left.is(tok::kw_operator)) return false; @@ -4483,14 +4491,6 @@ if (Right.is(TT_InheritanceComma) && Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma) return true; - if ((Left.is(tok::greater) && Right.is(tok::greater)) || - (Left.is(tok::less) && Right.is(tok::less))) - return false; - if (Right.is(TT_BinaryOperator) && - Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None && - (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_All || - Right.getPrecedence() != prec::Assignment)) - return true; if (Left.is(TT_ArrayInitializerLSquare)) return true; if (Right.is(tok::kw_typename) && Left.isNot(tok::kw_const))
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits