diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/misc')
14 files changed, 78 insertions, 60 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp index cd86fea3dff..f293be45f4f 100644 --- a/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp @@ -47,15 +47,18 @@ void BoolPointerImplicitConversionCheck::check( auto DeclRef = ignoringParenImpCasts(declRefExpr(to(equalsNode(D)))); if (!match(findAll( unaryOperator(hasOperatorName("*"), hasUnaryOperand(DeclRef))), - *If, *Result.Context).empty() || + *If, *Result.Context) + .empty() || !match(findAll(arraySubscriptExpr(hasBase(DeclRef))), *If, - *Result.Context).empty() || + *Result.Context) + .empty() || // FIXME: We should still warn if the paremater is implicitly converted to // bool. !match(findAll(callExpr(hasAnyArgument(ignoringParenImpCasts(DeclRef)))), *If, *Result.Context) .empty() || - !match(findAll(cxxDeleteExpr(has(expr(DeclRef)))), *If, *Result.Context) + !match(findAll(cxxDeleteExpr(has(ignoringParenImpCasts(expr(DeclRef))))), + *If, *Result.Context) .empty()) return; diff --git a/clang-tools-extra/clang-tidy/misc/DanglingHandleCheck.cpp b/clang-tools-extra/clang-tidy/misc/DanglingHandleCheck.cpp index d9040ad0ed7..ed2527e42cf 100644 --- a/clang-tools-extra/clang-tidy/misc/DanglingHandleCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DanglingHandleCheck.cpp @@ -103,15 +103,17 @@ void DanglingHandleCheck::registerMatchersForVariables(MatchFinder *Finder) { Finder->addMatcher( varDecl(hasType(cxxRecordDecl(IsAHandle)), hasInitializer( - exprWithCleanups(has(ConvertedHandle)).bind("bad_stmt"))), + exprWithCleanups(has(ignoringParenImpCasts(ConvertedHandle))) + .bind("bad_stmt"))), this); // Find 'Handle foo = ReturnsAValue();' Finder->addMatcher( - varDecl(hasType(cxxRecordDecl(IsAHandle)), unless(parmVarDecl()), - hasInitializer( - exprWithCleanups(has(handleFrom(IsAHandle, ConvertedHandle))) - .bind("bad_stmt"))), + varDecl( + hasType(cxxRecordDecl(IsAHandle)), unless(parmVarDecl()), + hasInitializer(exprWithCleanups(has(ignoringParenImpCasts(handleFrom( + IsAHandle, ConvertedHandle)))) + .bind("bad_stmt"))), this); // Find 'foo = ReturnsAValue(); // foo is Handle' Finder->addMatcher( @@ -133,7 +135,7 @@ void DanglingHandleCheck::registerMatchersForReturn(MatchFinder *Finder) { // 1. Value to Handle conversion. // 2. Handle copy construction. // We have to match both. - has(handleFrom( + has(ignoringParenImpCasts(handleFrom( IsAHandle, handleFrom(IsAHandle, declRefExpr(to(varDecl( // Is function scope ... @@ -141,7 +143,7 @@ void DanglingHandleCheck::registerMatchersForReturn(MatchFinder *Finder) { // ... and it is a local array or Value. anyOf(hasType(arrayType()), hasType(recordDecl( - unless(IsAHandle)))))))))), + unless(IsAHandle))))))))))), // Temporary fix for false positives inside lambdas. unless(hasAncestor(lambdaExpr()))) .bind("bad_stmt"), @@ -149,8 +151,9 @@ void DanglingHandleCheck::registerMatchersForReturn(MatchFinder *Finder) { // Return a temporary. Finder->addMatcher( - returnStmt(has(exprWithCleanups(has(handleFrom( - IsAHandle, handleFromTemporaryValue(IsAHandle)))))) + returnStmt( + has(ignoringParenImpCasts(exprWithCleanups(has(ignoringParenImpCasts( + handleFrom(IsAHandle, handleFromTemporaryValue(IsAHandle)))))))) .bind("bad_stmt"), this); } diff --git a/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp b/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp index 6e69f2a4e41..7c8a132e5e5 100644 --- a/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/InaccurateEraseCheck.cpp @@ -25,19 +25,20 @@ void InaccurateEraseCheck::registerMatchers(MatchFinder *Finder) { return; const auto CheckForEndCall = hasArgument( - 1, anyOf(cxxConstructExpr( - has(cxxMemberCallExpr(callee(cxxMethodDecl(hasName("end")))) - .bind("InaccEndCall"))), + 1, anyOf(cxxConstructExpr(has(ignoringParenImpCasts( + cxxMemberCallExpr(callee(cxxMethodDecl(hasName("end")))) + .bind("InaccEndCall")))), anything())); Finder->addMatcher( cxxMemberCallExpr( on(hasType(namedDecl(matchesName("^::std::")))), callee(cxxMethodDecl(hasName("erase"))), argumentCountIs(1), - hasArgument(0, has(callExpr(callee(functionDecl(matchesName( + hasArgument(0, has(ignoringParenImpCasts( + callExpr(callee(functionDecl(matchesName( "^::std::(remove(_if)?|unique)$"))), CheckForEndCall) - .bind("InaccAlgCall"))), + .bind("InaccAlgCall")))), unless(isInTemplateInstantiation())) .bind("InaccErase"), this); diff --git a/clang-tools-extra/clang-tidy/misc/IncorrectRoundings.cpp b/clang-tools-extra/clang-tidy/misc/IncorrectRoundings.cpp index 9a487b8112a..ee6f666f0ce 100644 --- a/clang-tools-extra/clang-tidy/misc/IncorrectRoundings.cpp +++ b/clang-tools-extra/clang-tidy/misc/IncorrectRoundings.cpp @@ -42,7 +42,8 @@ void IncorrectRoundings::registerMatchers(MatchFinder *MatchFinder) { // Match a floating literal of 0.5 or a floating literal of 0.5 implicitly. // cast to floating type. auto FloatOrCastHalf = - anyOf(FloatHalf, implicitCastExpr(FloatType, has(FloatHalf))); + anyOf(FloatHalf, + implicitCastExpr(FloatType, has(ignoringParenImpCasts(FloatHalf)))); // Match if either the LHS or RHS is a floating literal of 0.5 or a floating // literal of 0.5 and the other is of type double or vice versa. diff --git a/clang-tools-extra/clang-tidy/misc/InefficientAlgorithmCheck.cpp b/clang-tools-extra/clang-tidy/misc/InefficientAlgorithmCheck.cpp index 0dea909f8ed..810118608da 100644 --- a/clang-tools-extra/clang-tidy/misc/InefficientAlgorithmCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/InefficientAlgorithmCheck.cpp @@ -45,18 +45,19 @@ void InefficientAlgorithmCheck::registerMatchers(MatchFinder *Finder) { callExpr( callee(functionDecl(Algorithms)), hasArgument( - 0, cxxConstructExpr(has(cxxMemberCallExpr( + 0, cxxConstructExpr(has(ignoringParenImpCasts(cxxMemberCallExpr( callee(cxxMethodDecl(hasName("begin"))), on(declRefExpr( hasDeclaration(decl().bind("IneffContObj")), anyOf(hasType(ContainerMatcher.bind("IneffCont")), hasType(pointsTo( ContainerMatcher.bind("IneffContPtr"))))) - .bind("IneffContExpr")))))), - hasArgument(1, cxxConstructExpr(has(cxxMemberCallExpr( - callee(cxxMethodDecl(hasName("end"))), - on(declRefExpr(hasDeclaration( - equalsBoundNode("IneffContObj")))))))), + .bind("IneffContExpr"))))))), + hasArgument( + 1, cxxConstructExpr(has(ignoringParenImpCasts(cxxMemberCallExpr( + callee(cxxMethodDecl(hasName("end"))), + on(declRefExpr( + hasDeclaration(equalsBoundNode("IneffContObj"))))))))), hasArgument(2, expr().bind("AlgParam")), unless(isInTemplateInstantiation())) .bind("IneffAlg"); diff --git a/clang-tools-extra/clang-tidy/misc/MisplacedWideningCastCheck.cpp b/clang-tools-extra/clang-tidy/misc/MisplacedWideningCastCheck.cpp index 101c0a1267d..7919258e650 100644 --- a/clang-tools-extra/clang-tidy/misc/MisplacedWideningCastCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/MisplacedWideningCastCheck.cpp @@ -37,10 +37,11 @@ void MisplacedWideningCastCheck::registerMatchers(MatchFinder *Finder) { hasType(isInteger())) .bind("Calc"); - const auto ExplicitCast = - explicitCastExpr(hasDestinationType(isInteger()), has(Calc)); + const auto ExplicitCast = explicitCastExpr(hasDestinationType(isInteger()), + has(ignoringParenImpCasts(Calc))); const auto ImplicitCast = - implicitCastExpr(hasImplicitDestinationType(isInteger()), has(Calc)); + implicitCastExpr(hasImplicitDestinationType(isInteger()), + has(ignoringParenImpCasts(Calc))); const auto Cast = expr(anyOf(ExplicitCast, ImplicitCast)).bind("Cast"); Finder->addMatcher(varDecl(hasInitializer(Cast)), this); diff --git a/clang-tools-extra/clang-tidy/misc/SizeofContainerCheck.cpp b/clang-tools-extra/clang-tidy/misc/SizeofContainerCheck.cpp index d591e46181d..188d28ae2c4 100644 --- a/clang-tools-extra/clang-tidy/misc/SizeofContainerCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/SizeofContainerCheck.cpp @@ -20,12 +20,12 @@ namespace misc { void SizeofContainerCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher( expr(unless(isInTemplateInstantiation()), - expr(sizeOfExpr(has( + expr(sizeOfExpr(has(ignoringParenImpCasts( expr(hasType(hasCanonicalType(hasDeclaration(cxxRecordDecl( matchesName("^(::std::|::string)"), unless(matchesName("^::std::(bitset|array)$")), hasMethod(cxxMethodDecl(hasName("size"), isPublic(), - isConst())))))))))) + isConst()))))))))))) .bind("sizeof"), // Ignore ARRAYSIZE(<array of containers>) pattern. unless(hasAncestor(binaryOperator( diff --git a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp b/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp index e310e322a6f..ea40b2cfc39 100644 --- a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp @@ -81,21 +81,23 @@ void SizeofExpressionCheck::registerMatchers(MatchFinder *Finder) { const auto SizeOfExpr = expr(anyOf(sizeOfExpr(has(type())), sizeOfExpr(has(expr())))); const auto SizeOfZero = expr( - sizeOfExpr(has(expr(ignoringParenImpCasts(integerLiteral(equals(0))))))); + sizeOfExpr(has(ignoringParenImpCasts(expr(integerLiteral(equals(0))))))); // Detect expression like: sizeof(ARRAYLEN); // Note: The expression 'sizeof(sizeof(0))' is a portable trick used to know // the sizeof size_t. if (WarnOnSizeOfConstant) { - Finder->addMatcher(expr(sizeOfExpr(has(ConstantExpr)), unless(SizeOfZero)) - .bind("sizeof-constant"), - this); + Finder->addMatcher( + expr(sizeOfExpr(has(ignoringParenImpCasts(ConstantExpr))), + unless(SizeOfZero)) + .bind("sizeof-constant"), + this); } // Detect expression like: sizeof(this); if (WarnOnSizeOfThis) { Finder->addMatcher( - expr(sizeOfExpr(has(expr(ignoringParenImpCasts(cxxThisExpr()))))) + expr(sizeOfExpr(has(ignoringParenImpCasts(expr(cxxThisExpr()))))) .bind("sizeof-this"), this); } @@ -105,12 +107,12 @@ void SizeofExpressionCheck::registerMatchers(MatchFinder *Finder) { const auto ConstStrLiteralDecl = varDecl(isDefinition(), hasType(qualType(hasCanonicalType(CharPtrType))), hasInitializer(ignoringParenImpCasts(stringLiteral()))); - Finder->addMatcher( - expr(sizeOfExpr(has(expr(hasType(qualType(hasCanonicalType(CharPtrType))), - ignoringParenImpCasts(declRefExpr( - hasDeclaration(ConstStrLiteralDecl))))))) - .bind("sizeof-charp"), - this); + Finder->addMatcher(expr(sizeOfExpr(has(ignoringParenImpCasts(expr( + hasType(qualType(hasCanonicalType(CharPtrType))), + ignoringParenImpCasts(declRefExpr( + hasDeclaration(ConstStrLiteralDecl)))))))) + .bind("sizeof-charp"), + this); // Detect sizeof(ptr) where ptr points to an aggregate (i.e. sizeof(&S)). const auto ArrayExpr = expr(ignoringParenImpCasts( @@ -188,10 +190,11 @@ void SizeofExpressionCheck::registerMatchers(MatchFinder *Finder) { // Detect strange double-sizeof expression like: sizeof(sizeof(...)); // Note: The expression 'sizeof(sizeof(0))' is accepted. - Finder->addMatcher(expr(sizeOfExpr(has(expr(hasSizeOfDescendant( - 8, expr(SizeOfExpr, unless(SizeOfZero))))))) - .bind("sizeof-sizeof-expr"), - this); + Finder->addMatcher( + expr(sizeOfExpr(has(ignoringParenImpCasts(expr( + hasSizeOfDescendant(8, expr(SizeOfExpr, unless(SizeOfZero)))))))) + .bind("sizeof-sizeof-expr"), + this); } void SizeofExpressionCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp index 39eb7896a4e..6a7dc6cb565 100644 --- a/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/StaticAssertCheck.cpp @@ -33,12 +33,13 @@ void StaticAssertCheck::registerMatchers(MatchFinder *Finder) { if (!(getLangOpts().CPlusPlus11 || getLangOpts().C11)) return; - auto IsAlwaysFalse = expr(ignoringParenImpCasts( + auto IsAlwaysFalse = expr(anyOf(cxxBoolLiteral(equals(false)), integerLiteral(equals(0)), cxxNullPtrLiteralExpr(), gnuNullExpr())) - .bind("isAlwaysFalse"))); + .bind("isAlwaysFalse"); auto IsAlwaysFalseWithCast = ignoringParenImpCasts(anyOf( - IsAlwaysFalse, cStyleCastExpr(has(IsAlwaysFalse)).bind("castExpr"))); + IsAlwaysFalse, cStyleCastExpr(has(ignoringParenImpCasts(IsAlwaysFalse))) + .bind("castExpr"))); auto AssertExprRoot = anyOf( binaryOperator( anyOf(hasOperatorName("&&"), hasOperatorName("==")), diff --git a/clang-tools-extra/clang-tidy/misc/SuspiciousMissingCommaCheck.cpp b/clang-tools-extra/clang-tidy/misc/SuspiciousMissingCommaCheck.cpp index be983aa9233..3881a1f404e 100644 --- a/clang-tools-extra/clang-tidy/misc/SuspiciousMissingCommaCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/SuspiciousMissingCommaCheck.cpp @@ -88,7 +88,7 @@ void SuspiciousMissingCommaCheck::registerMatchers(MatchFinder *Finder) { const auto StringsInitializerList = initListExpr(hasType(constantArrayType()), - has(expr(ignoringImpCasts(ConcatenatedStringLiteral)))); + has(ignoringParenImpCasts(expr(ConcatenatedStringLiteral)))); Finder->addMatcher(StringsInitializerList.bind("list"), this); } diff --git a/clang-tools-extra/clang-tidy/misc/SuspiciousStringCompareCheck.cpp b/clang-tools-extra/clang-tidy/misc/SuspiciousStringCompareCheck.cpp index f364d118095..9315ff5fb2f 100644 --- a/clang-tools-extra/clang-tidy/misc/SuspiciousStringCompareCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/SuspiciousStringCompareCheck.cpp @@ -156,8 +156,9 @@ void SuspiciousStringCompareCheck::registerMatchers(MatchFinder *Finder) { // Detect comparison to invalid constant: 'strcmp() == -1'. const auto InvalidLiteral = ignoringParenImpCasts( anyOf(integerLiteral(unless(equals(0))), - unaryOperator(hasOperatorName("-"), - has(integerLiteral(unless(equals(0))))), + unaryOperator( + hasOperatorName("-"), + has(ignoringParenImpCasts(integerLiteral(unless(equals(0)))))), characterLiteral(), cxxBoolLiteral())); Finder->addMatcher(binaryOperator(matchers::isComparisonOperator(), diff --git a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp index 75d927bcd9b..51c23964ecb 100644 --- a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp @@ -56,8 +56,8 @@ void UnconventionalAssignOperatorCheck::registerMatchers(ast_matchers::MatchFind cxxMethodDecl(IsSelfAssign, anyOf(isConst(), isVirtual())).bind("cv"), this); - const auto IsBadReturnStatement = returnStmt(unless(has( - unaryOperator(hasOperatorName("*"), hasUnaryOperand(cxxThisExpr()))))); + const auto IsBadReturnStatement = returnStmt(unless(has(ignoringParenImpCasts( + unaryOperator(hasOperatorName("*"), hasUnaryOperand(cxxThisExpr())))))); const auto IsGoodAssign = cxxMethodDecl(IsAssign, HasGoodReturnType); Finder->addMatcher(returnStmt(IsBadReturnStatement, forFunction(IsGoodAssign)) diff --git a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp index 32916d13445..9d500697f1a 100644 --- a/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp @@ -30,13 +30,13 @@ void UniqueptrResetReleaseCheck::registerMatchers(MatchFinder *Finder) { cxxMethodDecl(hasName("reset"), ofClass(cxxRecordDecl(hasName("::std::unique_ptr"), decl().bind("left_class"))))), - has(cxxMemberCallExpr( + has(ignoringParenImpCasts(cxxMemberCallExpr( on(expr().bind("right")), callee(memberExpr().bind("release_member")), callee(cxxMethodDecl( hasName("release"), ofClass(cxxRecordDecl(hasName("::std::unique_ptr"), - decl().bind("right_class")))))))) + decl().bind("right_class"))))))))) .bind("reset_call"), this); } diff --git a/clang-tools-extra/clang-tidy/misc/UnusedRAIICheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedRAIICheck.cpp index a1fac9f7e50..1786627d127 100644 --- a/clang-tools-extra/clang-tidy/misc/UnusedRAIICheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnusedRAIICheck.cpp @@ -33,13 +33,16 @@ void UnusedRAIICheck::registerMatchers(MatchFinder *Finder) { // Look for temporaries that are constructed in-place and immediately // destroyed. Look for temporaries created by a functional cast but not for // those returned from a call. - auto BindTemp = cxxBindTemporaryExpr(unless(has(callExpr()))).bind("temp"); + auto BindTemp = + cxxBindTemporaryExpr(unless(has(ignoringParenImpCasts(callExpr())))) + .bind("temp"); Finder->addMatcher( - exprWithCleanups( - unless(isInTemplateInstantiation()), - hasParent(compoundStmt().bind("compound")), - hasType(cxxRecordDecl(hasNonTrivialDestructor())), - anyOf(has(BindTemp), has(cxxFunctionalCastExpr(has(BindTemp))))) + exprWithCleanups(unless(isInTemplateInstantiation()), + hasParent(compoundStmt().bind("compound")), + hasType(cxxRecordDecl(hasNonTrivialDestructor())), + anyOf(has(ignoringParenImpCasts(BindTemp)), + has(ignoringParenImpCasts(cxxFunctionalCastExpr( + has(ignoringParenImpCasts(BindTemp))))))) .bind("expr"), this); } |