diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1359,6 +1359,14 @@ !Newline) NewParenState.UnindentOperator = true; + if (Style.AlignOperands != FormatStyle::OAS_DontAlign && Previous && + (Previous->getPrecedence() == prec::Assignment || + Previous->is(tok::kw_return) || + (*I == prec::Conditional && Previous->is(tok::question) && + Previous->is(TT_ConditionalExpr))) && + !Newline) + NewParenState.IsAligned = 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 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -11259,6 +11259,23 @@ "\t}\n" "};", Tab); + Tab.AlignOperands = FormatStyle::OAS_Align; + verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb +\n" + " cccccccccccccccccccc;", + Tab); + // no alignment + verifyFormat("int aaaaaaaaaa =\n" + "\tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", + Tab); + verifyFormat("return aaaaaaaaaaaaaaaa ? 111111111111111\n" + " : bbbbbbbbbbbbbb ? 222222222222222\n" + " : 333333333333333;", + Tab); + Tab.BreakBeforeBinaryOperators = FormatStyle::BOS_All; + Tab.AlignOperands = FormatStyle::OAS_AlignAfterOperator; + verifyFormat("int aaaaaaaaaa = bbbbbbbbbbbbbbbbbbbb\n" + " + cccccccccccccccccccc;", + Tab); } TEST_F(FormatTest, ZeroTabWidth) {