]> granicus.if.org Git - clang/commitdiff
clang-format: Fix incorrect cast detection.
authorDaniel Jasper <djasper@google.com>
Mon, 23 Nov 2015 15:55:50 +0000 (15:55 +0000)
committerDaniel Jasper <djasper@google.com>
Mon, 23 Nov 2015 15:55:50 +0000 (15:55 +0000)
Before:
  bool b = f(g<int>)&&c;

After:
  bool b = f(g<int>) && c;

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253872 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/TokenAnnotator.cpp
unittests/Format/FormatTest.cpp

index 5aa4dadb551c8d26b0a8a65e077c800a397e68bd..5a603b30ce168d275f9e8e791cbdb28a4a2ceae6 100644 (file)
@@ -1060,13 +1060,19 @@ private:
     FormatToken *LeftOfParens = nullptr;
     if (Tok.MatchingParen)
       LeftOfParens = Tok.MatchingParen->getPreviousNonComment();
-    if (LeftOfParens && LeftOfParens->is(tok::r_paren) &&
-        LeftOfParens->MatchingParen)
-      LeftOfParens = LeftOfParens->MatchingParen->Previous;
-    if (LeftOfParens && LeftOfParens->is(tok::r_square) &&
-        LeftOfParens->MatchingParen &&
-        LeftOfParens->MatchingParen->is(TT_LambdaLSquare))
-      return false;
+
+    if (LeftOfParens) {
+      if (LeftOfParens->Tok.getIdentifierInfo() &&
+          !LeftOfParens->isOneOf(Keywords.kw_in, tok::kw_return, tok::kw_case,
+                                 tok::kw_delete))
+        return false;
+      if (LeftOfParens->isOneOf(tok::kw_sizeof, tok::kw_alignof, tok::at,
+                                tok::r_square, TT_OverloadedOperator,
+                                TT_TemplateCloser))
+        return false;
+      if (LeftOfParens->is(tok::r_paren) && LeftOfParens->MatchingParen)
+        LeftOfParens = LeftOfParens->MatchingParen->Previous;
+    }
     if (Tok.Next) {
       if (Tok.Next->is(tok::question))
         return false;
@@ -1085,22 +1091,14 @@ private:
     bool ParensCouldEndDecl =
         Tok.Next &&
         Tok.Next->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
-    bool IsSizeOfOrAlignOf =
-        LeftOfParens && LeftOfParens->isOneOf(tok::kw_sizeof, tok::kw_alignof);
-    if (ParensAreType && !ParensCouldEndDecl && !IsSizeOfOrAlignOf &&
+    if (ParensAreType && !ParensCouldEndDecl &&
         (Contexts.size() > 1 && Contexts[Contexts.size() - 2].IsExpression))
       IsCast = true;
     else if (Tok.Next && Tok.Next->isNot(tok::string_literal) &&
              (Tok.Next->Tok.isLiteral() ||
               Tok.Next->isOneOf(tok::kw_sizeof, tok::kw_alignof)))
       IsCast = true;
-    // If there is an identifier after the (), it is likely a cast, unless
-    // there is also an identifier before the ().
-    else if (LeftOfParens && Tok.Next &&
-             (LeftOfParens->Tok.getIdentifierInfo() == nullptr ||
-              LeftOfParens->isOneOf(tok::kw_return, tok::kw_case)) &&
-             !LeftOfParens->isOneOf(TT_OverloadedOperator, tok::at,
-                                    TT_TemplateCloser)) {
+    else if (LeftOfParens && Tok.Next) {
       if (Tok.Next->isOneOf(tok::identifier, tok::numeric_constant)) {
         IsCast = true;
       } else {
index 66b3add302659dae7ffbd3009837e0a7d1034e42..02f329acfe559997125b7334bee3e33567e3232e 100644 (file)
@@ -5792,6 +5792,7 @@ TEST_F(FormatTest, FormatsCasts) {
   verifyFormat("virtual void foo(int *a, char *) const;");
   verifyFormat("int a = sizeof(int *) + b;");
   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
+  verifyFormat("bool b = f(g<int>) && c;");
 
   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");