Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -1882,9 +1882,9 @@ FormatToken *LeftOfParens = Tok.MatchingParen->getPreviousNonComment(); if (LeftOfParens) { - // If there is a closing parenthesis left of the current parentheses, - // look past it as these might be chained casts. - if (LeftOfParens->is(tok::r_paren)) { + // If there is a closing parenthesis left of the current + // parentheses, look past it as these might be chained casts. + if (LeftOfParens->is(tok::r_paren) && !LeftOfParens->is(TT_CastRParen)) { if (!LeftOfParens->MatchingParen || !LeftOfParens->MatchingParen->Previous) return false; Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -10150,6 +10150,8 @@ " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" " bbbbbbbbbbbbbbbbbbbbbb);"); + verifyFormat("#define CONF_BOOL(x) (bool *)(void *)(x)"); + // These are not casts. verifyFormat("void f(int *) {}"); verifyFormat("f(foo)->b;"); @@ -14643,6 +14645,7 @@ " break;\n" "}", Spaces); + verifyFormat("#define CONF_BOOL(x) ( bool * ) ( void * ) (x)", Spaces); // Run subset of tests again with: Spaces.SpacesInCStyleCastParentheses = false; @@ -14662,6 +14665,7 @@ verifyFormat("size_t idx = (a->foo)(a - 1);", Spaces); verifyFormat("size_t idx = (*foo)(a - 1);", Spaces); verifyFormat("size_t idx = (*(foo))(a - 1);", Spaces); + verifyFormat("#define CONF_BOOL(x) (bool *) (void *) (x)", Spaces); Spaces.ColumnLimit = 80; Spaces.IndentWidth = 4; Spaces.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;