diff options
author | Alexander Kornienko <alexfh@google.com> | 2015-03-09 11:48:54 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2015-03-09 11:48:54 +0000 |
commit | 5b982e539d5c50ddd1d407e60e9b8051502c4a37 (patch) | |
tree | 6c2d808bbbf0e8284f3761362daf63a610765e77 /clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp | |
parent | ef24b4171d8a2ce8eb626014301912746fc7cd16 (diff) | |
download | bcm5719-llvm-5b982e539d5c50ddd1d407e60e9b8051502c4a37.tar.gz bcm5719-llvm-5b982e539d5c50ddd1d407e60e9b8051502c4a37.zip |
[clang-tidy] Refactor: Rename clang-tidy misc check files and classes to follow naming conventions
Classes are named WhateverCheck, files are named WhateverCheck.cpp and
WhateverCheck.h.
http://reviews.llvm.org/D8145
Patch by Richard Thomson!
llvm-svn: 231648
Diffstat (limited to 'clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp')
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp new file mode 100644 index 00000000000..01313c1a78a --- /dev/null +++ b/clang-tools-extra/clang-tidy/misc/BoolPointerImplicitConversionCheck.cpp @@ -0,0 +1,77 @@ +//===--- BoolPointerImplicitConversionCheck.cpp - clang-tidy --------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "BoolPointerImplicitConversionCheck.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace ast_matchers { + +AST_MATCHER(CastExpr, isPointerToBoolean) { + return Node.getCastKind() == CK_PointerToBoolean; +} +AST_MATCHER(QualType, isBoolean) { return Node->isBooleanType(); } + +} // namespace ast_matchers + +namespace tidy { +namespace misc { + +void BoolPointerImplicitConversionCheck::registerMatchers(MatchFinder *Finder) { + // Look for ifs that have an implicit bool* to bool conversion in the + // condition. Filter negations. + Finder->addMatcher( + ifStmt(hasCondition(findAll(implicitCastExpr( + allOf(unless(hasParent(unaryOperator(hasOperatorName("!")))), + hasSourceExpression(expr( + hasType(pointerType(pointee(isBoolean()))), + ignoringParenImpCasts(declRefExpr().bind("expr")))), + isPointerToBoolean())))), + unless(isInTemplateInstantiation())).bind("if"), + this); +} + +void BoolPointerImplicitConversionCheck::check( + const MatchFinder::MatchResult &Result) { + auto *If = Result.Nodes.getStmtAs<IfStmt>("if"); + auto *Var = Result.Nodes.getStmtAs<DeclRefExpr>("expr"); + + // Ignore macros. + if (Var->getLocStart().isMacroID()) + return; + + // Only allow variable accesses for now, no function calls or member exprs. + // 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. + const Decl *D = Var->getDecl(); + auto DeclRef = ignoringParenImpCasts(declRefExpr(to(equalsNode(D)))); + if (!match(findAll( + unaryOperator(hasOperatorName("*"), hasUnaryOperand(DeclRef))), + *If, *Result.Context).empty() || + !match(findAll(arraySubscriptExpr(hasBase(DeclRef))), *If, + *Result.Context).empty() || + // FIXME: We should still warn if the paremater is implicitly converted to + // bool. + !match(findAll(callExpr(hasAnyArgument(DeclRef))), *If, *Result.Context) + .empty() || + !match(findAll(deleteExpr(has(expr(DeclRef)))), *If, *Result.Context) + .empty()) + return; + + diag(Var->getLocStart(), "dubious check of 'bool *' against 'nullptr', did " + "you mean to dereference it?") + << FixItHint::CreateInsertion(Var->getLocStart(), "*"); +} + +} // namespace misc +} // namespace tidy +} // namespace clang |