This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd6daca21738a: [clang-format] Fix BreakBeforeBinaryOperators
with TemplateCloser on the lhs (authored by HazardyKnusperkeks).
Herald added a project: All.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120621/new/
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,43 @@
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) {}",
@@ -24054,6 +24091,40 @@
" }\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);
+
// Not a clause, but we once hit an assert.
verifyFormat("#if 0\n"
"#else\n"
Index: clang/lib/Format/TokenAnnotator.cpp
===================================================================
--- clang/lib/Format/TokenAnnotator.cpp
+++ clang/lib/Format/TokenAnnotator.cpp
@@ -4414,6 +4414,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;
@@ -4487,14 +4495,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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits