diff options
| author | Samuel Benzaquen <sbenza@google.com> | 2015-10-19 21:49:51 +0000 |
|---|---|---|
| committer | Samuel Benzaquen <sbenza@google.com> | 2015-10-19 21:49:51 +0000 |
| commit | daef16319972310b4803eb09bc62e502f695e3bb (patch) | |
| tree | 20f365956c1b175f008d1ad4e4bcabb512c28059 /clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp | |
| parent | d77de6495ec73d7d38b0f2e564bfa65fe7eb64db (diff) | |
| download | bcm5719-llvm-daef16319972310b4803eb09bc62e502f695e3bb.tar.gz bcm5719-llvm-daef16319972310b4803eb09bc62e502f695e3bb.zip | |
Added check uniqueptr-delete-release to replace "delete x.release()" with "x = nullptr"
Reviewers: alexfh
Differential Revision: http://reviews.llvm.org/D13179
llvm-svn: 250742
Diffstat (limited to 'clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp')
| -rw-r--r-- | clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp b/clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp new file mode 100644 index 00000000000..8a1ca4c16ce --- /dev/null +++ b/clang-tools-extra/clang-tidy/readability/UniqueptrDeleteReleaseCheck.cpp @@ -0,0 +1,69 @@ +//===--- UniqueptrDeleteReleaseCheck.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 "UniqueptrDeleteReleaseCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Lex/Lexer.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { + +void UniqueptrDeleteReleaseCheck::registerMatchers(MatchFinder *Finder) { + auto IsSusbstituted = qualType(anyOf( + substTemplateTypeParmType(), hasDescendant(substTemplateTypeParmType()))); + + auto UniquePtrWithDefaultDelete = classTemplateSpecializationDecl( + hasName("std::unique_ptr"), + hasTemplateArgument(1, refersToType(qualType(hasDeclaration(cxxRecordDecl( + hasName("std::default_delete"))))))); + + Finder->addMatcher( + cxxDeleteExpr( + has(cxxMemberCallExpr(on(expr(hasType(UniquePtrWithDefaultDelete), + unless(hasType(IsSusbstituted))) + .bind("uptr")), + callee(cxxMethodDecl(hasName("release")))))) + .bind("delete"), + this); +} + +void UniqueptrDeleteReleaseCheck::check( + const MatchFinder::MatchResult &Result) { + const auto *PtrExpr = Result.Nodes.getNodeAs<Expr>("uptr"); + const auto *DeleteExpr = Result.Nodes.getNodeAs<Expr>("delete"); + + if (PtrExpr->getLocStart().isMacroID()) + return; + + // Ignore dependent types. + // It can give us false positives, so we go with false negatives instead to + // be safe. + if (PtrExpr->getType()->isDependentType()) + return; + + SourceLocation AfterPtr = + Lexer::getLocForEndOfToken(PtrExpr->getLocEnd(), 0, *Result.SourceManager, + Result.Context->getLangOpts()); + + diag(DeleteExpr->getLocStart(), + "prefer '= nullptr' to 'delete x.release()' to reset unique_ptr<> " + "objects") + << FixItHint::CreateRemoval(CharSourceRange::getCharRange( + DeleteExpr->getLocStart(), PtrExpr->getLocStart())) + << FixItHint::CreateReplacement( + CharSourceRange::getTokenRange(AfterPtr, DeleteExpr->getLocEnd()), + " = nullptr"); +} + +} // namespace tidy +} // namespace clang + |

