diff options
author | Alexander Kornienko <alexfh@google.com> | 2014-07-16 13:38:48 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2014-07-16 13:38:48 +0000 |
commit | 1f317d6c052daaa8c3dfcf64d114a95e003b2592 (patch) | |
tree | a706ef3f88f5dd00b0d19202ae8a72d1a4e78f54 /clang-tools-extra | |
parent | 692d6bb544338c65550a46d76b81db668d4901f5 (diff) | |
download | bcm5719-llvm-1f317d6c052daaa8c3dfcf64d114a95e003b2592.tar.gz bcm5719-llvm-1f317d6c052daaa8c3dfcf64d114a95e003b2592.zip |
Avoid adding redundant parens.
Reviewers: bkramer
Reviewed By: bkramer
Subscribers: cfe-commits, sbenza
Differential Revision: http://reviews.llvm.org/D4534
llvm-svn: 213149
Diffstat (limited to 'clang-tools-extra')
-rw-r--r-- | clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp | 22 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/avoid-c-style-casts.cpp | 16 |
2 files changed, 28 insertions, 10 deletions
diff --git a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp index 7f8a965a11f..4b8bf140081 100644 --- a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp @@ -56,6 +56,7 @@ bool pointedTypesAreEqual(QualType SourceType, QualType DestType) { } return SourceType.getUnqualifiedType() == DestType.getUnqualifiedType(); } + void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { const auto *CastExpr = Result.Nodes.getNodeAs<CStyleCastExpr>("cast"); @@ -85,15 +86,18 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { diag_builder << ("Use " + CastType + ".").str(); if (ParenRange.getBegin().isMacroID() || ParenRange.getEnd().isMacroID()) return; - diag_builder << FixItHint::CreateReplacement( - ParenRange, - (CastType + "<" + DestTypeString + ">(").str()) - << FixItHint::CreateInsertion( - Lexer::getLocForEndOfToken( - CastExpr->getSubExprAsWritten()->getLocEnd(), 0, - *Result.SourceManager, - Result.Context->getLangOpts()), - ")"); + + const Expr *SubExpr = CastExpr->getSubExprAsWritten()->IgnoreImpCasts(); + std::string CastText = (CastType + "<" + DestTypeString + ">").str(); + if (!isa<ParenExpr>(SubExpr)) { + CastText.push_back('('); + diag_builder << FixItHint::CreateInsertion( + Lexer::getLocForEndOfToken(SubExpr->getLocEnd(), 0, + *Result.SourceManager, + Result.Context->getLangOpts()), + ")"); + } + diag_builder << FixItHint::CreateReplacement(ParenRange, CastText); }; // Suggest appropriate C++ cast. See [expr.cast] for cast notation semantics. switch (CastExpr->getCastKind()) { diff --git a/clang-tools-extra/test/clang-tidy/avoid-c-style-casts.cpp b/clang-tools-extra/test/clang-tidy/avoid-c-style-casts.cpp index a81c26246b0..9ae63207fd3 100644 --- a/clang-tools-extra/test/clang-tidy/avoid-c-style-casts.cpp +++ b/clang-tools-extra/test/clang-tidy/avoid-c-style-casts.cpp @@ -17,7 +17,7 @@ void f(int a, double b, const char *cpc, const void *cpv, X *pX) { char *pc2 = (char*)(cpc + 33); // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: C-style casts are discouraged. Use const_cast. {{.*}} - // CHECK-FIXES: char *pc2 = const_cast<char *>((cpc + 33)); + // CHECK-FIXES: char *pc2 = const_cast<char *>(cpc + 33); const char &crc = *cpc; char &rc = (char&)crc; @@ -33,6 +33,20 @@ void f(int a, double b, const char *cpc, const void *cpv, X *pX) { // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: C-style casts are discouraged. Use const_cast. {{.*}} // CHECK-FIXES: char ****ppppc = const_cast<char ****>(ppcpcpc); + char ***pppc = (char***)*(ppcpcpc); + // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: C-style casts are discouraged. Use const_cast. {{.*}} + // CHECK-FIXES: char ***pppc = const_cast<char ***>(*(ppcpcpc)); + + char ***pppc2 = (char***)(*ppcpcpc); + // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: C-style casts are discouraged. Use const_cast. {{.*}} + // CHECK-FIXES: char ***pppc2 = const_cast<char ***>(*ppcpcpc); + + char *pc5 = (char*)(const char*)(cpv); + // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: C-style casts are discouraged. Use const_cast. {{.*}} + // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: C-style casts are discouraged. Use reinterpret_cast. {{.*}} + // CHECK-FIXES: char *pc5 = const_cast<char *>(reinterpret_cast<const char *>(cpv)); + + int b1 = (int)b; // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: C-style casts are discouraged. Use static_cast. [google-readability-casting] // CHECK-FIXES: int b1 = static_cast<int>(b); |