xref: /llvm-project/clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.h (revision 4718da506091a37ca4863d979bc541e359b79b10)
15aebfe2eSAlexander Kornienko //===--- ForRangeCopyCheck.h - clang-tidy------------------------*- C++ -*-===//
25aebfe2eSAlexander Kornienko //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65aebfe2eSAlexander Kornienko //
75aebfe2eSAlexander Kornienko //===----------------------------------------------------------------------===//
85aebfe2eSAlexander Kornienko 
95aebfe2eSAlexander Kornienko #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FORRANGECOPYCHECK_H
105aebfe2eSAlexander Kornienko #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FORRANGECOPYCHECK_H
115aebfe2eSAlexander Kornienko 
12478fc5c8SAlexander Kornienko #include "../ClangTidyCheck.h"
135aebfe2eSAlexander Kornienko 
14*4718da50SCarlos Galvez namespace clang::tidy::performance {
155aebfe2eSAlexander Kornienko 
165aebfe2eSAlexander Kornienko /// A check that detects copied loop variables and suggests using const
175aebfe2eSAlexander Kornienko /// references.
185aebfe2eSAlexander Kornienko /// For the user-facing documentation see:
196e566bc5SRichard /// http://clang.llvm.org/extra/clang-tidy/checks/performance/for-range-copy.html
205aebfe2eSAlexander Kornienko class ForRangeCopyCheck : public ClangTidyCheck {
215aebfe2eSAlexander Kornienko public:
225aebfe2eSAlexander Kornienko   ForRangeCopyCheck(StringRef Name, ClangTidyContext *Context);
isLanguageVersionSupported(const LangOptions & LangOpts)23bfd99be0SNathan James   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override{
24bfd99be0SNathan James     return LangOpts.CPlusPlus11;
25bfd99be0SNathan James   }
265aebfe2eSAlexander Kornienko   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
275aebfe2eSAlexander Kornienko   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
285aebfe2eSAlexander Kornienko   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
295aebfe2eSAlexander Kornienko 
305aebfe2eSAlexander Kornienko private:
315aebfe2eSAlexander Kornienko   // Checks if the loop variable is a const value and expensive to copy. If so
325aebfe2eSAlexander Kornienko   // suggests it be converted to a const reference.
335aebfe2eSAlexander Kornienko   bool handleConstValueCopy(const VarDecl &LoopVar, ASTContext &Context);
345aebfe2eSAlexander Kornienko 
355aebfe2eSAlexander Kornienko   // Checks if the loop variable is a non-const value and whether only
365aebfe2eSAlexander Kornienko   // const methods are invoked on it or whether it is only used as a const
375aebfe2eSAlexander Kornienko   // reference argument. If so it suggests it be made a const reference.
385aebfe2eSAlexander Kornienko   bool handleCopyIsOnlyConstReferenced(const VarDecl &LoopVar,
395aebfe2eSAlexander Kornienko                                        const CXXForRangeStmt &ForRange,
405aebfe2eSAlexander Kornienko                                        ASTContext &Context);
415aebfe2eSAlexander Kornienko 
425aebfe2eSAlexander Kornienko   const bool WarnOnAllAutoCopies;
4312cb5405SNathan James   const std::vector<StringRef> AllowedTypes;
445aebfe2eSAlexander Kornienko };
455aebfe2eSAlexander Kornienko 
46*4718da50SCarlos Galvez } // namespace clang::tidy::performance
475aebfe2eSAlexander Kornienko 
485aebfe2eSAlexander Kornienko #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FORRANGECOPYCHECK_H
49