diff options
| -rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 5 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 3 |
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 62177b3efd7..fc53681394e 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -626,12 +626,15 @@ private: Contexts.back().IsExpression) IsCast = true; if (Current.Next && + Current.Next->isNot(tok::string_literal) && (Current.Next->Tok.isLiteral() || Current.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 (). - if (LeftOfParens && LeftOfParens->Tok.getIdentifierInfo() == NULL && + if (LeftOfParens && (LeftOfParens->Tok.getIdentifierInfo() == NULL || + LeftOfParens->is(tok::kw_return)) && + LeftOfParens->Type != TT_TemplateCloser && LeftOfParens->Type != TT_ObjCMethodExpr && Current.Next && (Current.Next->is(tok::identifier))) IsCast = true; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 84e22cbbefc..1c2a5404091 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -3246,6 +3246,7 @@ TEST_F(FormatTest, FormatsCasts) { verifyFormat("int a = (int)+2;"); verifyFormat("my_int a = (my_int)2.0f;"); verifyFormat("my_int a = (my_int)sizeof(int);"); + verifyFormat("return (my_int)aaa;"); // FIXME: Without type knowledge, this can still fall apart miserably. verifyFormat("void f() { my_int a = (my_int) * b; }"); @@ -3271,6 +3272,8 @@ TEST_F(FormatTest, FormatsCasts) { verifyFormat("void f(int i = (kA * kB) & kMask) {}"); verifyFormat("int a = sizeof(int) * b;"); verifyFormat("int a = alignof(int) * b;"); + verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); + verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); // These are not casts, but at some point were confused with casts. verifyFormat("virtual void foo(int *) override;"); |

