diff options
-rw-r--r-- | clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp | 12 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/google-readability-casting.cpp | 24 |
2 files changed, 31 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp index b3caf917520..80cc475b07a 100644 --- a/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp @@ -58,10 +58,9 @@ static bool pointedUnqualifiedTypesAreEqual(QualType T1, QualType T2) { void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { const auto *CastExpr = Result.Nodes.getNodeAs<CStyleCastExpr>("cast"); - auto ParenRange = CharSourceRange::getTokenRange(CastExpr->getLParenLoc(), - CastExpr->getRParenLoc()); + // Ignore casts in macros. - if (ParenRange.getBegin().isMacroID() || ParenRange.getEnd().isMacroID()) + if (CastExpr->getExprLoc().isMacroID()) return; // Casting to void is an idiomatic way to mute "unused variable" and similar @@ -82,6 +81,9 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { const QualType SourceType = SourceTypeAsWritten.getCanonicalType(); const QualType DestType = DestTypeAsWritten.getCanonicalType(); + auto ReplaceRange = CharSourceRange::getCharRange( + CastExpr->getLParenLoc(), CastExpr->getSubExprAsWritten()->getLocStart()); + bool FnToFnCast = isFunction(SourceTypeAsWritten) && isFunction(DestTypeAsWritten); @@ -92,7 +94,7 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { // pointer/reference types. if (SourceTypeAsWritten == DestTypeAsWritten) { diag(CastExpr->getLocStart(), "redundant cast to the same type") - << FixItHint::CreateRemoval(ParenRange); + << FixItHint::CreateRemoval(ReplaceRange); return; } } @@ -136,7 +138,7 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) { getLangOpts()), ")"); } - Diag << FixItHint::CreateReplacement(ParenRange, CastText); + Diag << FixItHint::CreateReplacement(ReplaceRange, CastText); }; auto ReplaceWithNamedCast = [&](StringRef CastType) { Diag << CastType; diff --git a/clang-tools-extra/test/clang-tidy/google-readability-casting.cpp b/clang-tools-extra/test/clang-tidy/google-readability-casting.cpp index a4d29d6b28f..d36fef6fc94 100644 --- a/clang-tools-extra/test/clang-tidy/google-readability-casting.cpp +++ b/clang-tools-extra/test/clang-tidy/google-readability-casting.cpp @@ -85,6 +85,22 @@ void f(int a, double b, const char *cpc, const void *cpv, X *pX) { // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: {{.*}}; use static_cast/const_cast/reinterpret_cast [ // CHECK-FIXES: b1 = (const int&)b; + b1 = (int) b; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: {{.*}}; use static_cast {{.*}} + // CHECK-FIXES: b1 = static_cast<int>(b); + + b1 = (int) b; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: {{.*}}; use static_cast {{.*}} + // CHECK-FIXES: b1 = static_cast<int>(b); + + b1 = (int) (b); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: {{.*}}; use static_cast {{.*}} + // CHECK-FIXES: b1 = static_cast<int>(b); + + b1 = (int) (b); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: {{.*}}; use static_cast {{.*}} + // CHECK-FIXES: b1 = static_cast<int>(b); + Y *pB = (Y*)pX; // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}}; use static_cast/const_cast/reinterpret_cast [ Y &rB = (Y&)*pX; @@ -114,6 +130,14 @@ void f(int a, double b, const char *cpc, const void *cpv, X *pX) { // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant cast to the same type // CHECK-FIXES: {{^}} e = e; + e = (Enum) e; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant cast to the same type + // CHECK-FIXES: {{^}} e = e; + + e = (Enum) (e); + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: redundant cast to the same type + // CHECK-FIXES: {{^}} e = (e); + static const int kZero = 0; (int)kZero; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: redundant cast to the same type |