//===--- BoolPointerImplicitConversionCheck.cpp - clang-tidy --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "BoolPointerImplicitConversionCheck.h"

using namespace clang::ast_matchers;

namespace clang {
namespace tidy {
namespace bugprone {

void BoolPointerImplicitConversionCheck::registerMatchers(MatchFinder *Finder) {
  // Look for ifs that have an implicit bool* to bool conversion in the
  // condition. Filter negations.
  Finder->addMatcher(
      traverse(
          ast_type_traits::TK_AsIs,
          ifStmt(
              hasCondition(findAll(implicitCastExpr(
                  unless(hasParent(unaryOperator(hasOperatorName("!")))),
                  hasSourceExpression(expr(
                      hasType(pointerType(pointee(booleanType()))),
                      ignoringParenImpCasts(anyOf(declRefExpr().bind("expr"),
                                                  memberExpr().bind("expr"))))),
                  hasCastKind(CK_PointerToBoolean)))),
              unless(isInTemplateInstantiation()))
              .bind("if")),
      this);
}

static void checkImpl(const MatchFinder::MatchResult &Result, const Expr *Ref,
                      const IfStmt *If,
                      const ast_matchers::internal::Matcher<Expr> &RefMatcher,
                      ClangTidyCheck &Check) {
  // Ignore macros.
  if (Ref->getBeginLoc().isMacroID())
    return;

  // Only allow variable accesses and member exprs for now, no function calls.
  // Check that we don't dereference the variable anywhere within the if. This
  // avoids false positives for checks of the pointer for nullptr before it is
  // dereferenced. If there is a dereferencing operator on this variable don't
  // emit a diagnostic. Also ignore array subscripts.
  if (!match(findAll(unaryOperator(hasOperatorName("*"),
                                   hasUnaryOperand(RefMatcher))),
             *If, *Result.Context)
           .empty() ||
      !match(findAll(arraySubscriptExpr(hasBase(RefMatcher))), *If,
             *Result.Context)
           .empty() ||
      // FIXME: We should still warn if the paremater is implicitly converted to
      // bool.
      !match(
           findAll(callExpr(hasAnyArgument(ignoringParenImpCasts(RefMatcher)))),
           *If, *Result.Context)
           .empty() ||
      !match(
           findAll(cxxDeleteExpr(has(ignoringParenImpCasts(expr(RefMatcher))))),
           *If, *Result.Context)
           .empty())
    return;

  Check.diag(Ref->getBeginLoc(),
             "dubious check of 'bool *' against 'nullptr', did "
             "you mean to dereference it?")
      << FixItHint::CreateInsertion(Ref->getBeginLoc(), "*");
}

void BoolPointerImplicitConversionCheck::check(
    const MatchFinder::MatchResult &Result) {
  const auto *If = Result.Nodes.getNodeAs<IfStmt>("if");
  if (const auto *E = Result.Nodes.getNodeAs<Expr>("expr")) {
    const Decl *D = isa<DeclRefExpr>(E) ? cast<DeclRefExpr>(E)->getDecl()
                                        : cast<MemberExpr>(E)->getMemberDecl();
    const auto M =
        ignoringParenImpCasts(anyOf(declRefExpr(to(equalsNode(D))),
                                    memberExpr(hasDeclaration(equalsNode(D)))));
    checkImpl(Result, E, If, M, *this);
  }
}

} // namespace bugprone
} // namespace tidy
} // namespace clang
