Correctly format pointers and references in casts.
authorDaniel Jasper <djasper@google.com>
Wed, 2 Jan 2013 15:46:59 +0000 (15:46 +0000)
committerDaniel Jasper <djasper@google.com>
Wed, 2 Jan 2013 15:46:59 +0000 (15:46 +0000)
This fixes llvm.org/PR14747.

Before: Type *A = (Type * ) P;
After:  Type *A = (Type *) P;
llvm-svn: 171390

clang/lib/Format/Format.cpp
clang/unittests/Format/FormatTest.cpp

index c08bcf4..60b2f56 100644 (file)
@@ -822,19 +822,23 @@ private:
   TokenAnnotation::TokenType determineStarAmpUsage(unsigned Index, bool IsRHS) {
     if (Index == Annotations.size())
       return TokenAnnotation::TT_Unknown;
+    const FormatToken &PrevToken = Line.Tokens[Index - 1];
+    const FormatToken &NextToken = Line.Tokens[Index + 1];
 
-    if (Index == 0 || Line.Tokens[Index - 1].Tok.is(tok::l_paren) ||
-        Line.Tokens[Index - 1].Tok.is(tok::comma) ||
-        Line.Tokens[Index - 1].Tok.is(tok::kw_return) ||
-        Line.Tokens[Index - 1].Tok.is(tok::colon) ||
+    if (Index == 0 || PrevToken.Tok.is(tok::l_paren) ||
+        PrevToken.Tok.is(tok::comma) || PrevToken.Tok.is(tok::kw_return) ||
+        PrevToken.Tok.is(tok::colon) ||
         Annotations[Index - 1].Type == TokenAnnotation::TT_BinaryOperator)
       return TokenAnnotation::TT_UnaryOperator;
 
-    if (Line.Tokens[Index - 1].Tok.isLiteral() ||
-        Line.Tokens[Index + 1].Tok.isLiteral() ||
-        Line.Tokens[Index + 1].Tok.is(tok::kw_sizeof))
+    if (PrevToken.Tok.isLiteral() || NextToken.Tok.isLiteral() ||
+        NextToken.Tok.is(tok::kw_sizeof))
       return TokenAnnotation::TT_BinaryOperator;
 
+    if (NextToken.Tok.is(tok::comma) || NextToken.Tok.is(tok::r_paren) ||
+        NextToken.Tok.is(tok::greater))
+      return TokenAnnotation::TT_PointerOrReference;
+
     // It is very unlikely that we are going to find a pointer or reference type
     // definition on the RHS of an assignment.
     if (IsRHS)
index 22da93e..b52a9fd 100644 (file)
@@ -699,6 +699,9 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
   verifyFormat("A<int **> a;");
   verifyFormat("A<int *, int *> a;");
   verifyFormat("A<int **, int **> a;");
+  verifyFormat("Type *A = static_cast<Type *>(P);");
+  verifyFormat("Type *A = (Type *) P;");
+  verifyFormat("Type *A = (vector<Type *, int *>) P;");
 
   verifyGoogleFormat("int main(int argc, char** argv) {\n}");
   verifyGoogleFormat("A<int*> a;");