r183077 - Improve recognition of template parameters.
Daniel Jasper
djasper at google.com
Sat Jun 1 11:56:00 PDT 2013
Author: djasper
Date: Sat Jun 1 13:56:00 2013
New Revision: 183077
URL: http://llvm.org/viewvc/llvm-project?rev=183077&view=rev
Log:
Improve recognition of template parameters.
Before: return a<b &&c> d;
After: return a < b && c > d;
Modified:
cfe/trunk/lib/Format/TokenAnnotator.cpp
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=183077&r1=183076&r2=183077&view=diff
==============================================================================
--- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
+++ cfe/trunk/lib/Format/TokenAnnotator.cpp Sat Jun 1 13:56:00 2013
@@ -53,8 +53,15 @@ private:
if (CurrentToken->isOneOf(tok::r_paren, tok::r_square, tok::r_brace,
tok::question, tok::colon))
return false;
+ // If a && or || is found and interpreted as a binary operator, this set
+ // of angles is like part of something like "a < b && c > d". If the
+ // angles are inside an expression, the ||/&& might also be a binary
+ // operator that was misinterpreted because we are parsing template
+ // parameters.
+ // FIXME: This is getting out of hand, write a decent parser.
if (CurrentToken->Previous->isOneOf(tok::pipepipe, tok::ampamp) &&
- CurrentToken->Previous->Type != TT_PointerOrReference &&
+ (CurrentToken->Previous->Type == TT_BinaryOperator ||
+ Contexts[Contexts.size() - 2].IsExpression) &&
Line.First->isNot(tok::kw_template))
return false;
updateParameterCount(Left, CurrentToken);
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=183077&r1=183076&r2=183077&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Sat Jun 1 13:56:00 2013
@@ -2893,6 +2893,13 @@ TEST_F(FormatTest, UnderstandsTemplatePa
verifyFormat("f<int>();");
verifyFormat("template <typename T> void f() {}");
+
+ // Not template parameters.
+ verifyFormat("return a < b && c > d;");
+ verifyFormat("void f() {\n"
+ " while (a < b && c > d) {\n"
+ " }\n"
+ "}");
}
TEST_F(FormatTest, UnderstandsBinaryOperators) {
More information about the cfe-commits
mailing list