[PATCH] clang-format: Fix merging of << at end of input.
Jacques Pienaar
jpienaar at google.com
Thu Feb 19 10:55:27 PST 2015
Hi djasper,
Fix the way merging of LessLess is performed at the end of input. r229783 merged <,< in an incorrect manner at the end of input. This resulted in assert failures (found by fuzzer bot).
http://reviews.llvm.org/D7766
Files:
lib/Format/Format.cpp
unittests/Format/FormatTest.cpp
Index: lib/Format/Format.cpp
===================================================================
--- lib/Format/Format.cpp
+++ lib/Format/Format.cpp
@@ -660,33 +660,26 @@
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;
-
- 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;
- }
+ if (Tokens.size() < 3)
+ return false;
- 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))
+ bool FourBackLess = false;
+ if (Tokens.size() > 3)
+ FourBackLess = (Tokens.end() - 4)[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) || FourBackLess)
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;
}
Index: unittests/Format/FormatTest.cpp
===================================================================
--- unittests/Format/FormatTest.cpp
+++ unittests/Format/FormatTest.cpp
@@ -9752,6 +9752,7 @@
}
TEST_F(FormatTest, MergeLessLessAtEnd) {
+ verifyFormat("<<");
verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaallvm::outs() <<");
verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7766.20319.patch
Type: text/x-patch
Size: 2238 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150219/5e443560/attachment.bin>
More information about the cfe-commits
mailing list