Index: clang-tools-extra/clang-tidy/modernize/CMakeLists.txt =================================================================== --- clang-tools-extra/clang-tidy/modernize/CMakeLists.txt +++ clang-tools-extra/clang-tidy/modernize/CMakeLists.txt @@ -16,6 +16,7 @@ RawStringLiteralCheck.cpp RedundantVoidArgCheck.cpp ReplaceAutoPtrCheck.cpp + ReplaceMemcpyByStdCopy.cpp ReplaceRandomShuffleCheck.cpp ReturnBracedInitListCheck.cpp ShrinkToFitCheck.cpp Index: clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp =================================================================== --- clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +++ clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp @@ -21,6 +21,7 @@ #include "RawStringLiteralCheck.h" #include "RedundantVoidArgCheck.h" #include "ReplaceAutoPtrCheck.h" +#include "ReplaceMemcpyByStdCopy.h" #include "ReplaceRandomShuffleCheck.h" #include "ReturnBracedInitListCheck.h" #include "ShrinkToFitCheck.h" @@ -67,6 +68,8 @@ "modernize-redundant-void-arg"); CheckFactories.registerCheck( "modernize-replace-auto-ptr"); + CheckFactories.registerCheck( + "modernize-replace-memcpy-by-stdcopy"); CheckFactories.registerCheck( "modernize-replace-random-shuffle"); CheckFactories.registerCheck( Index: clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h =================================================================== --- /dev/null +++ clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h @@ -0,0 +1,49 @@ +//===--- ReplaceMemcpyByStdCopy.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_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H + +#include "../ClangTidyCheck.h" +#include "../utils/IncludeInserter.h" +#include +#include +#include + +namespace clang { +namespace tidy { +namespace modernize { + +/// Replace the C memcpy function by std::copy +class ReplaceMemcpyByStdCopy : public ClangTidyCheck { +public: + ReplaceMemcpyByStdCopy(StringRef Name, ClangTidyContext *Context); + virtual ~ReplaceMemcpyByStdCopy() {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, + Preprocessor *ModuleExpanderPP) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + void storeOptions(ClangTidyOptions::OptionMap &Options) override; + +private: + void renameFunction(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode); + void reorderArgs(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode); + void insertHeader(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode, + SourceManager *const SM); + +private: + std::unique_ptr Inserter; + const utils::IncludeSorter::IncludeStyle IncludeStyle; +}; + +} // namespace modernize +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H \ No newline at end of file Index: clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp =================================================================== --- /dev/null +++ clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp @@ -0,0 +1,119 @@ +//===--- ReplaceMemcpyByStdCopy.cpp - 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 +// +//===----------------------------------------------------------------------===// + +#include "ReplaceMemcpyByStdCopy.h" +#include "../utils/OptionsUtils.h" + +using namespace clang; +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace modernize { + +ReplaceMemcpyByStdCopy::ReplaceMemcpyByStdCopy(StringRef Name, + ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + IncludeStyle(utils::IncludeSorter::parseIncludeStyle( + Options.getLocalOrGlobal("IncludeStyle", "llvm"))) {} + +void ReplaceMemcpyByStdCopy::registerMatchers(MatchFinder *Finder) { + assert(Finder != nullptr); + + if (!getLangOpts().CPlusPlus) + return; + + auto MemcpyMatcher = + callExpr(hasDeclaration(functionDecl(hasName("memcpy"), + isExpansionInSystemHeader())), + isExpansionInMainFile()) + .bind("memcpy_function"); + + Finder->addMatcher(MemcpyMatcher, this); +} + +void ReplaceMemcpyByStdCopy::registerPPCallbacks( + const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { + // Only register the preprocessor callbacks for C++; the functionality + // currently does not provide any benefit to other languages, despite being + // benign. + if (!getLangOpts().CPlusPlus) + return; + + Inserter = llvm::make_unique(SM, getLangOpts(), + IncludeStyle); + PP->addPPCallbacks(Inserter->CreatePPCallbacks()); +} + +void ReplaceMemcpyByStdCopy::check(const MatchFinder::MatchResult &Result) { + const auto *MemcpyNode = Result.Nodes.getNodeAs("memcpy_function"); + assert(MemcpyNode != nullptr); + + auto Diag = diag(MemcpyNode->getExprLoc(), "use std::copy instead of memcpy"); + + renameFunction(Diag, MemcpyNode); + reorderArgs(Diag, MemcpyNode); + insertHeader(Diag, MemcpyNode, Result.SourceManager); +} + +void ReplaceMemcpyByStdCopy::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IncludeStyle", + utils::IncludeSorter::toString(IncludeStyle)); +} + +void ReplaceMemcpyByStdCopy::renameFunction(DiagnosticBuilder &Diag, + const CallExpr *MemcpyNode) { + const auto FunctionNameSourceRange = CharSourceRange::getCharRange( + MemcpyNode->getBeginLoc(), MemcpyNode->getArg(0)->getBeginLoc()); + + Diag << FixItHint::CreateReplacement(FunctionNameSourceRange, "std::copy("); +} + +void ReplaceMemcpyByStdCopy::reorderArgs(DiagnosticBuilder &Diag, + const CallExpr *MemcpyNode) { + std::string arg[3]; + + LangOptions LangOpts; + LangOpts.CPlusPlus = true; + PrintingPolicy Policy(LangOpts); + + // Retrieve all the arguments + for (uint8_t i = 0; i < 3; i++) { + llvm::raw_string_ostream s(arg[i]); + MemcpyNode->getArg(i)->printPretty(s, nullptr, Policy); + } + + // Create lambda that return SourceRange of an argument + auto getSourceRange = [MemcpyNode](uint8_t ArgCount) -> SourceRange { + return SourceRange(MemcpyNode->getArg(ArgCount)->getBeginLoc(), + MemcpyNode->getArg(ArgCount)->getEndLoc()); + }; + + // Reorder the arguments + Diag << FixItHint::CreateReplacement(getSourceRange(0), arg[1]); + + arg[2] = arg[1] + " + ((" + arg[2] + ") / sizeof(*(" + arg[1] + ")))"; + Diag << FixItHint::CreateReplacement(getSourceRange(1), arg[2]); + + Diag << FixItHint::CreateReplacement(getSourceRange(2), arg[0]); +} + +void ReplaceMemcpyByStdCopy::insertHeader(DiagnosticBuilder &Diag, + const CallExpr *MemcpyNode, + SourceManager *const SM) { + auto FixInclude = Inserter->CreateIncludeInsertion( + /*FileID=*/SM->getMainFileID(), /*Header=*/"algorithm", + /*IsAngled=*/true); + if (FixInclude) + Diag << *FixInclude; +} + +} // namespace modernize +} // namespace tidy +} // namespace clang \ No newline at end of file Index: mypatch.patch =================================================================== --- /dev/null +++ mypatch.patch @@ -0,0 +1,378 @@ +commit 62ee7f02e1e236f75226337e1057a4e42f72dfb7 +Author: Thomas Manceau +Date: Wed Jun 12 17:51:14 2019 +0200 + + [clang-tidy] Replace memcpy by std::copy + +diff --git a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt +index 36193f0a6d1..295d1c4a010 100644 +--- a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt ++++ b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt +@@ -1,47 +1,48 @@ + set(LLVM_LINK_COMPONENTS support) + + add_clang_library(clangTidyModernizeModule + AvoidBindCheck.cpp + AvoidCArraysCheck.cpp + ConcatNestedNamespacesCheck.cpp + DeprecatedHeadersCheck.cpp + DeprecatedIosBaseAliasesCheck.cpp + LoopConvertCheck.cpp + LoopConvertUtils.cpp + MakeSharedCheck.cpp + MakeSmartPtrCheck.cpp + MakeUniqueCheck.cpp + ModernizeTidyModule.cpp + PassByValueCheck.cpp + RawStringLiteralCheck.cpp + RedundantVoidArgCheck.cpp + ReplaceAutoPtrCheck.cpp ++ ReplaceMemcpyByStdCopy.cpp + ReplaceRandomShuffleCheck.cpp + ReturnBracedInitListCheck.cpp + ShrinkToFitCheck.cpp + UnaryStaticAssertCheck.cpp + UseAutoCheck.cpp + UseBoolLiteralsCheck.cpp + UseDefaultMemberInitCheck.cpp + UseEmplaceCheck.cpp + UseEqualsDefaultCheck.cpp + UseEqualsDeleteCheck.cpp + UseNodiscardCheck.cpp + UseNoexceptCheck.cpp + UseNullptrCheck.cpp + UseOverrideCheck.cpp + UseTrailingReturnTypeCheck.cpp + UseTransparentFunctorsCheck.cpp + UseUncaughtExceptionsCheck.cpp + UseUsingCheck.cpp + + LINK_LIBS + clangAST + clangASTMatchers + clangBasic + clangLex + clangTidy + clangTidyReadabilityModule + clangTidyUtils + clangTooling + ) +diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +index 6280f9c991e..d665c1c5169 100644 +--- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp ++++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +@@ -1,129 +1,132 @@ + //===--- ModernizeTidyModule.cpp - clang-tidy -----------------------------===// + // + // 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 + // + //===----------------------------------------------------------------------===// + + #include "../ClangTidy.h" + #include "../ClangTidyModule.h" + #include "../ClangTidyModuleRegistry.h" + #include "AvoidBindCheck.h" + #include "AvoidCArraysCheck.h" + #include "ConcatNestedNamespacesCheck.h" + #include "DeprecatedHeadersCheck.h" + #include "DeprecatedIosBaseAliasesCheck.h" + #include "LoopConvertCheck.h" + #include "MakeSharedCheck.h" + #include "MakeUniqueCheck.h" + #include "PassByValueCheck.h" + #include "RawStringLiteralCheck.h" + #include "RedundantVoidArgCheck.h" + #include "ReplaceAutoPtrCheck.h" ++#include "ReplaceMemcpyByStdCopy.h" + #include "ReplaceRandomShuffleCheck.h" + #include "ReturnBracedInitListCheck.h" + #include "ShrinkToFitCheck.h" + #include "UnaryStaticAssertCheck.h" + #include "UseAutoCheck.h" + #include "UseBoolLiteralsCheck.h" + #include "UseDefaultMemberInitCheck.h" + #include "UseEmplaceCheck.h" + #include "UseEqualsDefaultCheck.h" + #include "UseEqualsDeleteCheck.h" + #include "UseNodiscardCheck.h" + #include "UseNoexceptCheck.h" + #include "UseNullptrCheck.h" + #include "UseOverrideCheck.h" + #include "UseTrailingReturnTypeCheck.h" + #include "UseTransparentFunctorsCheck.h" + #include "UseUncaughtExceptionsCheck.h" + #include "UseUsingCheck.h" + + using namespace clang::ast_matchers; + + namespace clang { + namespace tidy { + namespace modernize { + + class ModernizeModule : public ClangTidyModule { + public: + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck("modernize-avoid-bind"); + CheckFactories.registerCheck("modernize-avoid-c-arrays"); + CheckFactories.registerCheck( + "modernize-concat-nested-namespaces"); + CheckFactories.registerCheck( + "modernize-deprecated-headers"); + CheckFactories.registerCheck( + "modernize-deprecated-ios-base-aliases"); + CheckFactories.registerCheck("modernize-loop-convert"); + CheckFactories.registerCheck("modernize-make-shared"); + CheckFactories.registerCheck("modernize-make-unique"); + CheckFactories.registerCheck("modernize-pass-by-value"); + CheckFactories.registerCheck( + "modernize-raw-string-literal"); + CheckFactories.registerCheck( + "modernize-redundant-void-arg"); + CheckFactories.registerCheck( + "modernize-replace-auto-ptr"); ++ CheckFactories.registerCheck( ++ "modernize-replace-memcpy-by-stdcopy"); + CheckFactories.registerCheck( + "modernize-replace-random-shuffle"); + CheckFactories.registerCheck( + "modernize-return-braced-init-list"); + CheckFactories.registerCheck("modernize-shrink-to-fit"); + CheckFactories.registerCheck( + "modernize-unary-static-assert"); + CheckFactories.registerCheck("modernize-use-auto"); + CheckFactories.registerCheck( + "modernize-use-bool-literals"); + CheckFactories.registerCheck( + "modernize-use-default-member-init"); + CheckFactories.registerCheck("modernize-use-emplace"); + CheckFactories.registerCheck("modernize-use-equals-default"); + CheckFactories.registerCheck( + "modernize-use-equals-delete"); + CheckFactories.registerCheck( + "modernize-use-nodiscard"); + CheckFactories.registerCheck("modernize-use-noexcept"); + CheckFactories.registerCheck("modernize-use-nullptr"); + CheckFactories.registerCheck("modernize-use-override"); + CheckFactories.registerCheck( + "modernize-use-trailing-return-type"); + CheckFactories.registerCheck( + "modernize-use-transparent-functors"); + CheckFactories.registerCheck( + "modernize-use-uncaught-exceptions"); + CheckFactories.registerCheck("modernize-use-using"); + } + + ClangTidyOptions getModuleOptions() override { + ClangTidyOptions Options; + auto &Opts = Options.CheckOptions; + // For types whose size in bytes is above this threshold, we prefer taking a + // const-reference than making a copy. + Opts["modernize-loop-convert.MaxCopySize"] = "16"; + + Opts["modernize-loop-convert.MinConfidence"] = "reasonable"; + Opts["modernize-loop-convert.NamingStyle"] = "CamelCase"; + Opts["modernize-pass-by-value.IncludeStyle"] = "llvm"; // Also: "google". + Opts["modernize-replace-auto-ptr.IncludeStyle"] = "llvm"; // Also: "google". + + // Comma-separated list of macros that behave like NULL. + Opts["modernize-use-nullptr.NullMacros"] = "NULL"; + return Options; + } + }; + + // Register the ModernizeTidyModule using this statically initialized variable. + static ClangTidyModuleRegistry::Add X("modernize-module", + "Add modernize checks."); + + } // namespace modernize + + // This anchor is used to force the linker to link in the generated object file + // and thus register the ModernizeModule. + volatile int ModernizeModuleAnchorSource = 0; + + } // namespace tidy + } // namespace clang +diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp b/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp +new file mode 100644 +index 00000000000..5589994b22d +--- /dev/null ++++ b/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp +@@ -0,0 +1,119 @@ ++//===--- ReplaceMemcpyByStdCopy.cpp - 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 ++// ++//===----------------------------------------------------------------------===// ++ ++#include "ReplaceMemcpyByStdCopy.h" ++#include "../utils/OptionsUtils.h" ++ ++using namespace clang; ++using namespace clang::ast_matchers; ++ ++namespace clang { ++namespace tidy { ++namespace modernize { ++ ++ReplaceMemcpyByStdCopy::ReplaceMemcpyByStdCopy(StringRef Name, ++ ClangTidyContext *Context) ++ : ClangTidyCheck(Name, Context), ++ IncludeStyle(utils::IncludeSorter::parseIncludeStyle( ++ Options.getLocalOrGlobal("IncludeStyle", "llvm"))) {} ++ ++void ReplaceMemcpyByStdCopy::registerMatchers(MatchFinder *Finder) { ++ assert(Finder != nullptr); ++ ++ if (!getLangOpts().CPlusPlus) ++ return; ++ ++ auto MemcpyMatcher = ++ callExpr(hasDeclaration(functionDecl(hasName("memcpy"), ++ isExpansionInSystemHeader())), ++ isExpansionInMainFile()) ++ .bind("memcpy_function"); ++ ++ Finder->addMatcher(MemcpyMatcher, this); ++} ++ ++void ReplaceMemcpyByStdCopy::registerPPCallbacks( ++ const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { ++ // Only register the preprocessor callbacks for C++; the functionality ++ // currently does not provide any benefit to other languages, despite being ++ // benign. ++ if (!getLangOpts().CPlusPlus) ++ return; ++ ++ Inserter = llvm::make_unique(SM, getLangOpts(), ++ IncludeStyle); ++ PP->addPPCallbacks(Inserter->CreatePPCallbacks()); ++} ++ ++void ReplaceMemcpyByStdCopy::check(const MatchFinder::MatchResult &Result) { ++ const auto *MemcpyNode = Result.Nodes.getNodeAs("memcpy_function"); ++ assert(MemcpyNode != nullptr); ++ ++ auto Diag = diag(MemcpyNode->getExprLoc(), "use std::copy instead of memcpy"); ++ ++ renameFunction(Diag, MemcpyNode); ++ reorderArgs(Diag, MemcpyNode); ++ insertHeader(Diag, MemcpyNode, Result.SourceManager); ++} ++ ++void ReplaceMemcpyByStdCopy::storeOptions(ClangTidyOptions::OptionMap &Opts) { ++ Options.store(Opts, "IncludeStyle", ++ utils::IncludeSorter::toString(IncludeStyle)); ++} ++ ++void ReplaceMemcpyByStdCopy::renameFunction(DiagnosticBuilder &Diag, ++ const CallExpr *MemcpyNode) { ++ const auto FunctionNameSourceRange = CharSourceRange::getCharRange( ++ MemcpyNode->getBeginLoc(), MemcpyNode->getArg(0)->getBeginLoc()); ++ ++ Diag << FixItHint::CreateReplacement(FunctionNameSourceRange, "std::copy("); ++} ++ ++void ReplaceMemcpyByStdCopy::reorderArgs(DiagnosticBuilder &Diag, ++ const CallExpr *MemcpyNode) { ++ std::string arg[3]; ++ ++ LangOptions LangOpts; ++ LangOpts.CPlusPlus = true; ++ PrintingPolicy Policy(LangOpts); ++ ++ // Retrieve all the arguments ++ for (uint8_t i = 0; i < 3; i++) { ++ llvm::raw_string_ostream s(arg[i]); ++ MemcpyNode->getArg(i)->printPretty(s, nullptr, Policy); ++ } ++ ++ // Create lambda that return SourceRange of an argument ++ auto getSourceRange = [MemcpyNode](uint8_t ArgCount) -> SourceRange { ++ return SourceRange(MemcpyNode->getArg(ArgCount)->getBeginLoc(), ++ MemcpyNode->getArg(ArgCount)->getEndLoc()); ++ }; ++ ++ // Reorder the arguments ++ Diag << FixItHint::CreateReplacement(getSourceRange(0), arg[1]); ++ ++ arg[2] = arg[1] + " + ((" + arg[2] + ") / sizeof(*(" + arg[1] + ")))"; ++ Diag << FixItHint::CreateReplacement(getSourceRange(1), arg[2]); ++ ++ Diag << FixItHint::CreateReplacement(getSourceRange(2), arg[0]); ++} ++ ++void ReplaceMemcpyByStdCopy::insertHeader(DiagnosticBuilder &Diag, ++ const CallExpr *MemcpyNode, ++ SourceManager *const SM) { ++ auto FixInclude = Inserter->CreateIncludeInsertion( ++ /*FileID=*/SM->getMainFileID(), /*Header=*/"algorithm", ++ /*IsAngled=*/true); ++ if (FixInclude) ++ Diag << *FixInclude; ++} ++ ++} // namespace modernize ++} // namespace tidy ++} // namespace clang +\ No newline at end of file +diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h b/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h +new file mode 100644 +index 00000000000..06011e93305 +--- /dev/null ++++ b/clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h +@@ -0,0 +1,49 @@ ++//===--- ReplaceMemcpyByStdCopy.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_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H ++#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H ++ ++#include "../ClangTidyCheck.h" ++#include "../utils/IncludeInserter.h" ++#include ++#include ++#include ++ ++namespace clang { ++namespace tidy { ++namespace modernize { ++ ++/// Replace the C memcpy function by std::copy ++class ReplaceMemcpyByStdCopy : public ClangTidyCheck { ++public: ++ ReplaceMemcpyByStdCopy(StringRef Name, ClangTidyContext *Context); ++ virtual ~ReplaceMemcpyByStdCopy() {} ++ void registerMatchers(ast_matchers::MatchFinder *Finder) override; ++ void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, ++ Preprocessor *ModuleExpanderPP) override; ++ void check(const ast_matchers::MatchFinder::MatchResult &Result) override; ++ void storeOptions(ClangTidyOptions::OptionMap &Options); ++ ++private: ++ void renameFunction(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode); ++ void reorderArgs(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode); ++ void insertHeader(DiagnosticBuilder &Diag, const CallExpr *MemcpyNode, ++ SourceManager *const SM); ++ ++private: ++ std::unique_ptr Inserter; ++ const utils::IncludeSorter::IncludeStyle IncludeStyle; ++}; ++ ++} // namespace modernize ++} // namespace tidy ++} // namespace clang ++ ++#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_MEMCPY_BY_STDCOPY_H +\ No newline at end of file