Blackhart updated this revision to Diff 204758.
Blackhart added a comment.
Herald added a subscriber: jsji.

Add missing "override" keywords


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63324/new/

https://reviews.llvm.org/D63324

Files:
  clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
  clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceMemcpyByStdCopy.h
  mypatch.patch

Index: mypatch.patch
===================================================================
--- /dev/null
+++ mypatch.patch
@@ -0,0 +1,378 @@
+commit 62ee7f02e1e236f75226337e1057a4e42f72dfb7
+Author: Thomas Manceau <thomas.manc...@pixee-medical.com>
+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<AvoidBindCheck>("modernize-avoid-bind");
+     CheckFactories.registerCheck<AvoidCArraysCheck>("modernize-avoid-c-arrays");
+     CheckFactories.registerCheck<ConcatNestedNamespacesCheck>(
+         "modernize-concat-nested-namespaces");
+     CheckFactories.registerCheck<DeprecatedHeadersCheck>(
+         "modernize-deprecated-headers");
+     CheckFactories.registerCheck<DeprecatedIosBaseAliasesCheck>(
+         "modernize-deprecated-ios-base-aliases");
+     CheckFactories.registerCheck<LoopConvertCheck>("modernize-loop-convert");
+     CheckFactories.registerCheck<MakeSharedCheck>("modernize-make-shared");
+     CheckFactories.registerCheck<MakeUniqueCheck>("modernize-make-unique");
+     CheckFactories.registerCheck<PassByValueCheck>("modernize-pass-by-value");
+     CheckFactories.registerCheck<RawStringLiteralCheck>(
+         "modernize-raw-string-literal");
+     CheckFactories.registerCheck<RedundantVoidArgCheck>(
+         "modernize-redundant-void-arg");
+     CheckFactories.registerCheck<ReplaceAutoPtrCheck>(
+         "modernize-replace-auto-ptr");
++    CheckFactories.registerCheck<ReplaceMemcpyByStdCopy>(
++        "modernize-replace-memcpy-by-stdcopy");
+     CheckFactories.registerCheck<ReplaceRandomShuffleCheck>(
+         "modernize-replace-random-shuffle");
+     CheckFactories.registerCheck<ReturnBracedInitListCheck>(
+         "modernize-return-braced-init-list");
+     CheckFactories.registerCheck<ShrinkToFitCheck>("modernize-shrink-to-fit");
+     CheckFactories.registerCheck<UnaryStaticAssertCheck>(
+         "modernize-unary-static-assert");
+     CheckFactories.registerCheck<UseAutoCheck>("modernize-use-auto");
+     CheckFactories.registerCheck<UseBoolLiteralsCheck>(
+         "modernize-use-bool-literals");
+     CheckFactories.registerCheck<UseDefaultMemberInitCheck>(
+         "modernize-use-default-member-init");
+     CheckFactories.registerCheck<UseEmplaceCheck>("modernize-use-emplace");
+     CheckFactories.registerCheck<UseEqualsDefaultCheck>("modernize-use-equals-default");
+     CheckFactories.registerCheck<UseEqualsDeleteCheck>(
+         "modernize-use-equals-delete");
+     CheckFactories.registerCheck<UseNodiscardCheck>(
+         "modernize-use-nodiscard");
+     CheckFactories.registerCheck<UseNoexceptCheck>("modernize-use-noexcept");
+     CheckFactories.registerCheck<UseNullptrCheck>("modernize-use-nullptr");
+     CheckFactories.registerCheck<UseOverrideCheck>("modernize-use-override");
+     CheckFactories.registerCheck<UseTrailingReturnTypeCheck>(
+         "modernize-use-trailing-return-type");
+     CheckFactories.registerCheck<UseTransparentFunctorsCheck>(
+         "modernize-use-transparent-functors");
+     CheckFactories.registerCheck<UseUncaughtExceptionsCheck>(
+         "modernize-use-uncaught-exceptions");
+     CheckFactories.registerCheck<UseUsingCheck>("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<ModernizeModule> 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<utils::IncludeInserter>(SM, getLangOpts(),
++                                                       IncludeStyle);
++  PP->addPPCallbacks(Inserter->CreatePPCallbacks());
++}
++
++void ReplaceMemcpyByStdCopy::check(const MatchFinder::MatchResult &Result) {
++  const auto *MemcpyNode = Result.Nodes.getNodeAs<CallExpr>("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 <memory>
++#include <string>
++#include <vector>
++
++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<utils::IncludeInserter> 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.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 <memory>
+#include <string>
+#include <vector>
+
+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<utils::IncludeInserter> 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<utils::IncludeInserter>(SM, getLangOpts(),
+                                                       IncludeStyle);
+  PP->addPPCallbacks(Inserter->CreatePPCallbacks());
+}
+
+void ReplaceMemcpyByStdCopy::check(const MatchFinder::MatchResult &Result) {
+  const auto *MemcpyNode = Result.Nodes.getNodeAs<CallExpr>("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: 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<ReplaceAutoPtrCheck>(
         "modernize-replace-auto-ptr");
+    CheckFactories.registerCheck<ReplaceMemcpyByStdCopy>(
+        "modernize-replace-memcpy-by-stdcopy");
     CheckFactories.registerCheck<ReplaceRandomShuffleCheck>(
         "modernize-replace-random-shuffle");
     CheckFactories.registerCheck<ReturnBracedInitListCheck>(
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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to