diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 38086379fe74..5a3dee638707 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -609,6 +609,18 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State, std::max(std::max(State.Column, NewParenState.Indent), State.Stack.back().LastSpace); + // Don't allow the RHS of an operator to be split over multiple lines unless + // there is a line-break right after the operator. + // Exclude relational operators, as there, it is always more desirable to + // have the LHS 'left' of the RHS. + // FIXME: Implement this for '<<' and BreakBeforeBinaryOperators. + if (!Newline && Previous && Previous->Type == TT_BinaryOperator && + !Previous->isOneOf(tok::lessless, tok::question, tok::colon) && + Previous->getPrecedence() > prec::Assignment && + Previous->getPrecedence() != prec::Relational && + !Style.BreakBeforeBinaryOperators) + NewParenState.NoLineBreak = true; + // Do not indent relative to the fake parentheses inserted for "." or "->". // This is a special case to make the following to statements consistent: // OuterFunction(InnerFunctionCall( // break diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 5395fd98923f..76062605f706 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2889,8 +2889,9 @@ TEST_F(FormatTest, ExpressionIndentation) { " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); verifyFormat("if () {\n" - "} else if (aaaaa && bbbbb > // break\n" - " ccccc) {\n" + "} else if (aaaaa &&\n" + " bbbbb > // break\n" + " ccccc) {\n" "}"); // Presence of a trailing comment used to change indentation of b.