diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy')
6 files changed, 101 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp index 0cb44f9d1df..d1cb4eb2d9e 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -338,10 +338,9 @@ void ClangTidyDiagnosticConsumer::HandleDiagnostic( Errors.push_back(ClangTidyError(CheckName, Level, IsWarningAsError)); } - // FIXME: Provide correct LangOptions for each file. - LangOptions LangOpts; ClangTidyDiagnosticRenderer Converter( - LangOpts, &Context.DiagEngine->getDiagnosticOptions(), Errors.back()); + Context.getLangOpts(), &Context.DiagEngine->getDiagnosticOptions(), + Errors.back()); SmallString<100> Message; Info.FormatDiagnostic(Message); SourceManager *Sources = nullptr; diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h index 420f8f48af2..cbd376c627f 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h @@ -151,7 +151,7 @@ public: void setASTContext(ASTContext *Context); /// \brief Gets the language options from the AST context. - LangOptions getLangOpts() const { return LangOpts; } + const LangOptions &getLangOpts() const { return LangOpts; } /// \brief Returns the name of the clang-tidy check which produced this /// diagnostic ID. diff --git a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt index 88df0588530..bb56917a388 100644 --- a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt @@ -14,6 +14,7 @@ add_clang_library(clangTidyReadabilityModule RedundantControlFlowCheck.cpp RedundantStringCStrCheck.cpp RedundantSmartptrGetCheck.cpp + RedundantStringInitCheck.cpp SimplifyBooleanExprCheck.cpp UniqueptrDeleteReleaseCheck.cpp diff --git a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp index d2fb21703b0..5803f5f0997 100644 --- a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp @@ -21,6 +21,7 @@ #include "RedundantControlFlowCheck.h" #include "RedundantSmartptrGetCheck.h" #include "RedundantStringCStrCheck.h" +#include "RedundantStringInitCheck.h" #include "SimplifyBooleanExprCheck.h" #include "UniqueptrDeleteReleaseCheck.h" @@ -53,6 +54,8 @@ public: "readability-redundant-smartptr-get"); CheckFactories.registerCheck<RedundantStringCStrCheck>( "readability-redundant-string-cstr"); + CheckFactories.registerCheck<RedundantStringInitCheck>( + "readability-redundant-string-init"); CheckFactories.registerCheck<SimplifyBooleanExprCheck>( "readability-simplify-boolean-expr"); CheckFactories.registerCheck<UniqueptrDeleteReleaseCheck>( diff --git a/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp new file mode 100644 index 00000000000..ad6c2cdd416 --- /dev/null +++ b/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp @@ -0,0 +1,62 @@ +//===- RedundantStringInitCheck.cpp - clang-tidy ----------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "RedundantStringInitCheck.h" +#include "clang/ASTMatchers/ASTMatchers.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace readability { + +namespace { + +AST_MATCHER(StringLiteral, lengthIsZero) { return Node.getLength() == 0; } + +} // namespace + +void RedundantStringInitCheck::registerMatchers(MatchFinder *Finder) { + if (!getLangOpts().CPlusPlus) + return; + + const auto StringCtorExpr = cxxConstructExpr( + hasDeclaration(cxxMethodDecl(hasName("basic_string"))), + argumentCountIs(2), + hasArgument(0, ignoringParenImpCasts(stringLiteral(lengthIsZero()))), + hasArgument(1, cxxDefaultArgExpr())); + + // string foo = ""; + // OR + // string bar(""); + Finder->addMatcher( + namedDecl(varDecl(hasType(cxxRecordDecl(hasName("basic_string"))), + hasInitializer( + expr(anyOf(StringCtorExpr, + exprWithCleanups(has(expr(anyOf( + StringCtorExpr, + cxxConstructExpr(hasArgument( + 0, cxxBindTemporaryExpr(has( + StringCtorExpr)))))))))) + .bind("expr")))) + .bind("decl"), + this); +} + +void RedundantStringInitCheck::check(const MatchFinder::MatchResult &Result) { + const auto *CtorExpr = Result.Nodes.getNodeAs<Expr>("expr"); + const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>("decl"); + diag(CtorExpr->getExprLoc(), "redundant string initialization") + << FixItHint::CreateReplacement(CtorExpr->getSourceRange(), + Decl->getName()); +} + +} // namespace readability +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.h b/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.h new file mode 100644 index 00000000000..0a32eb6defc --- /dev/null +++ b/clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.h @@ -0,0 +1,32 @@ +//===- RedundantStringInitCheck.h - clang-tidy ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_REDUNDANT_STRING_INIT_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_REDUNDANT_STRING_INIT_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace readability { + +/// Finds unnecessary string initializations. +class RedundantStringInitCheck : public ClangTidyCheck { +public: + RedundantStringInitCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace readability +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_REDUNDANT_STRING_INIT_H |

