diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp --- a/clang/lib/Format/WhitespaceManager.cpp +++ b/clang/lib/Format/WhitespaceManager.cpp @@ -731,6 +731,11 @@ if (&C != &Changes.back() && (&C + 1)->NewlinesBefore > 0) return false; + // Do not align operator= overloads. + FormatToken *Previous = C.Tok->getPreviousNonComment(); + if (Previous && Previous->is(tok::kw_operator)) + return false; + return C.Tok->is(tok::equal); }, Changes, /*StartAt=*/0, Style.AlignConsecutiveAssignments); 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 @@ -16266,6 +16266,34 @@ verifyFormat("int oneTwoThree = 123; // comment\n" "int oneTwo = 12; // comment", Alignment); + verifyFormat("int f() = default;\n" + "int &operator() = default;\n" + "int &operator=() {", + Alignment); + verifyFormat("int f() = default; // comment\n" + "int &operator() = default; // comment\n" + "int &operator=() {", + Alignment); + verifyFormat("int f() = default;\n" + "int &operator() = default;\n" + "int &operator==() {", + Alignment); + verifyFormat("int f() = default;\n" + "int &operator() = default;\n" + "int &operator<=() {", + Alignment); + verifyFormat("int f() = default;\n" + "int &operator() = default;\n" + "int &operator!=() {", + Alignment); + verifyFormat("int f() = default;\n" + "int &operator() = default;\n" + "int &operator=();", + Alignment); + verifyFormat("/* long long padding */ int f() = default;\n" + "int &operator() = default;\n" + "int &operator/**/ =();", + Alignment); // Bug 25167 /* Uncomment when fixed