
Add string list option of type names analagous to `AllowedTypes` which lets users specify a list of ExcludedContainerTypes. Types matching this list will not trigger the check when an expensive variable is copy initialized from a const accessor method they provide, i.e.: ``` ExcludedContainerTypes = 'ExcludedType' void foo() { ExcludedType<ExpensiveToCopy> Container; const ExpensiveToCopy NecessaryCopy = Container.get(); } ``` Even though an expensive to copy variable is copy initialized the check does not trigger because the container type is excluded. This is useful for container types that don't own their data, such as view types where modification of the returned references in other places cannot be reliably tracked, or const incorrect types. Differential Revision: https://reviews.llvm.org/D106173 Reviewed-by: ymandel
54 lines
2.3 KiB
C++
54 lines
2.3 KiB
C++
//===--- UnnecessaryCopyInitialization.h - clang-tidy------------*- C++ -*-===//
|
|
//
|
|
// 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_UNNECESSARY_COPY_INITIALIZATION_H
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_COPY_INITIALIZATION_H
|
|
|
|
#include "../ClangTidyCheck.h"
|
|
#include "clang/AST/Decl.h"
|
|
|
|
namespace clang {
|
|
namespace tidy {
|
|
namespace 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.
|
|
class UnnecessaryCopyInitialization : public ClangTidyCheck {
|
|
public:
|
|
UnnecessaryCopyInitialization(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;
|
|
|
|
private:
|
|
void handleCopyFromMethodReturn(const VarDecl &Var, const Stmt &BlockStmt,
|
|
const DeclStmt &Stmt, bool IssueFix,
|
|
const VarDecl *ObjectArg,
|
|
ASTContext &Context);
|
|
void handleCopyFromLocalVar(const VarDecl &NewVar, const VarDecl &OldVar,
|
|
const Stmt &BlockStmt, const DeclStmt &Stmt,
|
|
bool IssueFix, ASTContext &Context);
|
|
const std::vector<std::string> AllowedTypes;
|
|
const std::vector<std::string> ExcludedContainerTypes;
|
|
};
|
|
|
|
} // namespace performance
|
|
} // namespace tidy
|
|
} // namespace clang
|
|
|
|
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_COPY_INITIALIZATION_H
|