17 void BoolPointerImplicitConversionCheck::registerMatchers(MatchFinder *Finder) {
22 ast_type_traits::TK_AsIs,
23 ifStmt(hasCondition(findAll(implicitCastExpr(
24 unless(hasParent(unaryOperator(hasOperatorName(
"!")))),
25 hasSourceExpression(expr(
26 hasType(pointerType(pointee(booleanType()))),
27 ignoringParenImpCasts(declRefExpr().bind(
"expr")))),
28 hasCastKind(CK_PointerToBoolean)))),
29 unless(isInTemplateInstantiation()))
34 void BoolPointerImplicitConversionCheck::check(
35 const MatchFinder::MatchResult &Result) {
36 auto *If = Result.Nodes.getNodeAs<IfStmt>(
"if");
37 auto *Var = Result.Nodes.getNodeAs<DeclRefExpr>(
"expr");
40 if (Var->getBeginLoc().isMacroID())
48 const Decl *D = Var->getDecl();
49 auto DeclRef = ignoringParenImpCasts(declRefExpr(to(equalsNode(D))));
51 unaryOperator(hasOperatorName(
"*"), hasUnaryOperand(
DeclRef))),
54 !
match(findAll(arraySubscriptExpr(hasBase(
DeclRef))), *If,
59 !
match(findAll(callExpr(hasAnyArgument(ignoringParenImpCasts(
DeclRef)))),
62 !
match(findAll(cxxDeleteExpr(has(ignoringParenImpCasts(expr(
DeclRef))))),
67 diag(Var->getBeginLoc(),
"dubious check of 'bool *' against 'nullptr', did "
68 "you mean to dereference it?")
69 << FixItHint::CreateInsertion(Var->getBeginLoc(),
"*");