krasimir created this revision. Herald added subscribers: cfe-commits, klimek.
This fixes a regression introduced by `r331857` where we stop the search for the End token as soon as we hit a non-scope-closer, which prematurely stops before semicolons for example, which should otherwise be considered as part of the unbreakable tail. Repository: rC Clang https://reviews.llvm.org/D46824 Files: lib/Format/ContinuationIndenter.cpp unittests/Format/FormatTestObjC.cpp Index: unittests/Format/FormatTestObjC.cpp =================================================================== --- unittests/Format/FormatTestObjC.cpp +++ unittests/Format/FormatTestObjC.cpp @@ -1142,6 +1142,18 @@ " @\"aaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" "];\n"); } + +TEST_F(FormatTestObjC, BreaksCallStatementWhereSemiJustOverTheLimit) { + Style.ColumnLimit = 60; + // If the statement starting with 'a = ...' is put on a single line, the ';' + // is at line 61. + verifyFormat("int f(int a) {\n" + " a = [self aaaaaaaaaa:bbbbbbbbb\n" + " ccccccccc:dddddddd\n" + " ee:fddd];\n" + "}"); +} + } // end namespace } // end namespace format } // end namespace clang Index: lib/Format/ContinuationIndenter.cpp =================================================================== --- lib/Format/ContinuationIndenter.cpp +++ lib/Format/ContinuationIndenter.cpp @@ -90,8 +90,10 @@ return MatchingStackIndex >= 0 ? &Stack[MatchingStackIndex] : nullptr; }; for (; End->Next; End = End->Next) { - if (End->Next->CanBreakBefore || !End->Next->closesScope()) + if (End->Next->CanBreakBefore) break; + if (!End->Next->closesScope()) + continue; if (End->Next->MatchingParen->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare, tok::less)) {
Index: unittests/Format/FormatTestObjC.cpp =================================================================== --- unittests/Format/FormatTestObjC.cpp +++ unittests/Format/FormatTestObjC.cpp @@ -1142,6 +1142,18 @@ " @\"aaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" "];\n"); } + +TEST_F(FormatTestObjC, BreaksCallStatementWhereSemiJustOverTheLimit) { + Style.ColumnLimit = 60; + // If the statement starting with 'a = ...' is put on a single line, the ';' + // is at line 61. + verifyFormat("int f(int a) {\n" + " a = [self aaaaaaaaaa:bbbbbbbbb\n" + " ccccccccc:dddddddd\n" + " ee:fddd];\n" + "}"); +} + } // end namespace } // end namespace format } // end namespace clang Index: lib/Format/ContinuationIndenter.cpp =================================================================== --- lib/Format/ContinuationIndenter.cpp +++ lib/Format/ContinuationIndenter.cpp @@ -90,8 +90,10 @@ return MatchingStackIndex >= 0 ? &Stack[MatchingStackIndex] : nullptr; }; for (; End->Next; End = End->Next) { - if (End->Next->CanBreakBefore || !End->Next->closesScope()) + if (End->Next->CanBreakBefore) break; + if (!End->Next->closesScope()) + continue; if (End->Next->MatchingParen->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare, tok::less)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits