diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitializationCheck.h')
| -rw-r--r-- | clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitializationCheck.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitializationCheck.h b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitializationCheck.h new file mode 100644 index 0000000..89957a5 --- /dev/null +++ b/clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitializationCheck.h @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARYCOPYINITIALIZATIONCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARYCOPYINITIALIZATIONCHECK_H + +#include "../ClangTidyCheck.h" +#include "clang/AST/Decl.h" + +namespace clang::tidy::performance { + +// The check detects local variable declarations that are copy initialized with +// the const reference of a function call or the const reference of a method +// call whose object is guaranteed to outlive the variable's scope and suggests +// to use a const reference. +// +// The check currently only understands a subset of variables that are +// guaranteed to outlive the const reference returned, namely: const variables, +// const references, and const pointers to const. +// +// For the user-facing documentation see: +// https://clang.llvm.org/extra/clang-tidy/checks/performance/unnecessary-copy-initialization.html +class UnnecessaryCopyInitializationCheck : public ClangTidyCheck { +public: + UnnecessaryCopyInitializationCheck(StringRef Name, ClangTidyContext *Context); + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return LangOpts.CPlusPlus; + } + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + +protected: + // A helper to manipulate the state common to + // `CopyFromMethodReturn` and `CopyFromLocalVar`. + struct CheckContext { + const VarDecl &Var; + const Stmt &BlockStmt; + const DeclStmt &VarDeclStmt; + clang::ASTContext &ASTCtx; + const bool IssueFix; + const bool IsVarUnused; + const bool IsVarOnlyUsedAsConst; + }; + + // Create diagnostics. These are virtual so that derived classes can change + // behaviour. + virtual void diagnoseCopyFromMethodReturn(const CheckContext &Ctx); + virtual void diagnoseCopyFromLocalVar(const CheckContext &Ctx, + const VarDecl &OldVar); + +private: + void handleCopyFromMethodReturn(const CheckContext &Ctx, + const VarDecl *ObjectArg); + void handleCopyFromLocalVar(const CheckContext &Ctx, const VarDecl &OldVar); + + void maybeIssueFixes(const CheckContext &Ctx, DiagnosticBuilder &Diagnostic); + + const std::vector<StringRef> AllowedTypes; + const std::vector<StringRef> ExcludedContainerTypes; +}; + +} // namespace clang::tidy::performance + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARYCOPYINITIALIZATIONCHECK_H |
