diff options
-rw-r--r-- | clang/lib/Format/Format.cpp | 33 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 1 |
2 files changed, 14 insertions, 20 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 3a0b7c09381..f3f362bb4b6 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -662,33 +662,26 @@ private: bool tryMergeLessLess() { // Merge X,less,less,Y into X,lessless,Y unless X or Y is less. - if (Tokens.size() < 4) { - // Merge <,<,eof to <<,eof - if (Tokens.back()->Tok.isNot(tok::eof)) - return false; + if (Tokens.size() < 3) + return false; - auto &eof = Tokens.back(); - Tokens.pop_back(); - bool LessLessMerged; - if ((LessLessMerged = tryMergeTokens({tok::less, tok::less}))) - Tokens.back()->Tok.setKind(tok::lessless); - Tokens.push_back(eof); - return LessLessMerged; - } + bool FourthTokenIsLess = false; + if (Tokens.size() > 3) + FourthTokenIsLess = (Tokens.end() - 4)[0]->is(tok::less); - auto First = Tokens.end() - 4; - if (First[3]->is(tok::less) || First[2]->isNot(tok::less) || - First[1]->isNot(tok::less) || First[0]->is(tok::less)) + auto First = Tokens.end() - 3; + if (First[2]->is(tok::less) || First[1]->isNot(tok::less) || + First[0]->isNot(tok::less) || FourthTokenIsLess) return false; // Only merge if there currently is no whitespace between the two "<". - if (First[2]->WhitespaceRange.getBegin() != - First[2]->WhitespaceRange.getEnd()) + if (First[1]->WhitespaceRange.getBegin() != + First[1]->WhitespaceRange.getEnd()) return false; - First[1]->Tok.setKind(tok::lessless); - First[1]->TokenText = "<<"; - First[1]->ColumnWidth += 1; + First[0]->Tok.setKind(tok::lessless); + First[0]->TokenText = "<<"; + First[0]->ColumnWidth += 1; Tokens.erase(Tokens.end() - 2); return true; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 8dc7bb5d1d7..072c8afe63b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -9752,6 +9752,7 @@ TEST_F(FormatTest, TripleAngleBrackets) { } TEST_F(FormatTest, MergeLessLessAtEnd) { + verifyFormat("<<"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaallvm::outs() <<"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |